mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
import: go: Add an option to use pinned versions.
The ability to pin versions is handy when having to deal to packages that bootstrap themselves through a chain of former versions. Not using pinned versions in these case could introduce dependency cycles. * guix/build-system/go.scm (guix) (%go-version-rx): Rename to... (%go-pseudo-version-rx): ... this. Simplify the regular expression, which in turns makes it more robust. * guix/build-system/go.scm (go-version->git-ref): Adjust following the above rename. (go-pseudo-version?): New predicate. (go-module-latest-version): Rename to ... (go-module-version-string): ... this. Rename goproxy-url argument to just goproxy. Add a VERSION keyword argument, update docstring and adjust to have it used. (go-module-available-versions): New procedure. (%go.mod-require-directive-rx): Document regexp. (parse-go.mod): Harmonize the way dependencies are recorded to a list of lists rather than a list of pairs, as done for other importers. Rewrite to directly pass multiple values rather than a record object. Filter the replaced modules in a functional style. (go-module->guix-package): Add docstring. [version, pin-versions?]: New arguments. Rename the GOPROXY-URL argument to GOPROXY. Adjust to the new returned value of fetch-go.mod, which is a string. Fail when the provided version doesn't exist. Return a list dependencies and their versions when in pinned versions mode, else just the dependencies. (go-module-recursive-import)[version, pin-versions?]: New arguments. Honor the new arguments and guard against network errors. * guix/scripts/import/go.scm (%default-options): Register a default value for the goproxy argument. (show-help): Document that a version can be specified. Remove the --version argument and add a --pin-versions argument. (%options)[version]: Remove option. [pin-versions]: Add option. (guix-import-go): Adjust so the version provided from the module name is honored, along the new pin-versions? argument. * tests/go.scm: Adjust and add new tests.
This commit is contained in:
parent
6aee902eaf
commit
a8b927a562
4 changed files with 232 additions and 161 deletions
|
@ -1,5 +1,6 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2020 Katherine Cox-Buday <cox.katherine.e@gmail.com>
|
||||
;;; Copyright © 2020 Katherine Cox-Buday <cox.katherine.e@gmail.com>
|
||||
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -27,28 +28,30 @@
|
|||
#:use-module (srfi srfi-37)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 format)
|
||||
#:use-module (ice-9 receive)
|
||||
#:export (guix-import-go))
|
||||
|
||||
|
||||
|
||||
;;;
|
||||
;;; Command-line options.
|
||||
;;;
|
||||
|
||||
(define %default-options
|
||||
'())
|
||||
'((goproxy . "https://proxy.golang.org")))
|
||||
|
||||
(define (show-help)
|
||||
(display (G_ "Usage: guix import go PACKAGE-PATH
|
||||
Import and convert the Go module for PACKAGE-PATH.\n"))
|
||||
(display (G_ "Usage: guix import go PACKAGE-PATH[@VERSION]
|
||||
Import and convert the Go module for PACKAGE-PATH. Optionally, a version
|
||||
can be specified after the arobas (@) character.\n"))
|
||||
(display (G_ "
|
||||
-h, --help display this help and exit"))
|
||||
(display (G_ "
|
||||
-V, --version display version information and exit"))
|
||||
(display (G_ "
|
||||
-r, --recursive generate package expressions for all Go modules\
|
||||
that are not yet in Guix"))
|
||||
-r, --recursive generate package expressions for all Go modules
|
||||
that are not yet in Guix"))
|
||||
(display (G_ "
|
||||
-p, --goproxy=GOPROXY specify which goproxy server to use"))
|
||||
(display (G_ "
|
||||
--pin-versions use the exact versions of a module's dependencies"))
|
||||
(newline)
|
||||
(show-bug-report-information))
|
||||
|
||||
|
@ -58,9 +61,6 @@ Import and convert the Go module for PACKAGE-PATH.\n"))
|
|||
(lambda args
|
||||
(show-help)
|
||||
(exit 0)))
|
||||
(option '(#\V "version") #f #f
|
||||
(lambda args
|
||||
(show-version-and-exit "guix import go")))
|
||||
(option '(#\r "recursive") #f #f
|
||||
(lambda (opt name arg result)
|
||||
(alist-cons 'recursive #t result)))
|
||||
|
@ -69,9 +69,12 @@ Import and convert the Go module for PACKAGE-PATH.\n"))
|
|||
(alist-cons 'goproxy
|
||||
(string->symbol arg)
|
||||
(alist-delete 'goproxy result))))
|
||||
(option '("pin-versions") #f #f
|
||||
(lambda (opt name arg result)
|
||||
(alist-cons 'pin-versions? #t result)))
|
||||
%standard-import-options))
|
||||
|
||||
|
||||
|
||||
;;;
|
||||
;;; Entry point.
|
||||
;;;
|
||||
|
@ -93,25 +96,28 @@ Import and convert the Go module for PACKAGE-PATH.\n"))
|
|||
(_ #f))
|
||||
(reverse opts))))
|
||||
(match args
|
||||
((module-name)
|
||||
(if (assoc-ref opts 'recursive)
|
||||
(map (match-lambda
|
||||
((and ('package ('name name) . rest) pkg)
|
||||
`(define-public ,(string->symbol name)
|
||||
,pkg))
|
||||
(_ #f))
|
||||
(go-module-recursive-import module-name
|
||||
#:goproxy-url
|
||||
(or (assoc-ref opts 'goproxy)
|
||||
"https://proxy.golang.org")))
|
||||
(let ((sexp (go-module->guix-package module-name
|
||||
#:goproxy-url
|
||||
(or (assoc-ref opts 'goproxy)
|
||||
"https://proxy.golang.org"))))
|
||||
(unless sexp
|
||||
(leave (G_ "failed to download meta-data for module '~a'~%")
|
||||
module-name))
|
||||
sexp)))
|
||||
((spec) ;e.g., github.com/golang/protobuf@v1.3.1
|
||||
(receive (name version)
|
||||
(package-name->name+version spec)
|
||||
(let ((arguments (list name
|
||||
#:goproxy (assoc-ref opts 'goproxy)
|
||||
#:version version
|
||||
#:pin-versions?
|
||||
(assoc-ref opts 'pin-versions?))))
|
||||
(if (assoc-ref opts 'recursive)
|
||||
;; Recursive import.
|
||||
(map (match-lambda
|
||||
((and ('package ('name name) . rest) pkg)
|
||||
`(define-public ,(string->symbol name)
|
||||
,pkg))
|
||||
(_ #f))
|
||||
(apply go-module-recursive-import arguments))
|
||||
;; Single import.
|
||||
(let ((sexp (apply go-module->guix-package arguments)))
|
||||
(unless sexp
|
||||
(leave (G_ "failed to download meta-data for module '~a'~%")
|
||||
module-name))
|
||||
sexp)))))
|
||||
(()
|
||||
(leave (G_ "too few arguments~%")))
|
||||
((many ...)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue