diff options
author | Nicolas Graves <ngraves@ngraves.fr> | 2024-10-29 14:53:51 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2024-11-14 15:53:41 +0100 |
commit | abc3eb33191b9df5e6e44462501606f5e0dd3a92 (patch) | |
tree | 94765d1385112610cca6183011e19e30fa7bba64 | |
parent | 62b0d90cc7a14415fa89bc99325785faed8496a6 (diff) | |
download | guix-abc3eb33191b9df5e6e44462501606f5e0dd3a92.tar.gz |
import: hackage: Support updating to a specific version.
* gnu/import/hackage.scm (hackage-fetch-and-hash, hackage-fetch): Support name and version argument. (import-release): New variable, formerly known as latest-release. Support updating to a specific version. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Change-Id: I8f9e3ee99676cedca82f7c8c5ff51baa5a6fc46a
-rw-r--r-- | guix/import/hackage.scm | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm index 79a51d3300..422887d435 100644 --- a/guix/import/hackage.scm +++ b/guix/import/hackage.scm @@ -9,6 +9,7 @@ ;;; Copyright © 2019 Simon Tournier <zimon.toutoune@gmail.com> ;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2023-2024 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr> ;;; ;;; This file is part of GNU Guix. ;;; @@ -136,7 +137,7 @@ format as two values." (values (read-cabal (canonical-newline-port port)) (bytevector->nix-base32-string (get-hash))))) -(define (hackage-fetch-and-hash name-version) +(define (hackage-fetch-and-hash name version) "Fetch the latest Cabal revision for the package NAME-VERSION, and return two values: the parsed Cabal file and its hash in nix-base32 format. If the version part is omitted from the package name, then fetch the latest @@ -144,18 +145,19 @@ version. On failure, both return values will be #f." (guard (c ((and (http-get-error? c) (= 404 (http-get-error-code c))) (values #f #f))) ;"expected" if package is unknown - (let* ((name version (package-name->name+version name-version)) - (url (hackage-cabal-url name version)) - (port _ (http-fetch url)) - (cabal hash (read-cabal-and-hash port))) + (let* ((name new-version (package-name->name+version name)) + (version (or version new-version)) + (url (hackage-cabal-url name version)) + (port _ (http-fetch url)) + (cabal hash (read-cabal-and-hash port))) (close-port port) (values cabal hash)))) -(define (hackage-fetch name-version) +(define (hackage-fetch name version) "Return the Cabal file for the package NAME-VERSION, or #f on failure. If the version part is omitted from the package name, then return the latest version." - (let ((cabal hash (hackage-fetch-and-hash name-version))) + (let ((cabal hash (hackage-fetch-and-hash name version))) cabal)) (define string->license @@ -355,7 +357,7 @@ respectively." (let ((cabal-meta cabal-hash (if port (read-cabal-and-hash port) - (hackage-fetch-and-hash package-name)))) + (hackage-fetch-and-hash package-name #f)))) (if cabal-meta (hackage-module->sexp (eval-cabal cabal-meta cabal-environment) cabal-hash @@ -377,15 +379,10 @@ respectively." (let ((hackage-rx (make-regexp "(https?://hackage.haskell.org|mirror://hackage/)"))) (url-predicate (cut regexp-exec hackage-rx <>)))) -(define* (latest-release package #:key (version #f)) +(define* (import-release package #:key (version #f)) "Return an <upstream-source> for the latest release of PACKAGE." - (when version - (raise - (formatted-message - (G_ "~a updater doesn't support updating to a specific version, sorry.") - "hackage"))) (let* ((hackage-name (package-upstream-name* package)) - (cabal-meta (hackage-fetch hackage-name))) + (cabal-meta (hackage-fetch hackage-name version))) (match cabal-meta (#f (format (current-error-port) @@ -407,6 +404,6 @@ respectively." (name 'hackage) (description "Updater for Hackage packages") (pred hackage-package?) - (import latest-release))) + (import import-release))) ;;; cabal.scm ends here |