summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Graves <ngraves@ngraves.fr>2024-10-29 14:53:51 +0100
committerLudovic Courtès <ludo@gnu.org>2024-11-14 15:53:41 +0100
commitabc3eb33191b9df5e6e44462501606f5e0dd3a92 (patch)
tree94765d1385112610cca6183011e19e30fa7bba64
parent62b0d90cc7a14415fa89bc99325785faed8496a6 (diff)
downloadguix-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.scm29
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