summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
Diffstat (limited to 'guix')
-rw-r--r--guix/build-system/ocaml.scm27
-rw-r--r--guix/build/kconfig.scm30
-rw-r--r--guix/gnu-maintenance.scm185
-rw-r--r--guix/import/cpan.scm32
-rw-r--r--guix/import/cran.scm27
-rw-r--r--guix/import/crate.scm10
-rw-r--r--guix/import/egg.scm10
-rw-r--r--guix/import/elpa.scm11
-rw-r--r--guix/import/gem.scm7
-rw-r--r--guix/import/git.scm39
-rw-r--r--guix/import/github.scm36
-rw-r--r--guix/import/gnome.scm47
-rw-r--r--guix/import/gnu.scm2
-rw-r--r--guix/import/hackage.scm12
-rw-r--r--guix/import/hexpm.scm9
-rw-r--r--guix/import/kde.scm61
-rw-r--r--guix/import/launchpad.scm10
-rw-r--r--guix/import/minetest.scm12
-rw-r--r--guix/import/opam.scm11
-rw-r--r--guix/import/pypi.scm14
-rw-r--r--guix/import/stackage.scm10
-rw-r--r--guix/packages.scm36
-rw-r--r--guix/pki.scm8
-rw-r--r--guix/read-print.scm2
-rw-r--r--guix/records.scm9
-rw-r--r--guix/scripts/refresh.scm49
-rw-r--r--guix/scripts/shell.scm5
-rw-r--r--guix/scripts/system.scm5
-rw-r--r--guix/store/deduplication.scm7
-rw-r--r--guix/ui.scm1
-rw-r--r--guix/upstream.scm25
31 files changed, 500 insertions, 249 deletions
diff --git a/guix/build-system/ocaml.scm b/guix/build-system/ocaml.scm
index 5ced9d243b..b08985cd4d 100644
--- a/guix/build-system/ocaml.scm
+++ b/guix/build-system/ocaml.scm
@@ -32,6 +32,8 @@
strip-ocaml4.07-variant
package-with-ocaml4.09
strip-ocaml4.09-variant
+ package-with-ocaml5.0
+ strip-ocaml5.0-variant
default-findlib
default-ocaml
lower
@@ -111,6 +113,18 @@
(let ((module (resolve-interface '(gnu packages ocaml))))
(module-ref module 'ocaml4.09-dune)))
+(define (default-ocaml5.0)
+ (let ((ocaml (resolve-interface '(gnu packages ocaml))))
+ (module-ref ocaml 'ocaml-5.0)))
+
+(define (default-ocaml5.0-findlib)
+ (let ((module (resolve-interface '(gnu packages ocaml))))
+ (module-ref module 'ocaml5.0-findlib)))
+
+(define (default-ocaml5.0-dune)
+ (let ((module (resolve-interface '(gnu packages ocaml))))
+ (module-ref module 'ocaml5.0-dune)))
+
(define* (package-with-explicit-ocaml ocaml findlib dune old-prefix new-prefix
#:key variant-property)
"Return a procedure of one argument, P. The procedure creates a package
@@ -199,6 +213,19 @@ pre-defined variants."
(inherit p)
(properties (alist-delete 'ocaml4.09-variant (package-properties p)))))
+(define package-with-ocaml5.0
+ (package-with-explicit-ocaml (delay (default-ocaml5.0))
+ (delay (default-ocaml5.0-findlib))
+ (delay (default-ocaml5.0-dune))
+ "ocaml-" "ocaml5.0-"
+ #:variant-property 'ocaml5.0-variant))
+
+(define (strip-ocaml5.0-variant p)
+ "Remove the 'ocaml5.0-variant' property from P."
+ (package
+ (inherit p)
+ (properties (alist-delete 'ocaml5.0-variant (package-properties p)))))
+
(define* (lower name
#:key source inputs native-inputs outputs system target
(ocaml (default-ocaml))
diff --git a/guix/build/kconfig.scm b/guix/build/kconfig.scm
index d0189f558f..0c9ef6baff 100644
--- a/guix/build/kconfig.scm
+++ b/guix/build/kconfig.scm
@@ -31,6 +31,16 @@
;;
;; Code:
+(define (pair->config-string pair)
+ "Convert a PAIR back to a config-string."
+ (let* ((key (first pair))
+ (value (cdr pair)))
+ (if (string? key)
+ (if (string? value)
+ (string-append key "=" value)
+ (string-append "# " key " is not set"))
+ value)))
+
(define (config-string->pair config-string)
"Parse a configuration string like \"CONFIG_EXAMPLE=m\" into a key-value pair.
An error is thrown for invalid configurations.
@@ -77,16 +87,6 @@ An error is thrown for invalid configurations.
(cons #f config-string) ;keep valid comments
(error "Invalid configuration" config-string)))))
-(define (pair->config-string pair)
- "Convert a PAIR back to a config-string."
- (let* ((key (first pair))
- (value (cdr pair)))
- (if (string? key)
- (if (string? value)
- (string-append key "=" value)
- (string-append "# " key " is not set"))
- value)))
-
(define (defconfig->alist defconfig)
"Convert the content of a DEFCONFIG (or .config) file into an alist."
(with-input-from-file defconfig
@@ -102,10 +102,10 @@ An error is thrown for invalid configurations.
;; The search for duplicates is done.
;; Return the alist or throw an error on duplicates.
(if (null? duplicates)
- alist
+ (reverse alist)
(error
(format #f "duplicate configurations in ~a" defconfig)
- duplicates))
+ (reverse duplicates)))
;; Continue the search for duplicates.
(loop (cdr keys)
(if (member (first keys) (cdr keys))
@@ -133,10 +133,8 @@ DEFCONFIG:
\"CONFIG_F\")
Instead of a list, CONFIGS can be a string with one configuration per line."
- (let* (;; Split the configs into a list of single configurations. Both a
- ;; string and or a list of strings is supported, each with newlines
- ;; to separate configurations.
- (config-pairs (map config-string->pair
+ ;; Normalize CONFIGS to a list of configuration pairs.
+ (let* ((config-pairs (map config-string->pair
(append-map (cut string-split <> #\newline)
(if (string? configs)
(list configs)
diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm
index 2881a6be43..8e60e52ea0 100644
--- a/guix/gnu-maintenance.scm
+++ b/guix/gnu-maintenance.scm
@@ -37,6 +37,8 @@
#:autoload (guix download) (%mirrors)
#:use-module (guix ftp-client)
#:use-module (guix utils)
+ #:use-module (guix diagnostics)
+ #:use-module (guix i18n)
#:use-module (guix memoization)
#:use-module (guix records)
#:use-module (guix upstream)
@@ -64,7 +66,7 @@
release-file?
releases
- latest-release
+ import-release
gnu-release-archive-types
gnu-package-name->name+version
@@ -331,14 +333,17 @@ name/directory pairs."
files)
result)))))))
-(define* (latest-ftp-release project
+(define* (import-ftp-release project
#:key
+ (version #f)
(server "ftp.gnu.org")
(directory (string-append "/gnu/" project))
(file->signature (cut string-append <> ".sig")))
"Return an <upstream-source> for the latest release of PROJECT on SERVER
-under DIRECTORY, or #f. Use FTP-OPEN and FTP-CLOSE to open (resp. close) FTP
-connections; this can be useful to reuse connections.
+under DIRECTORY, or #f. Optionally include a VERSION string to fetch a specific version.
+
+Use FTP-OPEN and FTP-CLOSE to open (resp. close) FTP connections; this can be
+useful to reuse connections.
FILE->SIGNATURE must be a procedure; it is passed a source file URL and must
return the corresponding signature URL, or #f it signatures are unavailable."
@@ -405,8 +410,12 @@ return the corresponding signature URL, or #f it signatures are unavailable."
;; Assume that SUBDIRS correspond to versions, and jump into the
;; one with the highest version number.
- (let* ((release (reduce latest-release #f
- (coalesce-sources releases)))
+ (let* ((release (if version
+ (find (lambda (upstream)
+ (string=? (upstream-source-version upstream) version))
+ (coalesce-sources releases))
+ (reduce latest-release #f
+ (coalesce-sources releases))))
(result (if (and result release)
(latest-release release result)
(or release result)))
@@ -418,13 +427,16 @@ return the corresponding signature URL, or #f it signatures are unavailable."
(ftp-close conn)
result))))))
-(define* (latest-release package
+(define* (import-release package
#:key
+ (version #f)
(server "ftp.gnu.org")
(directory (string-append "/gnu/" package)))
"Return the <upstream-source> for the latest version of PACKAGE or #f.
-PACKAGE must be the canonical name of a GNU package."
- (latest-ftp-release package
+PACKAGE must be the canonical name of a GNU package. Optionally include a
+VERSION string to fetch a specific version."
+ (import-ftp-release package
+ #:version version
#:server server
#:directory directory))
@@ -440,14 +452,15 @@ of EXP otherwise."
(close-port port))
#f)))
-(define (latest-release* package)
- "Like 'latest-release', but (1) take a <package> object, and (2) ignore FTP
+(define* (import-release* package #:key (version #f))
+ "Like 'import-release', but (1) take a <package> object, and (2) ignore FTP
errors that might occur when PACKAGE is not actually a GNU package, or not
hosted on ftp.gnu.org, or not under that name (this is the case for
\"emacs-auctex\", for instance.)"
(let-values (((server directory)
(ftp-server/directory package)))
- (false-if-ftp-error (latest-release (package-upstream-name package)
+ (false-if-ftp-error (import-release (package-upstream-name package)
+ #:version version
#:server server
#:directory directory))))
@@ -472,14 +485,18 @@ hosted on ftp.gnu.org, or not under that name (this is the case for
(_
links))))
-(define* (latest-html-release package
+(define* (import-html-release package
#:key
+ (version #f)
(base-url "https://kernel.org/pub")
(directory (string-append "/" package))
file->signature)
"Return an <upstream-source> for the latest release of PACKAGE (a string) on
-SERVER under DIRECTORY, or #f. BASE-URL should be the URL of an HTML page,
-typically a directory listing as found on 'https://kernel.org/pub'.
+SERVER under DIRECTORY, or #f. Optionally include a VERSION string to fetch a
+specific version.
+
+BASE-URL should be the URL of an HTML page, typically a directory listing as
+found on 'https://kernel.org/pub'.
When FILE->SIGNATURE is omitted or #f, guess the detached signature file name,
if any. Otherwise, FILE->SIGNATURE must be a procedure; it is passed a source
@@ -552,13 +569,18 @@ are unavailable."
(match candidates
(() #f)
((first . _)
- ;; Select the most recent release and return it.
- (reduce (lambda (r1 r2)
- (if (version>? (upstream-source-version r1)
- (upstream-source-version r2))
- r1 r2))
- first
- (coalesce-sources candidates))))))
+ (if version
+ ;; find matching release version and return it
+ (find (lambda (upstream)
+ (string=? (upstream-source-version upstream) version))
+ (coalesce-sources candidates))
+ ;; Select the most recent release and return it.
+ (reduce (lambda (r1 r2)
+ (if (version>? (upstream-source-version r1)
+ (upstream-source-version r2))
+ r1 r2))
+ first
+ (coalesce-sources candidates)))))))
;;;
@@ -590,9 +612,9 @@ are unavailable."
(call-with-gzip-input-port port
(compose string->lines get-string-all))))))
-(define (latest-gnu-release package)
+(define* (import-gnu-release package #:key (version #f))
"Return the latest release of PACKAGE, a GNU package available via
-ftp.gnu.org.
+ftp.gnu.org. Optionally include a VERSION string to fetch a specific version.
This method does not rely on FTP access at all; instead, it browses the file
list available from %GNU-FILE-LIST-URI over HTTP(S)."
@@ -602,42 +624,50 @@ list available from %GNU-FILE-LIST-URI over HTTP(S)."
(define (better-tarball? tarball1 tarball2)
(string=? (file-extension tarball1) archive-type))
+ (define (find-latest-tarball-version tarballs)
+ (fold (lambda (file1 file2)
+ (if (and file2
+ (version>? (tarball-sans-extension (basename file2))
+ (tarball-sans-extension (basename file1))))
+ file2
+ file1))
+ #f
+ tarballs))
+
(let-values (((server directory)
(ftp-server/directory package))
((name)
(package-upstream-name package)))
(let* ((files (ftp.gnu.org-files))
+ ;; select tarballs for this package
(relevant (filter (lambda (file)
(and (string-prefix? "/gnu" file)
(string-contains file directory)
(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://gnu/"
- (string-drop file
- (string-length "/gnu/"))))
+ files))
+ ;; find latest version
+ (version (or version
+ (and (not (null? relevant))
+ (tarball->version
+ (find-latest-tarball-version relevant)))))
+ ;; find tarballs matching this version
+ (tarballs (filter (lambda (file)
+ (string=? version (tarball->version file)))
+ relevant)))
+ (match tarballs
+ (() #f)
+ (_
+ (upstream-source
+ (package name)
+ (version version)
+ (urls (map (lambda (file)
+ (string-append "mirror://gnu/"
+ (string-drop file
+ (string-length "/gnu/"))))
;; Sort so that the tarball with the same compression
;; format as currently used in PACKAGE comes first.
(sort tarballs better-tarball?)))
- (signature-urls (map (cut string-append <> ".sig") urls)))))
- (()
- #f)))))
+ (signature-urls (map (cut string-append <> ".sig") urls))))))))
(define %package-name-rx
;; Regexp for a package name, e.g., "foo-X.Y". Since TeXmacs uses
@@ -691,8 +721,9 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
;; HTML (unlike <https://download.savannah.nongnu.org/releases>.)
"https://de.freedif.org/savannah/")
-(define (latest-savannah-release package)
- "Return the latest release of PACKAGE."
+(define* (import-savannah-release package #:key (version #f))
+ "Return the latest release of PACKAGE. Optionally include a VERSION string
+to fetch a specific version."
(let* ((uri (string->uri
(match (origin-uri (package-source package))
((? string? uri) uri)
@@ -701,12 +732,14 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
(directory (dirname (uri-path uri))))
;; Note: We use the default 'file->signature', which adds ".sig", ".asc",
;; or whichever detached signature naming scheme PACKAGE uses.
- (latest-html-release package
+ (import-html-release package
+ #:version version
#:base-url %savannah-base
#:directory directory)))
-(define (latest-sourceforge-release package)
- "Return the latest release of PACKAGE."
+(define* (latest-sourceforge-release package #:key (version #f))
+ "Return the latest release of PACKAGE. Optionally include a VERSION string
+to fetch a specific version."
(define (uri-append uri extension)
;; Return URI with EXTENSION appended.
(build-uri (uri-scheme uri)
@@ -720,6 +753,12 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
((200 302) #t)
(else #f))))
+ (when version
+ (error
+ (formatted-message
+ (G_ "Updating to a specific version is not yet implemented for ~a, sorry.")
+ "sourceforge")))
+
(let* ((name (package-upstream-name package))
(base (string-append "https://sourceforge.net/projects/"
name "/files"))
@@ -758,21 +797,24 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
(when port
(close-port port))))))
-(define (latest-xorg-release package)
- "Return the latest release of PACKAGE."
+(define* (import-xorg-release package #:key (version #f))
+ "Return the latest release of PACKAGE. Optionally include a VERSION string
+to fetch a specific version."
(let ((uri (string->uri (origin-uri (package-source package)))))
(false-if-ftp-error
- (latest-ftp-release
+ (import-ftp-release
(package-name package)
+ #:version version
#:server "ftp.freedesktop.org"
#:directory
(string-append "/pub/xorg/" (dirname (uri-path uri)))))))
-(define (latest-kernel.org-release package)
- "Return the latest release of PACKAGE, the name of a kernel.org package."
+(define* (import-kernel.org-release package #:key (version #f))
+ "Return the latest release of PACKAGE, the name of a kernel.org package.
+Optionally include a VERSION string to fetch a specific version."
(define %kernel.org-base
;; This URL and sub-directories thereof are nginx-generated directory
- ;; listings suitable for 'latest-html-release'.
+ ;; listings suitable for 'import-html-release'.
"https://mirrors.edge.kernel.org/pub")
(define (file->signature file)
@@ -784,7 +826,8 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
((uri mirrors ...) uri))))
(package (package-upstream-name package))
(directory (dirname (uri-path uri))))
- (latest-html-release package
+ (import-html-release package
+ #:version version
#:base-url %kernel.org-base
#:directory directory
#:file->signature file->signature)))
@@ -811,9 +854,10 @@ GNOME packages; EMMS is included though, because its releases are on gnu.org."
(or (assoc-ref (package-properties package) 'release-monitoring-url)
(http-url? package)))))
-(define (latest-html-updatable-release package)
+(define* (import-html-updatable-release package #:key (version #f))
"Return the latest release of PACKAGE. Do that by crawling the HTML page of
-the directory containing its source tarball."
+the directory containing its source tarball. Optionally include a VERSION
+string to fetch a specific version."
(let* ((uri (string->uri
(match (origin-uri (package-source package))
((? string? url) url)
@@ -830,7 +874,8 @@ the directory containing its source tarball."
(catch #t
(lambda ()
(guard (c ((http-get-error? c) #f))
- (latest-html-release package
+ (import-html-release package
+ #:version version
#:base-url base
#:directory directory)))
(lambda (key . args)
@@ -848,7 +893,7 @@ the directory containing its source tarball."
(name 'gnu)
(description "Updater for GNU packages")
(pred gnu-hosted?)
- (latest latest-gnu-release)))
+ (import import-gnu-release)))
(define %gnu-ftp-updater
;; This is for GNU packages taken from alternate locations, such as
@@ -859,41 +904,41 @@ the directory containing its source tarball."
(pred (lambda (package)
(and (not (gnu-hosted? package))
(pure-gnu-package? package))))
- (latest latest-release*)))
+ (import import-release*)))
(define %savannah-updater
(upstream-updater
(name 'savannah)
(description "Updater for packages hosted on savannah.gnu.org")
(pred (url-prefix-predicate "mirror://savannah/"))
- (latest latest-savannah-release)))
+ (import import-savannah-release)))
(define %sourceforge-updater
(upstream-updater
(name 'sourceforge)
(description "Updater for packages hosted on sourceforge.net")
(pred (url-prefix-predicate "mirror://sourceforge/"))
- (latest latest-sourceforge-release)))
+ (import latest-sourceforge-release)))
(define %xorg-updater
(upstream-updater
(name 'xorg)
(description "Updater for X.org packages")
(pred (url-prefix-predicate "mirror://xorg/"))
- (latest latest-xorg-release)))
+ (import import-xorg-release)))
(define %kernel.org-updater
(upstream-updater
(name 'kernel.org)
(description "Updater for packages hosted on kernel.org")
(pred (url-prefix-predicate "mirror://kernel.org/"))
- (latest latest-kernel.org-release)))
+ (import import-kernel.org-release)))
(define %generic-html-updater
(upstream-updater
(name 'generic-html)
(description "Updater that crawls HTML pages.")
(pred html-updatable-package?)
- (latest latest-html-updatable-release)))
+ (import import-html-updatable-release)))
;;; gnu-maintenance.scm ends here
diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm
index 87abe9c2f1..8972b87080 100644
--- a/guix/import/cpan.scm
+++ b/guix/import/cpan.scm
@@ -4,6 +4,7 @@
;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2020, 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -29,6 +30,7 @@
#:use-module (srfi srfi-26)
#:use-module (json)
#:use-module (gcrypt hash)
+ #:use-module (guix diagnostics)
#:use-module (guix store)
#:use-module (guix utils)
#:use-module (guix base32)
@@ -39,26 +41,7 @@
#:use-module (guix packages)
#:use-module (guix upstream)
#:use-module (guix derivations)
- #:export (cpan-dependency?
- cpan-dependency-relationship
- cpan-dependency-phase
- cpan-dependency-module
- cpan-dependency-version
-
- cpan-release?
- cpan-release-license
- cpan-release-author
- cpan-release-version
- cpan-release-module
- cpan-release-distribution
- cpan-release-download-url
- cpan-release-abstract
- cpan-release-home-page
- cpan-release-dependencies
- json->cpan-release
-
- cpan-fetch
- cpan->guix-package
+ #:export (cpan->guix-package
metacpan-url->mirror-url
%cpan-updater
@@ -324,8 +307,13 @@ in RELEASE, a <cpan-release> record."
")"))))
(url-predicate (cut regexp-exec cpan-rx <>))))
-(define (latest-release package)
+(define* (latest-release package #:key (version #f))
"Return an <upstream-source> for the latest release of PACKAGE."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "cpan")))
(match (cpan-fetch (package->upstream-name package))
(#f #f)
(release
@@ -358,4 +346,4 @@ in RELEASE, a <cpan-release> record."
(name 'cpan)
(description "Updater for CPAN packages")
(pred cpan-package?)
- (latest latest-release)))
+ (import latest-release)))
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index a02e746417..1ed3580315 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -5,6 +5,7 @@
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -410,7 +411,11 @@ empty list when the FIELD cannot be found."
("tcl/tk" "tcl")
("booktabs" "texlive-booktabs")
("freetype2" "freetype")
+ ("mariadb-devel" "mariadb")
+ ("mysql56_dev" "mariadb")
("sqlite3" "sqlite")
+ ("udunits-2" "udunits")
+ ("x11" "libx11")
(_ sysname)))
(define cran-guix-name (cut guix-name "r-" <>))
@@ -689,8 +694,13 @@ s-expression corresponding to that package, or #f on failure."
(_ #f)))
(_ #f)))))
-(define (latest-cran-release pkg)
+(define* (latest-cran-release pkg #:key (version #f))
"Return an <upstream-source> for the latest release of the package PKG."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a provides only the latest version of each package, sorry.")
+ "CRAN")))
(define upstream-name
(package->upstream-name pkg))
@@ -709,20 +719,25 @@ s-expression corresponding to that package, or #f on failure."
(changed-inputs pkg
(description->package 'cran meta)))))))
-(define (latest-bioconductor-release pkg)
+(define* (latest-bioconductor-release pkg #:key (version #f))
"Return an <upstream-source> for the latest release of the package PKG."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a provides only the latest version of each package, sorry.")
+ "bioconductor.org")))
(define upstream-name
(package->upstream-name pkg))
- (define version
+ (define latest-version
(latest-bioconductor-package-version upstream-name))
(and version
;; Bioconductor does not provide signatures.
(upstream-source
(package (package-name pkg))
- (version version)
+ (version latest-version)
(urls (bioconductor-uri upstream-name version))
(input-changes
(changed-inputs
@@ -772,13 +787,13 @@ s-expression corresponding to that package, or #f on failure."
(name 'cran)
(description "Updater for CRAN packages")
(pred cran-package?)
- (latest latest-cran-release)))
+ (import latest-cran-release)))
(define %bioconductor-updater
(upstream-updater
(name 'bioconductor)
(description "Updater for Bioconductor packages")
(pred bioconductor-package?)
- (latest latest-bioconductor-release)))
+ (import latest-bioconductor-release)))
;;; cran.scm ends here
diff --git a/guix/import/crate.scm b/guix/import/crate.scm
index c76d7e9c1a..339dbcd74c 100644
--- a/guix/import/crate.scm
+++ b/guix/import/crate.scm
@@ -3,6 +3,7 @@
;;; Copyright © 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2019, 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2021 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -354,11 +355,12 @@ look up the development dependencs for the given crate."
(define crate-package?
(url-predicate crate-url?))
-(define (latest-release package)
- "Return an <upstream-source> for the latest release of PACKAGE."
+(define* (import-release package #:key (version #f))
+ "Return an <upstream-source> for the latest release of PACKAGE. Optionally
+include a VERSION string to fetch a specific version."
(let* ((crate-name (guix-package->crate-name package))
(crate (lookup-crate crate-name))
- (version (crate-latest-version crate))
+ (version (or version (crate-latest-version crate)))
(url (crate-uri crate-name version)))
(upstream-source
(package (package-name package))
@@ -370,5 +372,5 @@ look up the development dependencs for the given crate."
(name 'crate)
(description "Updater for crates.io packages")
(pred crate-package?)
- (latest latest-release)))
+ (import import-release)))
diff --git a/guix/import/egg.scm b/guix/import/egg.scm
index 0d6d72c465..10a40fe4f8 100644
--- a/guix/import/egg.scm
+++ b/guix/import/egg.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -333,10 +334,11 @@ not work."
;;; Updater.
;;;
-(define (latest-release package)
- "Return an @code{<upstream-source>} for the latest release of PACKAGE."
+(define* (import-release package #:key (version #f))
+ "Return an @code{<upstream-source>} for the latest release of PACKAGE.
+Optionally include a VERSION string to fetch a specific version."
(let* ((egg-name (guix-package->egg-name package))
- (version (find-latest-version egg-name))
+ (version (or version (find-latest-version egg-name)))
(source-url (egg-uri egg-name version)))
(upstream-source
(package (package-name package))
@@ -348,6 +350,6 @@ not work."
(name 'egg)
(description "Updater for CHICKEN egg packages")
(pred egg-package?)
- (latest latest-release)))
+ (import import-release)))
;;; egg.scm ends here
diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm
index 9399f45ebc..f9e9f2de53 100644
--- a/guix/import/elpa.scm
+++ b/guix/import/elpa.scm
@@ -7,6 +7,7 @@
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -35,6 +36,7 @@
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
+ #:use-module (guix diagnostics)
#:use-module ((guix download) #:select (download-to-store))
#:use-module (guix import utils)
#:use-module (guix http-client)
@@ -400,11 +402,16 @@ type '<elpa-package>'."
(string-drop (package-name package) 6)
(package-name package))))
-(define (latest-release package)
+(define* (latest-release package #:key (version #f))
"Return an <upstream-release> for the latest release of PACKAGE."
(define name (guix-package->elpa-name package))
(define repo (elpa-repository package))
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "elpa")))
(match (elpa-package-info name repo)
(#f
;; No info, perhaps because PACKAGE is not truly an ELPA package.
@@ -444,7 +451,7 @@ type '<elpa-package>'."
(name 'elpa)
(description "Updater for ELPA packages")
(pred package-from-elpa-repository?)
- (latest latest-release)))
+ (import latest-release)))
(define elpa-guix-name (cut guix-name "emacs-" <>))
diff --git a/guix/import/gem.scm b/guix/import/gem.scm
index ad1343bff4..8ad0662628 100644
--- a/guix/import/gem.scm
+++ b/guix/import/gem.scm
@@ -6,6 +6,7 @@
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2022 Taiju HIGASHI <higashi@taiju.info>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -173,11 +174,11 @@ package on RubyGems."
(define gem-package?
(url-prefix-predicate "https://rubygems.org/downloads/"))
-(define (latest-release package)
+(define* (import-release package #:key (version #f))
"Return an <upstream-source> for the latest release of PACKAGE."
(let* ((gem-name (guix-package->gem-name package))
(gem (rubygems-fetch gem-name))
- (version (gem-version gem))
+ (version (or version (gem-version gem)))
(url (rubygems-uri gem-name version)))
(upstream-source
(package (package-name package))
@@ -189,7 +190,7 @@ package on RubyGems."
(name 'gem)
(description "Updater for RubyGem packages")
(pred gem-package?)
- (latest latest-release)))
+ (import import-release)))
(define* (gem-recursive-import package-name #:optional version)
(recursive-import package-name
diff --git a/guix/import/git.scm b/guix/import/git.scm
index 4cf404677c..c15943bd7c 100644
--- a/guix/import/git.scm
+++ b/guix/import/git.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2022 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -146,9 +147,11 @@ version corresponding to the tag, and the cdr is the name of the tag."
tags)
entry<?))
-(define* (latest-tag url #:key prefix suffix delim pre-releases?)
+(define* (latest-tag url
+ #:key prefix suffix delim pre-releases? (version #f))
"Return the latest version and corresponding tag available from the Git
-repository at URL."
+repository at URL. Optionally include a VERSION string to fetch a specific
+version."
(define (pre-release? tag)
(any (cut regexp-exec <> tag)
%pre-release-rx))
@@ -169,13 +172,22 @@ repository at URL."
((null? versions->tags)
(git-no-valid-tags-error))
(else
- (match (last versions->tags)
- ((version . tag)
- (values version tag)))))))
-
-(define (latest-git-tag-version package)
+ (let ((versions (if version
+ (filter (match-lambda
+ ((candidate-version . tag)
+ (string=? version candidate-version)))
+ versions->tags)
+ versions->tags)))
+ (if (null? versions)
+ (values #f #f)
+ (match (last versions)
+ ((version . tag)
+ (values version tag)))))))))
+
+(define* (latest-git-tag-version package #:key (version #f))
"Given a PACKAGE, return the latest version of it and the corresponding git
-tag, or #false and #false if the latest version could not be determined."
+tag, or #false and #false if the latest version could not be determined.
+Optionally include a VERSION string to fetch a specific version."
(guard (c ((or (git-no-tags-error? c) (git-no-valid-tags-error? c))
(warning (or (package-field-location package 'source)
(package-location package))
@@ -193,6 +205,7 @@ tag, or #false and #false if the latest version could not be determined."
(url (git-reference-url (origin-uri source)))
(property (cute assq-ref (package-properties package) <>)))
(latest-tag url
+ #:version version
#:prefix (property 'release-tag-prefix)
#:suffix (property 'release-tag-suffix)
#:delim (property 'release-tag-version-delimiter)
@@ -206,12 +219,14 @@ tag, or #false and #false if the latest version could not be determined."
(git-reference? (origin-uri origin))))
(_ #f)))
-(define (latest-git-release package)
- "Return an <upstream-source> for the latest release of PACKAGE."
+(define* (import-git-release package #:key (version #f))
+ "Return an <upstream-source> for the latest release of PACKAGE.
+Optionally include a VERSION string to fetch a specific version."
(let* ((name (package-name package))
(old-version (package-version package))
(old-reference (origin-uri (package-source package)))
- (new-version new-version-tag (latest-git-tag-version package)))
+ (new-version new-version-tag
+ (latest-git-tag-version package #:version version)))
(and new-version new-version-tag
(upstream-source
(package name)
@@ -226,4 +241,4 @@ tag, or #false and #false if the latest version could not be determined."
(name 'generic-git)
(description "Updater for packages hosted on Git repositories")
(pred git-package?)
- (latest latest-git-release)))
+ (import import-git-release)))
diff --git a/guix/import/github.scm b/guix/import/github.scm
index e1a1af7133..a1bda5ec43 100644
--- a/guix/import/github.scm
+++ b/guix/import/github.scm
@@ -249,11 +249,13 @@ Alternatively, you can wait until your rate limit is reset, or use the
#:headers headers)))
(x x)))))))))
-(define (latest-released-version url package-name)
+(define* (latest-released-version url package-name #:key (version #f))
"Return the newest released version and its tag given a string URL like
'https://github.com/arq5x/bedtools2/archive/v2.24.0.tar.gz' and the name of
the package e.g. 'bedtools2'. Return #f (two values) if there are no
-releases."
+releases.
+
+Optionally include a VERSION string to fetch a specific version."
(define (pre-release? x)
(assoc-ref x "prerelease"))
@@ -290,16 +292,25 @@ releases."
(match (and=> (fetch-releases-or-tags url) vector->list)
(#f (values #f #f))
(json
- (match (sort (filter-map release->version
- (match (remove pre-release? json)
- (() json) ; keep everything
- (releases releases)))
- (lambda (x y) (version>? (car x) (car y))))
+ (let ((releases (filter-map release->version
+ (match (remove pre-release? json)
+ (() json) ; keep everything
+ (releases releases)))))
+ (match (if version
+ ;; Find matching release version.
+ (filter (match-lambda
+ ((candidate-version . tag)
+ (string=? version candidate-version)))
+ releases)
+ ;; Sort releases descending.
+ (sort releases
+ (lambda (x y) (version>? (car x) (car y)))))
(((latest-version . tag) . _) (values latest-version tag))
- (() (values #f #f))))))
+ (() (values #f #f)))))))
-(define (latest-release pkg)
- "Return an <upstream-source> for the latest release of PKG."
+(define* (import-release pkg #:key (version #f))
+ "Return an <upstream-source> for the latest release of PKG.
+Optionally include a VERSION string to fetch a specific version."
(define (github-uri uri)
(match uri
((? string? url)
@@ -313,7 +324,8 @@ releases."
(source-uri (github-uri original-uri))
(name (package-name pkg))
(newest-version version-tag
- (latest-released-version source-uri name)))
+ (latest-released-version source-uri name
+ #:version version)))
(if newest-version
(upstream-source
(package name)
@@ -330,6 +342,6 @@ releases."
(name 'github)
(description "Updater for GitHub packages")
(pred github-package?)
- (latest latest-release)))
+ (import import-release)))
diff --git a/guix/import/gnome.scm b/guix/import/gnome.scm
index 9d8cd8ec76..3c5a96fdde 100644
--- a/guix/import/gnome.scm
+++ b/guix/import/gnome.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2019, 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -57,9 +58,10 @@ source for metadata."
name "/" relative-url))))
'("tar.lz" "tar.xz" "tar.bz2" "tar.gz")))))))
-(define (latest-gnome-release package)
+(define* (import-gnome-release package #:key (version #f))
"Return the latest release of PACKAGE, a GNOME package, or #f if it could
-not be determined."
+not be determined. Optionally include a VERSION string to fetch a specific
+version."
(define %not-dot
(char-set-complement (char-set #\.)))
@@ -88,6 +90,28 @@ https://discourse.gnome.org/t/new-gnome-versioning-scheme/4235"
;; Some packages like "NetworkManager" have camel-case names.
(package-upstream-name package))
+ (define (find-latest-release releases)
+ (fold (match-lambda*
+ (((key . value) result)
+ (cond ((release-version? key)
+ (match result
+ (#f
+ (cons key value))
+ ((newest . _)
+ (if (version>? key newest)
+ (cons key value)
+ result))))
+ (else
+ result))))
+ #f
+ releases))
+
+ (define (find-version-release releases version)
+ (find (match-lambda
+ ((key . value)
+ (string=? key version)))
+ releases))
+
(guard (c ((http-get-error? c)
(if (= 404 (http-get-error-code c))
#f
@@ -108,20 +132,9 @@ https://discourse.gnome.org/t/new-gnome-versioning-scheme/4235"
(match json
(#(4 releases _ ...)
(let* ((releases (assoc-ref releases upstream-name))
- (latest (fold (match-lambda*
- (((key . value) result)
- (cond ((release-version? key)
- (match result
- (#f
- (cons key value))
- ((newest . _)
- (if (version>? key newest)
- (cons key value)
- result))))
- (else
- result))))
- #f
- releases)))
+ (latest (if version
+ (find-version-release releases version)
+ (find-latest-release releases))))
(and latest
(jsonish->upstream-source upstream-name latest))))))))
@@ -130,4 +143,4 @@ https://discourse.gnome.org/t/new-gnome-versioning-scheme/4235"
(name 'gnome)
(description "Updater for GNOME packages")
(pred (url-prefix-predicate "mirror://gnome/"))
- (latest latest-gnome-release)))
+ (import import-gnome-release)))
diff --git a/guix/import/gnu.scm b/guix/import/gnu.scm
index 2b9b71feb0..139c32a545 100644
--- a/guix/import/gnu.scm
+++ b/guix/import/gnu.scm
@@ -117,7 +117,7 @@ details.)"
(unless package
(raise (formatted-message (G_ "no GNU package found for ~a") name)))
- (match (latest-release name)
+ (match (import-release name)
((? upstream-source? release)
(let ((version (upstream-source-version release)))
(gnu-package->sexp package release #:key-download key-download)))
diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm
index 878a7d2f9c..3c2cd75db4 100644
--- a/guix/import/hackage.scm
+++ b/guix/import/hackage.scm
@@ -7,6 +7,7 @@
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2019 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -30,10 +31,12 @@
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-1)
+ #:use-module (guix diagnostics)
#:use-module ((guix download) #:select (download-to-store url-fetch))
#:use-module ((guix utils) #:select (package-name->name+version
canonical-newline-port))
#:use-module (guix http-client)
+ #:use-module (guix i18n)
#:use-module (guix import utils)
#:use-module (guix import cabal)
#:use-module (guix store)
@@ -359,8 +362,13 @@ respectively."
(let ((hackage-rx (make-regexp "(https?://hackage.haskell.org|mirror://hackage/)")))
(url-predicate (cut regexp-exec hackage-rx <>))))
-(define (latest-release package)
+(define* (latest-release package #:key (version #f))
"Return an <upstream-source> for the latest release of PACKAGE."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "hackage")))
(let* ((hackage-name (guix-package->hackage-name package))
(cabal-meta (hackage-fetch hackage-name)))
(match cabal-meta
@@ -381,6 +389,6 @@ respectively."
(name 'hackage)
(description "Updater for Hackage packages")
(pred hackage-package?)
- (latest latest-release)))
+ (import latest-release)))
;;; cabal.scm ends here
diff --git a/guix/import/hexpm.scm b/guix/import/hexpm.scm
index 2a7a9f3d82..8a009fd245 100644
--- a/guix/import/hexpm.scm
+++ b/guix/import/hexpm.scm
@@ -328,11 +328,12 @@ latest version of PACKAGE-NAME."
;;; Updater
;;;
-(define (latest-release package)
- "Return an <upstream-source> for the latest release of PACKAGE."
+(define* (import-release package #:key (version #f))
+ "Return an <upstream-source> for the latest release of PACKAGE. Optionally
+include a VERSION string to fetch a specific version."
(let* ((hexpm-name (guix-package->hexpm-name package))
(hexpm (lookup-hexpm hexpm-name))
- (version (hexpm-latest-release hexpm))
+ (version (or version (hexpm-latest-release hexpm)))
(url (hexpm-uri hexpm-name version)))
(upstream-source
(package (package-name package))
@@ -344,4 +345,4 @@ latest version of PACKAGE-NAME."
(name 'hexpm)
(description "Updater for hex.pm packages")
(pred (url-prefix-predicate hexpm-package-url))
- (latest latest-release)))
+ (import import-release)))
diff --git a/guix/import/kde.scm b/guix/import/kde.scm
index 6873418d62..3566312eca 100644
--- a/guix/import/kde.scm
+++ b/guix/import/kde.scm
@@ -28,6 +28,7 @@
#:use-module (ice-9 match)
#:use-module (ice-9 rdelim)
#:use-module (ice-9 regex)
+ #:use-module (srfi srfi-1)
#:use-module (srfi srfi-11)
#:use-module (web uri)
@@ -149,42 +150,52 @@ Output:
(string-join (map version->pattern directory-parts) "/")
"/"))))
-(define (latest-kde-release package)
+(define* (import-kde-release package #:key (version #f))
"Return the latest release of PACKAGE, a KDE package, or #f if it could
-not be determined."
+not be determined. Optionally include a VERSION string to fetch a specific
+version."
+
+ (define (find-latest-archive-version archives)
+ (fold (lambda (file1 file2)
+ (if (and file2
+ (version>? (tarball-sans-extension (basename file2))
+ (tarball-sans-extension (basename file1))))
+ file2
+ file1))
+ #f
+ archives))
+
(let* ((uri (string->uri (origin-uri (package-source package))))
(path-rx (uri->kde-path-pattern uri))
(name (package-upstream-name package))
(files (download.kde.org-files))
+ ;; select archives for this package
(relevant (filter (lambda (file)
(and (regexp-exec path-rx 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))))
+ files))
+ ;; Find latest version.
+ (version (or version
+ (and (not (null? relevant))
+ (tarball->version (find-latest-archive-version relevant)))))
+ ;; Find archives matching this version.
+ (tarballs (filter (lambda (file)
+ (string=? version (tarball->version file)))
+ relevant)))
+ (match tarballs
+ (() #f)
+ (_
+ (upstream-source
+ (package name)
+ (version version)
+ (urls (map (lambda (file)
+ (string-append "mirror://kde/" file))
+ tarballs)))))))
+
(define %kde-updater
(upstream-updater
(name 'kde)
(description "Updater for KDE packages")
(pred (url-prefix-predicate "mirror://kde/"))
- (latest latest-kde-release)))
+ (import import-kde-release)))
diff --git a/guix/import/launchpad.scm b/guix/import/launchpad.scm
index aeb447b0a5..01953ea69c 100644
--- a/guix/import/launchpad.scm
+++ b/guix/import/launchpad.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2019, 2020 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -121,8 +122,9 @@ for example, 'linuxdcpp'. Return #f if there is no releases."
(last (remove pre-release? (vector->list (assoc-ref json "entries"))))
"version"))))
-(define (latest-release pkg)
- "Return an <upstream-source> for the latest release of PKG."
+(define* (import-release pkg #:key (version #f))
+ "Return an <upstream-source> for the latest release of PKG. Optionally
+include a VERSION string to fetch a specific version."
(define (origin-launchpad-uri origin)
(match (origin-uri origin)
((? string? url) url) ; surely a Launchpad URL
@@ -132,7 +134,7 @@ for example, 'linuxdcpp'. Return #f if there is no releases."
(let* ((source-uri (origin-launchpad-uri (package-source pkg)))
(name (package-name pkg))
(repository (launchpad-repository source-uri))
- (newest-version (latest-released-version repository)))
+ (newest-version (or version (latest-released-version repository))))
(if newest-version
(upstream-source
(package name)
@@ -145,4 +147,4 @@ for example, 'linuxdcpp'. Return #f if there is no releases."
(name 'launchpad)
(description "Updater for Launchpad packages")
(pred launchpad-package?)
- (latest latest-release)))
+ (import import-release)))
diff --git a/guix/import/minetest.scm b/guix/import/minetest.scm
index 43cfb533e2..1f1cfc834d 100644
--- a/guix/import/minetest.scm
+++ b/guix/import/minetest.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -25,6 +26,7 @@
#:use-module (srfi srfi-2)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
+ #:use-module (guix diagnostics)
#:use-module ((guix packages) #:prefix package:)
#:use-module (guix upstream)
#:use-module (guix utils)
@@ -486,7 +488,7 @@ list of AUTHOR/NAME strings."
(and (string-prefix? "minetest-" (package:package-name pkg))
(assq-ref (package:package-properties pkg) 'upstream-name)))
-(define (latest-minetest-release pkg)
+(define* (latest-minetest-release pkg #:key (version #f))
"Return an <upstream-source> for the latest release of the package PKG,
or #false if the latest release couldn't be determined."
(define author/name
@@ -494,6 +496,12 @@ or #false if the latest release couldn't be determined."
(define contentdb-package (contentdb-fetch author/name)) ; TODO warn if #f?
(define release (latest-release author/name))
(define source (package:package-source pkg))
+
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "minetest")))
(and contentdb-package release
(release-commit release) ; not always set
;; Only continue if both the old and new version number are both
@@ -513,4 +521,4 @@ or #false if the latest release couldn't be determined."
(name 'minetest)
(description "Updater for Minetest packages on ContentDB")
(pred minetest-package?)
- (latest latest-minetest-release)))
+ (import latest-minetest-release)))
diff --git a/guix/import/opam.scm b/guix/import/opam.scm
index b4b5a6eaad..59dbb7cb8b 100644
--- a/guix/import/opam.scm
+++ b/guix/import/opam.scm
@@ -4,6 +4,7 @@
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2021, 2022 Alice Brenon <alice.brenon@ens-lyon.fr>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -35,6 +36,7 @@
#:use-module ((guix build utils) #:select (dump-port find-files mkdir-p))
#:use-module (guix build-system)
#:use-module (guix build-system ocaml)
+ #:use-module (guix diagnostics)
#:use-module (guix http-client)
#:use-module (guix ui)
#:use-module (guix packages)
@@ -417,8 +419,13 @@ package in OPAM."
(member (build-system-name (package-build-system package)) '(dune ocaml))
(not (string-prefix? "ocaml4" (package-name package)))))
-(define (latest-release package)
+(define* (latest-release package #:key (version #f))
"Return an <upstream-source> for the latest release of PACKAGE."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "opam")))
(and-let* ((opam-name (guix-package->opam-name package))
(opam-file (opam-fetch opam-name))
(version (assoc-ref opam-file "version"))
@@ -435,4 +442,4 @@ package in OPAM."
(name 'opam)
(description "Updater for OPAM packages")
(pred opam-package?)
- (latest latest-release)))
+ (import latest-release)))
diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm
index 4760fc3dae..0e5998b36e 100644
--- a/guix/import/pypi.scm
+++ b/guix/import/pypi.scm
@@ -13,6 +13,7 @@
;;; Copyright © 2021 Marius Bakke <marius@gnu.org>
;;; Copyright © 2022 Vivien Kraus <vivien@planete-kraus.eu>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -556,15 +557,16 @@ source. To build it from source, refer to the upstream repository at
(string-prefix? "https://pypi.org/packages" url)
(string-prefix? "https://files.pythonhosted.org/packages" url)))))
-(define (latest-release package)
- "Return an <upstream-source> for the latest release of PACKAGE."
+(define* (import-release package #:key (version #f))
+ "Return an <upstream-source> for the latest release of PACKAGE. Optionally
+include a VERSION string to fetch a specific version."
(let* ((pypi-name (guix-package->pypi-name package))
(pypi-package (pypi-fetch pypi-name)))
(and pypi-package
(guard (c ((missing-source-error? c) #f))
(let* ((info (pypi-project-info pypi-package))
- (version (project-info-version info))
- (dist (source-release pypi-package))
+ (version (or version (project-info-version info)))
+ (dist (source-release pypi-package version))
(url (distribution-url dist)))
(upstream-source
(urls (list url))
@@ -574,7 +576,7 @@ source. To build it from source, refer to the upstream repository at
#f))
(input-changes
(changed-inputs package
- (pypi->guix-package pypi-name)))
+ (pypi->guix-package pypi-name #:version version)))
(package (package-name package))
(version version)))))))
@@ -583,4 +585,4 @@ source. To build it from source, refer to the upstream repository at
(name 'pypi)
(description "Updater for PyPI packages")
(pred pypi-package?)
- (latest latest-release)))
+ (import import-release)))
diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm
index 49be982a7f..e54df95985 100644
--- a/guix/import/stackage.scm
+++ b/guix/import/stackage.scm
@@ -4,6 +4,7 @@
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2021 Xinglu Chem <public@yoctocell.xyz>
;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -139,9 +140,14 @@ included in the Stackage LTS release."
(mlambda ()
(stackage-lts-packages
(stackage-lts-info-fetch %default-lts-version)))))
- (lambda* (pkg)
+ (lambda* (pkg #:key (version #f))
"Return an <upstream-source> for the latest Stackage LTS release of
PACKAGE or #f if the package is not included in the Stackage LTS release."
+ (when version
+ (error
+ (formatted-message
+ (G_ "~a updater doesn't support updating to a specific version, sorry.")
+ "stackage")))
(let* ((hackage-name (guix-package->hackage-name pkg))
(version (lts-package-version (packages) hackage-name))
(name-version (hackage-name-version hackage-name version)))
@@ -175,6 +181,6 @@ PACKAGE or #f if the package is not included in the Stackage LTS release."
(name 'stackage)
(description "Updater for Stackage LTS packages")
(pred stackage-lts-package?)
- (latest latest-lts-release)))
+ (import latest-lts-release)))
;;; stackage.scm ends here
diff --git a/guix/packages.scm b/guix/packages.scm
index 8f119d9fa7..041a872f9d 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -8,6 +8,7 @@
;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
;;; Copyright © 2022 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2022 jgart <jgart@dismail.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -89,6 +90,7 @@
this-package
package-name
package-upstream-name
+ package-upstream-name*
package-version
package-full-name
package-source
@@ -609,7 +611,7 @@ Texinfo. Otherwise, return the string."
(sanitize validate-texinfo)) ; one or two paragraphs
(license package-license ; (list of) <license>
(sanitize validate-license))
- (home-page package-home-page)
+ (home-page package-home-page) ; string
(supported-systems package-supported-systems ; list of strings
(default %supported-systems))
@@ -691,6 +693,38 @@ it has in Guix."
(or (assq-ref (package-properties package) 'upstream-name)
(package-name package)))
+(define (package-upstream-name* package)
+ "Return the upstream name of PACKAGE, accounting for commonly-used
+package name prefixes in addition to the @code{upstream-name} property."
+ (let ((namespaces (list "cl-"
+ "ecl-"
+ "emacs-"
+ "ghc-"
+ "go-"
+ "guile-"
+ "java-"
+ "julia-"
+ "lua-"
+ "minetest-"
+ "node-"
+ "ocaml-"
+ "perl-"
+ "python-"
+ "r-"
+ "ruby-"
+ "rust-"
+ "sbcl-"
+ "texlive-"))
+ (name (package-name package)))
+ (or (assq-ref (package-properties package) 'upstream-name)
+ (let loop ((prefixes namespaces))
+ (match prefixes
+ (() name)
+ ((prefix rest ...)
+ (if (string-prefix? prefix name)
+ (substring name (string-length prefix))
+ (loop rest))))))))
+
(define (hidden-package p)
"Return a \"hidden\" version of P--i.e., one that 'fold-packages' and thus,
user interfaces, ignores."
diff --git a/guix/pki.scm b/guix/pki.scm
index 6326e065e9..c5b2fb9634 100644
--- a/guix/pki.scm
+++ b/guix/pki.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2016, 2022 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -21,6 +21,7 @@
#:use-module (gcrypt pk-crypto)
#:use-module ((guix utils) #:select (with-atomic-file-output))
#:use-module ((guix build utils) #:select (mkdir-p))
+ #:autoload (srfi srfi-1) (delete-duplicates)
#:use-module (ice-9 match)
#:use-module (ice-9 rdelim)
#:use-module (ice-9 binary-ports)
@@ -61,9 +62,10 @@ element in KEYS must be a canonical sexp with type 'public-key'."
;; want to have name certificates and to use subject names instead of
;; complete keys.
`(acl ,@(map (lambda (key)
- `(entry ,(canonical-sexp->sexp key)
+ `(entry ,key
(tag (guix import))))
- keys)))
+ (delete-duplicates
+ (map canonical-sexp->sexp keys)))))
(define %acl-file
(string-append %config-directory "/acl"))
diff --git a/guix/read-print.scm b/guix/read-print.scm
index a6aaa149e4..8a720ef2ef 100644
--- a/guix/read-print.scm
+++ b/guix/read-print.scm
@@ -288,11 +288,13 @@ expressions and blanks that were read."
('define-gexp-compiler 2)
('define-record-type 2)
('define-record-type* 4)
+ ('define-configuration 2)
('let 2)
('let* 2)
('letrec 2)
('letrec* 2)
('match 2)
+ ('match-record 3)
('when 2)
('unless 2)
('package 1)
diff --git a/guix/records.scm b/guix/records.scm
index 13463647c8..1f097c7108 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -592,13 +592,16 @@ found."
(define-syntax match-record-inner
(lambda (s)
(syntax-case s ()
- ((_ record type (field rest ...) body ...)
- #`(let-syntax ((field-offset (syntax-rules ()
+ ((_ record type ((field variable) rest ...) body ...)
+ #'(let-syntax ((field-offset (syntax-rules ()
((_ f)
(lookup-field field 0 f)))))
(let* ((offset (type map-fields field-offset))
- (field (struct-ref record offset)))
+ (variable (struct-ref record offset)))
(match-record-inner record type (rest ...) body ...))))
+ ((_ record type (field rest ...) body ...)
+ ;; Redirect to the canonical form above.
+ #'(match-record-inner record type ((field field) rest ...) body ...))
((_ record type () body ...)
#'(begin body ...)))))
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index 14329751f8..e0b94ce48d 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -9,6 +9,7 @@
;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2020 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -46,6 +47,7 @@
#:use-module (ice-9 vlist)
#:use-module (ice-9 format)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-37)
#:use-module (srfi srfi-71)
@@ -181,7 +183,7 @@ specified with `--select'.\n"))
(newline)
(show-bug-report-information))
-(define (options->packages opts)
+(define (options->update-specs opts)
"Return the list of packages requested by OPTS, honoring options like
'--recursive'."
(define core-package?
@@ -224,7 +226,7 @@ update would trigger a complete rebuild."
(('argument . spec)
;; Take either the specified version or the
;; latest one.
- (specification->package spec))
+ (update-specification->update-spec spec))
(('expression . exp)
(read/eval-package-expression exp))
(_ #f))
@@ -256,6 +258,25 @@ update would trigger a complete rebuild."
;;;
+;;; Utilities.
+;;;
+
+(define-record-type <update-spec>
+ (update-spec package version)
+ update?
+ (package update-spec-package)
+ (version update-spec-version))
+
+(define (update-specification->update-spec spec)
+ "Given SPEC, a package name like \"guile@2.0=2.0.8\", return a <update>
+record with two fields: the package to upgrade, and the target version."
+ (match (string-rindex spec #\=)
+ (#f (update-spec (specification->package spec) #f))
+ (idx (update-spec (specification->package (substring spec 0 idx))
+ (substring spec (1+ idx))))))
+
+
+;;;
;;; Updates.
;;;
@@ -298,7 +319,7 @@ update would trigger a complete rebuild."
(G_ "no updater for ~a~%")
(package-name package)))
-(define* (update-package store package updaters
+(define* (update-package store package version updaters
#:key (key-download 'interactive) warn?)
"Update the source file that defines PACKAGE with the new version.
KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed
@@ -307,7 +328,7 @@ warn about packages that have no matching updater."
(if (lookup-updater package updaters)
(let ((version output source
(package-update store package updaters
- #:key-download key-download))
+ #:key-download key-download #:version version))
(loc (or (package-field-location package 'version)
(package-location package))))
(when version
@@ -540,12 +561,12 @@ all are dependent packages: ~{~a~^ ~}~%")
(with-error-handling
(with-store store
(run-with-store store
- (mlet %store-monad ((packages (options->packages opts)))
+ (mlet %store-monad ((update-specs (options->update-specs opts)))
(cond
(list-dependent?
- (list-dependents packages))
+ (list-dependents (map update-spec-package update-specs)))
(list-transitive?
- (list-transitive packages))
+ (list-transitive (map update-spec-package update-specs)))
(update?
(parameterize ((%openpgp-key-server
(or (assoc-ref opts 'key-server)
@@ -558,13 +579,17 @@ all are dependent packages: ~{~a~^ ~}~%")
(string-append (config-directory)
"/upstream/trustedkeys.kbx"))))
(for-each
- (cut update-package store <> updaters
- #:key-download key-download
- #:warn? warn?)
- packages)
+ (lambda (update)
+ (update-package store
+ (update-spec-package update)
+ (update-spec-version update)
+ updaters
+ #:key-download key-download
+ #:warn? warn?))
+ update-specs)
(return #t)))
(else
(for-each (cut check-for-package-update <> updaters
#:warn? warn?)
- packages)
+ (map update-spec-package update-specs))
(return #t)))))))))
diff --git a/guix/scripts/shell.scm b/guix/scripts/shell.scm
index 2fc1dc942a..64b5c2e8e9 100644
--- a/guix/scripts/shell.scm
+++ b/guix/scripts/shell.scm
@@ -20,7 +20,8 @@
#:use-module (guix ui)
#:use-module ((guix diagnostics) #:select (location))
#:use-module (guix scripts environment)
- #:autoload (guix scripts build) (show-build-options-help)
+ #:autoload (guix scripts build) (show-build-options-help
+ show-native-build-options-help)
#:autoload (guix transformations) (options->transformation
transformation-option-key?
show-transformation-options-help)
@@ -76,6 +77,8 @@ interactive shell in that environment.\n"))
(newline)
(show-build-options-help)
(newline)
+ (show-native-build-options-help)
+ (newline)
(show-transformation-options-help)
(newline)
(display (G_ "
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 6482318168..6fd915cb5e 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -842,7 +842,10 @@ static checks."
(check-mapped-devices os)
(when (zero? (getuid))
(check-file-system-availability (operating-system-file-systems os))
- (check-initrd-modules os)))
+ (unless (%current-target-system)
+ ;; Skip the check if the user is making use of --target, as it cannot
+ ;; be checked against the running kernel.
+ (check-initrd-modules os))))
(mlet* %store-monad
((sys (system-derivation-for-action image action
diff --git a/guix/store/deduplication.scm b/guix/store/deduplication.scm
index ab982e3b3d..acb6ffcc4a 100644
--- a/guix/store/deduplication.scm
+++ b/guix/store/deduplication.scm
@@ -1,6 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Caleb Ristvedt <caleb.ristvedt@cune.org>
-;;; Copyright © 2018-2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018-2022 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -262,7 +262,10 @@ down the road."
(deduplicate file (dump-and-compute-hash) #:store store)
(call-with-output-file file
(lambda (output)
- (dump-port input output size)))))
+ (if (file-port? input)
+ (sendfile output input size 0)
+ (dump-port input output size
+ #:buffer-size %deduplication-minimum-size))))))
(define* (copy-file/deduplicate source target
#:key (store (%store-directory)))
diff --git a/guix/ui.scm b/guix/ui.scm
index 45eccb7335..3bca3b1e40 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -1668,6 +1668,7 @@ score, the more relevant OBJ is to REGEXPS."
;; Metrics used to compute the "relevance score" of a package against a set
;; of regexps.
`((,package-name . 4)
+ (,package-upstream-name* . 2)
;; Match against uncommon outputs.
(,(lambda (package)
diff --git a/guix/upstream.scm b/guix/upstream.scm
index 32736940aa..f3ab9ab78b 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -4,6 +4,7 @@
;;; Copyright © 2019, 2022 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -66,7 +67,7 @@
upstream-updater-name
upstream-updater-description
upstream-updater-predicate
- upstream-updater-latest
+ upstream-updater-import
upstream-input-change?
upstream-input-change-name
@@ -241,7 +242,7 @@ correspond to the same version."
(name upstream-updater-name)
(description upstream-updater-description)
(pred upstream-updater-predicate)
- (latest upstream-updater-latest))
+ (import upstream-updater-import))
(define (importer-modules)
"Return the list of importer modules."
@@ -272,22 +273,23 @@ correspond to the same version."
"Return an updater among UPDATERS that matches PACKAGE, or #f if none of
them matches."
(find (match-lambda
- (($ <upstream-updater> name description pred latest)
+ (($ <upstream-updater> name description pred import)
(pred package)))
updaters))
(define* (package-latest-release package
#:optional
- (updaters (force %updaters)))
+ (updaters (force %updaters))
+ #:key (version #f))
"Return an upstream source to update PACKAGE, a <package> object, or #f if
none of UPDATERS matches PACKAGE. When several updaters match PACKAGE, try
them until one of them returns an upstream source. It is the caller's
responsibility to ensure that the returned source is newer than the current
one."
(any (match-lambda
- (($ <upstream-updater> name description pred latest)
+ (($ <upstream-updater> name description pred import)
(and (pred package)
- (latest package))))
+ (import package #:version version))))
updaters))
(define* (package-latest-release* package
@@ -494,13 +496,13 @@ SOURCE, an <upstream-source>."
(define* (package-update store package
#:optional (updaters (force %updaters))
- #:key (key-download 'interactive))
+ #:key (key-download 'interactive) (version #f))
"Return the new version, the file name of the new version tarball, and input
changes for PACKAGE; return #f (three values) when PACKAGE is up-to-date;
raise an error when the updater could not determine available releases.
KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed
values: 'always', 'never', and 'interactive' (default)."
- (match (package-latest-release package updaters)
+ (match (package-latest-release package updaters #:version version)
((? upstream-source? source)
(if (version>? (upstream-source-version source)
(package-version package))
@@ -524,8 +526,11 @@ this method: ~s")
(values #f #f #f)))
(#f
;; Warn rather than abort so that other updates can still take place.
- (warning (G_ "updater failed to determine available releases for ~a~%")
- (package-name package))
+ (if version
+ (warning (G_ "updater failed to find release ~a@~a~%")
+ (package-name package) version)
+ (warning (G_ "updater failed to determine available releases for ~a~%")
+ (package-name package)))
(values #f #f #f))))
(define* (update-package-source package source hash)