From 982a94e97eff85b053558fac7c0442726a091f11 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sun, 8 Sep 2019 14:29:27 +0200 Subject: import: github: Fix incorrect no-release case. This is a followup to 81c3dc32244a17241d74eea9fa265edfcb326f6d. Since that commit, when /releases returned an empty JSON array, we would not fall back to /tags because of the incorrect match. * guix/import/github.scm (fetch-releases-or-tags): Match the empty vector instead of the empty list. --- guix/import/github.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'guix/import') diff --git a/guix/import/github.scm b/guix/import/github.scm index 55e1f72a42..55ea00a111 100644 --- a/guix/import/github.scm +++ b/guix/import/github.scm @@ -161,7 +161,7 @@ empty list." url)) (match (json-fetch (decorate release-url) #:headers headers) - (() + (#() ;; We got the empty list, presumably because the user didn't use GitHub's ;; "release" mechanism, but hopefully they did use Git tags. (json-fetch (decorate tag-url) #:headers headers)) -- cgit v1.2.3 From fd63ecbe050bf8fa7c8ff0a003d56cce97b6ded1 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 9 Sep 2019 11:36:04 -0400 Subject: import: crate: Allow imports of a specific version. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * guix/import/crate.scm (crate->guix-package): Add optional 'version' argument and honor it. * guix/scripts/import/crate.scm (guix-import-crate): Assume the first argument is a spec and destructure it with 'package-name->name+version'. Pass both to 'crate->guix-package'. * doc/guix.texi (Invoking guix import): Document it. Co-authored-by: Ludovic Courtès --- doc/guix.texi | 12 +++++++++++- guix/import/crate.scm | 29 +++++++++++++++++++---------- guix/scripts/import/crate.scm | 13 ++++++++++--- 3 files changed, 40 insertions(+), 14 deletions(-) (limited to 'guix/import') diff --git a/doc/guix.texi b/doc/guix.texi index 9101aafda1..989b3d03bb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -8912,7 +8912,17 @@ in Guix. @item crate @cindex crate Import metadata from the crates.io Rust package repository -@uref{https://crates.io, crates.io}. +@uref{https://crates.io, crates.io}, as in this example: + +@example +guix import crate blake2-rfc +@end example + +The crate importer also allows you to specify a version string: + +@example +guix import crate constant-time-eq@@0.1.0 +@end example @item opam @cindex OPAM diff --git a/guix/import/crate.scm b/guix/import/crate.scm index f6057dbf8b..fd1974eae8 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019 Ludovic Courtès +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -181,9 +182,11 @@ and LICENSE." ;; This regexp matches that. (make-regexp "^(.*) OR (.*)$")) -(define (crate->guix-package crate-name) +(define* (crate->guix-package crate-name #:optional version) "Fetch the metadata for CRATE-NAME from crates.io, and return the -`package' s-expression corresponding to that package, or #f on failure." +`package' s-expression corresponding to that package, or #f on failure. +When VERSION is specified, attempt to fetch that version; otherwise fetch the +latest version of CRATE-NAME." (define (string->license string) (match (regexp-exec %dual-license-rx string) (#f (list (spdx-string->license string))) @@ -196,12 +199,18 @@ and LICENSE." (define crate (lookup-crate crate-name)) - (and crate - (let* ((version (find (lambda (version) - (string=? (crate-version-number version) - (crate-latest-version crate))) - (crate-versions crate))) - (dependencies (crate-version-dependencies version)) + (define version-number + (or version + (crate-latest-version crate))) + + (define version* + (find (lambda (version) + (string=? (crate-version-number version) + version-number)) + (crate-versions crate))) + + (and crate version* + (let* ((dependencies (crate-version-dependencies version*)) (dep-crates (filter normal-dependency? dependencies)) (dev-dep-crates (remove normal-dependency? dependencies)) (cargo-inputs (sort (map crate-dependency-id dep-crates) @@ -210,14 +219,14 @@ and LICENSE." (sort (map crate-dependency-id dev-dep-crates) string-ci (crate-version-license version) + #:license (and=> (crate-version-license version*) string->license))))) (define (guix-package->crate-name package) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index cab9a4397b..7ae8638911 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,6 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -75,6 +76,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (alist-cons 'argument arg result)) %default-options)) + (let* ((opts (parse-options)) (args (filter-map (match-lambda (('argument . value) @@ -82,11 +84,16 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (_ #f)) (reverse opts)))) (match args - ((package-name) - (let ((sexp (crate->guix-package package-name))) + ((spec) + (define-values (name version) + (package-name->name+version spec)) + + (let ((sexp (crate->guix-package name version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") - package-name)) + (if version + (string-append name "@" version) + name))) sexp)) (() (leave (G_ "too few arguments~%"))) -- cgit v1.2.3 From d1dce0c3638a577a2ab713d2551f4aabe67d031c Mon Sep 17 00:00:00 2001 From: Hartmut Goebel Date: Tue, 3 Sep 2019 14:16:03 +0200 Subject: upstream: Move KDE updater into a separate module. As it was done for (guix import gnome). * guix/import/kde.scm: New file. * Makefile.am (MODULES): Add it. * guix/gnu-maintenance.scm (%kde-updater) (%kde-file-list-uri) (download.kde.org-files) (latest-kde-release): Remove. --- Makefile.am | 1 + guix/gnu-maintenance.scm | 102 ------------------------------ guix/import/kde.scm | 158 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 102 deletions(-) create mode 100644 guix/import/kde.scm (limited to 'guix/import') diff --git a/Makefile.am b/Makefile.am index 683b2242f0..7e3b5c1070 100644 --- a/Makefile.am +++ b/Makefile.am @@ -221,6 +221,7 @@ MODULES = \ guix/import/gnu.scm \ guix/import/hackage.scm \ guix/import/json.scm \ + guix/import/kde.scm \ guix/import/launchpad.scm \ guix/import/opam.scm \ guix/import/print.scm \ diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm index 9ce06508a3..ef067704ad 100644 --- a/guix/gnu-maintenance.scm +++ b/guix/gnu-maintenance.scm @@ -1,7 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; Copyright © 2012, 2013 Nikita Karetnikov -;;; Copyright © 2019 Hartmut Goebel ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,7 +24,6 @@ #:use-module (sxml simple) #:use-module (ice-9 regex) #:use-module (ice-9 match) - #:use-module (ice-9 rdelim) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) @@ -64,7 +62,6 @@ %gnu-updater %gnu-ftp-updater - %kde-updater %xorg-updater %kernel.org-updater)) @@ -615,98 +612,6 @@ releases are on gnu.org." (define gnu-hosted? (url-prefix-predicate "mirror://gnu/")) -(define %kde-file-list-uri - ;; URI of the file list (ls -lR format) for download.kde.org. - (string->uri "https://download.kde.org/ls-lR.bz2")) - -(define (download.kde.org-files) - ;;"Return the list of files available at download.kde.org." - - (define (ls-lR-line->filename path line) - ;; remove mode, blocks, user, group, size, date, time and one space - (regexp-substitute - #f (string-match "^(\\S+\\s+){6}\\S+\\s" line) path 'post)) - - (define (canonicalize path) - (let* ((path (if (string-prefix? "/srv/archives/ftp/" path) - (string-drop path (string-length "/srv/archives/ftp")) - path)) - (path (if (string-suffix? ":" path) - (string-drop-right path 1) - path)) - (path (if (not (string-suffix? "/" path)) - (string-append path "/") - path))) - path)) - - (define (write-cache input cache) - "Read bzipped ls-lR from INPUT, and write it as a list of file paths to -CACHE." - - (call-with-decompressed-port 'bzip2 input - (lambda (input) - (let loop_dirs ((files '())) - (let ((path (read-line input))) - (if - (or (eof-object? path) (string= path "")) - (write (reverse files) cache)) - (let loop_entries ((path (canonicalize path)) - (files files)) - (let ((line (read-line input))) - (cond - ((eof-object? line) - (write (reverse files) cache)) - ((string-prefix? "-" line) - (loop_entries path - (cons (ls-lR-line->filename path line) files))) - ((not (string= line "")) - (loop_entries path files)) - (#t (loop_dirs files)))))))))) - - (define (cache-miss uri) - (format (current-error-port) "fetching ~a...~%" (uri->string uri))) - - (let* ((port (http-fetch/cached %kde-file-list-uri - #:ttl 3600 - #:write-cache write-cache - #:cache-miss cache-miss)) - (files (read port))) - (close-port port) - files)) - -(define (latest-kde-release package) - "Return the latest release of PACKAGE, a KDE package, or #f if it could not -be determined." - (let* ((uri (string->uri (origin-uri (package-source package)))) - (directory (dirname (dirname (uri-path uri)))) - (name (package-upstream-name package)) - (files (download.kde.org-files)) - (relevant (filter (lambda (file) - (and (string-prefix? directory file) - (release-file? name (basename file)))) - files))) - (match (sort relevant (lambda (file1 file2) - (version>? (tarball-sans-extension - (basename file1)) - (tarball-sans-extension - (basename file2))))) - ((and tarballs (reference _ ...)) - (let* ((version (tarball->version reference)) - (tarballs (filter (lambda (file) - (string=? (tarball-sans-extension - (basename file)) - (tarball-sans-extension - (basename reference)))) - tarballs))) - (upstream-source - (package name) - (version version) - (urls (map (lambda (file) - (string-append "mirror://kde/" file)) - tarballs))))) - (() - #f)))) - (define (latest-xorg-release package) "Return the latest release of PACKAGE, the name of an X.org package." (let ((uri (string->uri (origin-uri (package-source package))))) @@ -754,13 +659,6 @@ be determined." (pure-gnu-package? package)))) (latest latest-release*))) -(define %kde-updater - (upstream-updater - (name 'kde) - (description "Updater for KDE packages") - (pred (url-prefix-predicate "mirror://kde/")) - (latest latest-kde-release))) - (define %xorg-updater (upstream-updater (name 'xorg) diff --git a/guix/import/kde.scm b/guix/import/kde.scm new file mode 100644 index 0000000000..927ecc8263 --- /dev/null +++ b/guix/import/kde.scm @@ -0,0 +1,158 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Craven +;;; Copyright © 2016, 2017 Ludovic Courtès +;;; Copyright © 2019 Hartmut Goebel +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix import kde) + #:use-module (guix http-client) + #:use-module (guix memoization) + #:use-module (guix gnu-maintenance) + #:use-module (guix packages) + #:use-module (guix upstream) + #:use-module (guix utils) + #:use-module (ice-9 match) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 regex) + #:use-module (srfi srfi-11) + #:use-module (web uri) + + #:export (%kde-updater)) + +;;; Commentary: +;;; +;;; This package provides not an actual importer but simply an updater for +;;; KDE packages. It grabs available files from the 'ls-lR.bz2' file +;;; available on download.kde.org. +;;; +;;; Code: + +(define (tarball->version tarball) + "Return the version TARBALL corresponds to. TARBALL is a file name like +\"coreutils-8.23.tar.xz\"." + (let-values (((name version) + (gnu-package-name->name+version + (tarball-sans-extension tarball)))) + version)) + +(define %kde-file-list-uri + ;; URI of the file list (ls -lR format) for download.kde.org. + (string->uri "https://download.kde.org/ls-lR.bz2")) + +(define (download.kde.org-files) + ;;"Return the list of files available at download.kde.org." + + (define (ls-lR-line->filename path line) + ;; Remove mode, blocks, user, group, size, date, time and one space, + ;; then prepend PATH + (regexp-substitute + #f (string-match "^(\\S+\\s+){6}\\S+\\s" line) path 'post)) + + (define (canonicalize path) + (let* ((path (if (string-prefix? "/srv/archives/ftp/" path) + (string-drop path (string-length "/srv/archives/ftp")) + path)) + (path (if (string-suffix? ":" path) + (string-drop-right path 1) + path)) + (path (if (not (string-suffix? "/" path)) + (string-append path "/") + path))) + path)) + + (define (write-cache input cache) + "Read bzipped ls-lR from INPUT, and write it as a list of file paths to +CACHE." + (call-with-decompressed-port 'bzip2 input + (lambda (input) + (let loop_dirs ((files '())) + ;; process a new directory block + (let ((path (read-line input))) + (if + (or (eof-object? path) (string= path "")) + (write (reverse files) cache) + (let loop_entries ((path (canonicalize path)) + (files files)) + ;; process entries within the directory block + (let ((line (read-line input))) + (cond + ((eof-object? line) + (write (reverse files) cache)) + ((string-prefix? "-" line) + ;; this is a file entry: prepend to FILES, then re-enter + ;; the loop for remaining entries + (loop_entries path + (cons (ls-lR-line->filename path line) files) + )) + ((not (string= line "")) + ;; this is a non-file entry: ignore it, just re-enter the + ;; loop for remaining entries + (loop_entries path files)) + ;; empty line: directory block end, re-enter the outer + ;; loop for the next block + (#t (loop_dirs files))))))))))) + + (define (cache-miss uri) + (format (current-error-port) "fetching ~a...~%" (uri->string uri))) + + (let* ((port (http-fetch/cached %kde-file-list-uri + #:ttl 3600 + #:write-cache write-cache + #:cache-miss cache-miss)) + (files (read port))) + (close-port port) + files)) + +(define (latest-kde-release package) + "Return the latest release of PACKAGE, a KDE package, or #f if it could +not be determined." + (let* ((uri (string->uri (origin-uri (package-source package)))) + (directory (dirname (dirname (uri-path uri)))) + (name (package-upstream-name package)) + (files (download.kde.org-files)) + (relevant (filter (lambda (file) + (and (string-prefix? directory file) + (release-file? name (basename file)))) + files))) + (match (sort relevant (lambda (file1 file2) + (version>? (tarball-sans-extension + (basename file1)) + (tarball-sans-extension + (basename file2))))) + ((and tarballs (reference _ ...)) + (let* ((version (tarball->version reference)) + (tarballs (filter (lambda (file) + (string=? (tarball-sans-extension + (basename file)) + (tarball-sans-extension + (basename reference)))) + tarballs))) + (upstream-source + (package name) + (version version) + (urls (map (lambda (file) + (string-append "mirror://kde/" file)) + tarballs))))) + (() + #f)))) + +(define %kde-updater + (upstream-updater + (name 'kde) + (description "Updater for KDE packages") + (pred (url-prefix-predicate "mirror://kde/")) + (latest latest-kde-release))) -- cgit v1.2.3 From 4eb69bf0d33810886ee118f38989cef696e4c868 Mon Sep 17 00:00:00 2001 From: Hartmut Goebel Date: Sun, 4 Aug 2019 11:32:39 +0200 Subject: import: KDE updater finds packages even in sub-directory. Fixes and finally fixes . Formerly packages living in a path like /stable/frameworks/5.60/portingAids/kross-5.60.0.tar.xz have not been found. * guix/import/kde.scm (uri->kde-path-pattern): New procedure. (latest-kde-release): Use pattern to search for file. --- guix/import/kde.scm | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'guix/import') diff --git a/guix/import/kde.scm b/guix/import/kde.scm index 927ecc8263..6873418d62 100644 --- a/guix/import/kde.scm +++ b/guix/import/kde.scm @@ -117,15 +117,47 @@ CACHE." (close-port port) files)) +(define (uri->kde-path-pattern uri) + "Build a regexp from the package's URI suitable for matching the package +path version-agnostic. + +Example: +Input: + mirror://kde//stable/frameworks/5.55/portingAids/kross-5.55.0.zip +Output: + //stable/frameworks/[^/]+/portingAids/ +" + + (define version-regexp + ;; regexp for matching versions as used in the ld-lR file + (make-regexp + (string-join '("^([0-9]+\\.)+[0-9]+-?" ;; 5.12.90, 4.2.0-preview + "^[0-9]+$" ;; 20031002 + ".*-([0-9]+\\.)+[0-9]+$") ;; kdepim-4.6.1 + "|"))) + + (define (version->pattern part) + ;; If a path element might be a version, replace it by a catch-all part + (if (regexp-exec version-regexp part) + "[^/]+" + part)) + + (let* ((path (uri-path uri)) + (directory-parts (string-split (dirname path) #\/))) + (make-regexp + (string-append + (string-join (map version->pattern directory-parts) "/") + "/")))) + (define (latest-kde-release package) "Return the latest release of PACKAGE, a KDE package, or #f if it could not be determined." (let* ((uri (string->uri (origin-uri (package-source package)))) - (directory (dirname (dirname (uri-path uri)))) + (path-rx (uri->kde-path-pattern uri)) (name (package-upstream-name package)) (files (download.kde.org-files)) (relevant (filter (lambda (file) - (and (string-prefix? directory file) + (and (regexp-exec path-rx file) (release-file? name (basename file)))) files))) (match (sort relevant (lambda (file1 file2) -- cgit v1.2.3 From 6e377b88930226f3f74ba9fac74d80c36494d9be Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sat, 14 Sep 2019 00:36:51 +0200 Subject: import/utils: beautify-description: Recognize more fragments. * guix/import/utils.scm (beautify-description): Handle additional common initial sentence fragments in descriptions. --- guix/import/utils.scm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'guix/import') diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 252875eeab..4694b6e7ef 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -212,10 +212,19 @@ with dashes." (define (beautify-description description) "Improve the package DESCRIPTION by turning a beginning sentence fragment into a proper sentence and by using two spaces between sentences." - (let ((cleaned (if (string-prefix? "A " description) - (string-append "This package provides a" - (substring description 1)) - description))) + (let ((cleaned (cond + ((string-prefix? "A " description) + (string-append "This package provides a" + (substring description 1))) + ((string-prefix? "Provides " description) + (string-append "This package provides" + (substring description + (string-length "Provides")))) + ((string-prefix? "Functions " description) + (string-append "This package provides functions" + (substring description + (string-length "Functions")))) + (else description)))) ;; Use double spacing between sentences (regexp-substitute/global #f "\\. \\b" cleaned 'pre ". " 'post))) -- cgit v1.2.3 From 76c0b608219cc1f58decbd85f4a8194337f0558d Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Mon, 16 Sep 2019 11:16:40 +0200 Subject: import/cran: Export %bioconductor-version. * guix/import/cran.scm (%bioconductor-version): Export it. --- guix/import/cran.scm | 1 + 1 file changed, 1 insertion(+) (limited to 'guix/import') diff --git a/guix/import/cran.scm b/guix/import/cran.scm index 35caa3e463..e47aff2b12 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -49,6 +49,7 @@ cran-recursive-import %cran-updater %bioconductor-updater + %bioconductor-version cran-package? bioconductor-package? -- cgit v1.2.3