mirror of
https://git.savannah.gnu.org/git/guix.git
synced 2025-01-18 21:46:35 +01:00
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
This commit is contained in:
parent
62b0d90cc7
commit
abc3eb3319
1 changed files with 13 additions and 16 deletions
|
@ -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 @@ (define (read-cabal-and-hash port)
|
|||
(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 @@ (define (hackage-fetch-and-hash name-version)
|
|||
(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))
|
||||
(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 @@ (define* (hackage->guix-package package-name #:key
|
|||
(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 @@ (define hackage-package?
|
|||
(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 @@ (define %hackage-updater
|
|||
(name 'hackage)
|
||||
(description "Updater for Hackage packages")
|
||||
(pred hackage-package?)
|
||||
(import latest-release)))
|
||||
(import import-release)))
|
||||
|
||||
;;; cabal.scm ends here
|
||||
|
|
Loading…
Reference in a new issue