Message ID | e62cad4f0afd4f20d372be5c3b2c9bdabfbd2746.1626399943.git.iskarian@mgsn.dev |
---|---|
State | Accepted |
Headers | show |
Series | [bug#49591] import: go: Handle multiple go-import meta tags. | expand |
Context | Check | Description |
---|---|---|
cbaines/applying patch | fail | View Laminar job |
cbaines/issue | success | View issue |
Hello again, Sarah Morgensen via Guix-patches via <guix-patches@gnu.org> writes: > * guix/import/go.scm (fetch-module-meta-data): Parse all go-import meta > tags and return the first 'module-meta' with a matching import prefix. > [go-import->module-meta]: Extract parsing into new procedure. > --- > Hello Guix, > > It seems sometimes a module's go-get page contains multiple > > <meta name="go-import" ...> > > tags, for example the 'bazil.org/fuse' module. This causes a backtrace when > attempting to import such a module: > > $ guix import go bazil.org/fuse > following redirection to `https://bazil.org/fuse/?go-get=1'... > Backtrace: > 5 (primitive-load "/home/sarah/.config/guix/current/bin/g…") > In guix/ui.scm: > 2182:7 4 (run-guix . _) > 2145:10 3 (run-guix-command _ . _) > In guix/scripts/import.scm: > 120:11 2 (guix-import . _) > In guix/scripts/import/go.scm: > 118:27 1 (guix-import-go . _) > In guix/import/go.scm: > 467:4 0 (go-module->guix-package _ #:goproxy _ #:version _ # _) > > guix/import/go.scm:467:4: In procedure go-module->guix-package: > Throw to key `match-error' with args `("match" "no matching pattern" ((content "bazil.org/bazil git https://github.com/bazil/bazil") (content "bazil.org/fuse git https://github.com/bazil/fuse") (content "bazil.org/bolt-mount git https://github.com/bazil/bolt-mount") (content "bazil.org/zipfs git https://github.com/bazil/zipfs") (content "bazil.org/plop git https://github.com/bazil/plop")))'. > > > This patch makes the importer parse all such tags and search for one with an > import prefix that is a prefix of the module-path we are looking for. Good catch, LGTM! > (I attempted to add a unit test but could not figure out how to make the > record type accessible to the test script.) I started adding a new fixture for fixtures-go-bazil-org-fuse-test, but but I'm rusty as to where all these bits are pulled from. Perhaps it could be nice to add it, but otherwise it seems better in the mean time to fix apply this fix as-is. Committed with 5eba9c0960. Thank you! Closing. Maxim
diff --git a/guix/import/go.scm b/guix/import/go.scm index d8f838f635..182db0ecfb 100644 --- a/guix/import/go.scm +++ b/guix/import/go.scm @@ -460,17 +460,21 @@ Optionally include a VERSION string to append to the name." "Retrieve the module meta-data from its landing page. This is necessary because goproxy servers don't currently provide all the information needed to build a package." + (define (go-import->module-meta content-text) + (match (string-split content-text #\space) + ((root-path vcs repo-url) + (make-module-meta root-path (string->symbol vcs) + (strip-.git-suffix/maybe repo-url))))) ;; <meta name="go-import" content="import-prefix vcs repo-root"> (let* ((meta-data (http-fetch* (format #f "https://~a?go-get=1" module-path))) (select (sxpath `(// head (meta (@ (equal? (name "go-import")))) // content)))) (match (select (html->sxml meta-data #:strict? #t)) (() #f) ;nothing selected - (((content content-text)) - (match (string-split content-text #\space) - ((root-path vcs repo-url) - (make-module-meta root-path (string->symbol vcs) - (strip-.git-suffix/maybe repo-url)))))))) + ((('content content-text) ..1) + (find (lambda (meta) + (string-prefix? (module-meta-import-prefix meta) module-path)) + (map go-import->module-meta content-text)))))) (define (module-meta-data-repo-url meta-data goproxy) "Return the URL where the fetcher which will be used can download the