https://go.dev/ref/mod says a module in a subdirectory has a tag prefixed with the subdirectory.
* guix/import/go.scm (version+subdirectory->tag-name): New variable. (vcs->origin): New argument module-path-subdirectory. --- guix/import/go.scm | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/guix/import/go.scm b/guix/import/go.scm index d00c13475a..6fae1994b8 100644 --- a/guix/import/go.scm +++ b/guix/import/go.scm @@ -521,28 +521,30 @@ tag." `(tag-or-commit . ,reference))))) (file-hash* checkout #:algorithm algorithm #:recursive? #true))) -(define (vcs->origin vcs-type vcs-repo-url version) +(define (version+subdirectory->tag-name version subdirectory) + (if (string=? subdirectory "") + version + (string-append (substring subdirectory 1) "/" version))) + +(define (vcs->origin vcs-type vcs-repo-url module-path-subdirectory version) "Generate the `origin' block of a package depending on what type of source control system is being used." (case vcs-type ((git) - (let ((plain-version? (string=? version (go-version->git-ref version))) - (v-prefixed? (string-prefix? "v" version))) + (let ((git-commit (if (string=? version (go-version->git-ref version)) + (version+subdirectory->tag-name + version module-path-subdirectory) + (go-version->git-ref version)))) `(origin (method git-fetch) (uri (git-reference (url ,vcs-repo-url) - ;; This is done because the version field of the package, - ;; which the generated quoted expression refers to, has been - ;; stripped of any 'v' prefixed. - (commit ,(if (and plain-version? v-prefixed?) - '(string-append "v" version) - '(go-version->git-ref version))))) + (commit ,git-commit))) (file-name (git-file-name name version)) (sha256 (base32 ,(bytevector->nix-base32-string - (git-checkout-hash vcs-repo-url (go-version->git-ref version) + (git-checkout-hash vcs-repo-url git-commit (hash-algorithm sha256)))))))) ((hg) `(origin @@ -621,6 +623,8 @@ When VERSION is unspecified, the latest version available is used." (match:prefix (string-match "([\\./]v[0-9]+)?$" module-path))) (guix-name (go-module->guix-package-name module-path)) (root-module-path (module-path->repository-root module-path)) + (module-path-subdirectory + (substring module-path (string-length root-module-path))) ;; The VCS type and URL are not included in goproxy information. For ;; this we need to fetch it from the official module page. (meta-data (fetch-module-meta-data root-module-path)) @@ -634,7 +638,7 @@ When VERSION is unspecified, the latest version available is used." (name ,guix-name) (version ,(strip-v-prefix version*)) (source - ,(vcs->origin vcs-type vcs-repo-url version*)) + ,(vcs->origin vcs-type vcs-repo-url module-path-subdirectory version*)) (build-system go-build-system) (arguments '(#:import-path ,module-path -- 2.30.2