summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2022-01-09 22:36:38 +0100
committerLudovic Courtès <ludo@gnu.org>2022-01-09 23:17:17 +0100
commitc1db66fa0a17ee81e084038007db556626875bc4 (patch)
tree35ea3bbbb705917ec9692f519daaeda995b145ea
parentd1e3c96759407a4d7db8f5975b0e78941a0e64c4 (diff)
downloadguix-c1db66fa0a17ee81e084038007db556626875bc4.tar.gz
import: go: Correctly report diagnostics upon version mismatch.
* guix/import/go.scm (strip-v-prefix, ensure-v-prefix)
(validate-version): New procedures.
(go-module->guix-package): Use 'validate-version' when defining
'version*'.  Remove 'else' clause in SRFI-34 guard.
-rw-r--r--guix/import/go.scm60
1 files changed, 39 insertions, 21 deletions
diff --git a/guix/import/go.scm b/guix/import/go.scm
index c7673e6a1a..d00c13475a 100644
--- a/guix/import/go.scm
+++ b/guix/import/go.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2020 Helio Machado <0x2b3bfa0+guix@googlemail.com>
 ;;; Copyright © 2021 François Joulaud <francois.joulaud@radiofrance.com>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
-;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2021-2022 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
@@ -41,6 +41,7 @@
   #:autoload   (guix base32) (bytevector->nix-base32-string)
   #:autoload   (guix build utils) (mkdir-p)
   #:autoload   (gcrypt hash) (hash-algorithm sha256)
+  #:use-module (ice-9 format)
   #:use-module (ice-9 match)
   #:use-module (ice-9 peg)
   #:use-module (ice-9 rdelim)
@@ -54,6 +55,7 @@
   #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
   #:use-module (sxml match)
   #:use-module ((sxml xpath) #:renamer (lambda (s)
                                          (if (eq? 'filter s)
@@ -569,6 +571,34 @@ control system is being used."
       (formatted-message (G_ "unsupported vcs type '~a' for package '~a'")
                          vcs-type vcs-repo-url)))))
 
+(define (strip-v-prefix version)
+  "Strip from VERSION the \"v\" prefix that Go uses."
+  (string-trim version #\v))
+
+(define (ensure-v-prefix version)
+  "Add a \"v\" prefix to VERSION if it does not already have one."
+  (if (string-prefix? "v" version)
+      version
+      (string-append "v" version)))
+
+(define (validate-version version available-versions module-path)
+  "Raise an error if VERSION is not among AVAILABLE-VERSIONS, unless VERSION
+is a pseudo-version.  Return VERSION."
+  ;; Pseudo-versions do not appear in the versions list; skip the
+  ;; following check.
+  (if (or (go-pseudo-version? version)
+          (member version available-versions))
+      version
+      (raise
+       (make-compound-condition
+        (formatted-message (G_ "version ~a of ~a is not available~%")
+                           version module-path available-versions)
+        (condition (&fix-hint
+                    (hint (format #f (G_ "Pick one of the following \
+available versions:~{ ~a~}.")
+                                  (map strip-v-prefix
+                                       available-versions)))))))))
+
 (define* (go-module->guix-package module-path #:key
                                   (goproxy "https://proxy.golang.org")
                                   version
@@ -577,17 +607,11 @@ control system is being used."
 The meta-data is fetched from the GOPROXY server and https://pkg.go.dev/.
 When VERSION is unspecified, the latest version available is used."
   (let* ((available-versions (go-module-available-versions goproxy module-path))
-         (version* (or version
-                       (go-module-version-string goproxy module-path))) ;latest
-         ;; Elide the "v" prefix Go uses.
-         (strip-v-prefix (cut string-trim <> #\v))
-         ;; Pseudo-versions do not appear in the versions list; skip the
-         ;; following check.
-         (_ (unless (or (go-pseudo-version? version*)
-                        (member version* available-versions))
-              (error (format #f "error: version ~s is not available
-hint: use one of the following available versions ~a\n"
-                             version* available-versions))))
+         (version* (validate-version
+                    (or (and version (ensure-v-prefix version))
+                        (go-module-version-string goproxy module-path)) ;latest
+                    available-versions
+                    module-path))
          (content (fetch-go.mod goproxy module-path version*))
          (dependencies+versions (go.mod-requirements (parse-go.mod content)))
          (dependencies (if pin-versions?
@@ -628,10 +652,10 @@ hint: use one of the following available versions ~a\n"
         (synopsis ,synopsis)
         (description ,(and=> description beautify-description))
         (license ,(match (list->licenses licenses)
-                    (() #f)                        ;unknown license
-                    ((license)                     ;a single license
+                    (() #f)                       ;unknown license
+                    ((license)                    ;a single license
                      license)
-                    ((license ...)     ;a list of licenses
+                    ((license ...)                ;a list of licenses
                      `(list ,@license)))))
      (if pin-versions?
          dependencies+versions
@@ -651,12 +675,6 @@ This package and its dependencies won't be imported.~%")
                           (uri->string (http-get-error-uri c))
                           (http-get-error-code c)
                           (http-get-error-reason c))
-                 (values #f '()))
-                (else
-                 (warning (G_ "Failed to import package ~s.
-reason: ~s.~%")
-                          package-name
-                          (exception-args c))
                  (values #f '())))
         (apply go-module->guix-package args)))))