guix_mirror_bot pushed a commit to branch master
in repository guix.

commit 6aaed933bf63d6bc1f404124906cdd20ac67d3ba
Author: Nicolas Graves <[email protected]>
AuthorDate: Tue Sep 16 15:46:13 2025 +0200

    import: utils: Add generate-git-source procedure.
    
    This procedure tries to generate a <origin> sexp from a single url and
    version.
    
    * guix/import/utils.scm (generate-git-source): Add procedure.
    * tests/import/utils.scm: Add tests for generate-git-source.
    
    Signed-off-by: Ludovic Courtès <[email protected]>
---
 guix/import/utils.scm  | 19 +++++++++++++++++++
 tests/import/utils.scm | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index 77ea1ed1fa..0590ed1990 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -78,6 +78,7 @@
             git-origin
             git->origin
             default-git-error
+            generate-git-source
 
             package-names->package-inputs
             maybe-inputs
@@ -238,6 +239,24 @@ LOCATION."
     (_
      #f)))
 
+(define (generate-git-source repository version error-procedure)
+  "Try to download a given VERSION from a REPOSITORY url twice.  Call
+ERROR-PROCEDURE if both attempts fail."
+  (catch 'git-error
+    (lambda ()
+      (git->origin repository
+                   (peekable-lambda (version)
+                     (string-append "v" version))
+                   version))
+    (lambda (key . args)
+      ;; If tag fails, try with plain version string.
+      (catch 'git-error
+        (lambda ()
+          (git->origin repository
+                       (peekable-lambda (version) version)
+                       version))
+        error-procedure))))
+
 (define %spdx-license-identifiers
   ;; https://spdx.org/licenses/
   ;; The gfl1.0, nmap, repoze
diff --git a/tests/import/utils.scm b/tests/import/utils.scm
index 72f8e059a2..b631ba2326 100644
--- a/tests/import/utils.scm
+++ b/tests/import/utils.scm
@@ -26,8 +26,10 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix build-system)
+  #:use-module (guix tests git)
   #:use-module (gnu packages)
   #:use-module (srfi srfi-64)
+  #:use-module (srfi srfi-71)
   #:use-module (ice-9 match))
 
 (test-begin "import-utils")
@@ -302,4 +304,44 @@ Differences are hard to spot, e.g. in CLOS vs. GOOPS."))
   (let ((home-page "https://github.com/user/repo";))
     ((default-git-error home-page) '(some-other-error "message"))))
 
+;;;
+;;; generate-git-source
+;;;
+
+(define (test-generate-git-source git-version version)
+  "Helper to test generate-git-source. Creates a temporary git repository with
+GIT-VERSION tag, attempts to generate source for VERSION, and returns two
+values: the git-source commit S-expression, and a boolean indicating if the
+error procedure has been called."
+  (with-temporary-git-repository directory
+      `((add "README" "Initial commit")
+        (commit "First commit")
+        (tag ,git-version ,version))
+    (mock ((guix import utils) git-repository-url? (const #t))
+          (let* ((error-called? #f)
+                 (error-proc (lambda args
+                               (set! error-called? #t)
+                               #f)))
+            (match (generate-git-source directory version error-proc)
+              (`(origin
+                  (method git-fetch)
+                  (uri (git-reference (url ,url)
+                                      (commit ,commit-sexp)))
+                  . ,rest)
+               (values commit-sexp error-called?))
+              (_
+               (values #f error-called?)))))))
+
+(test-equal "generate-git-source: version with 'v' prefix tag"
+  '(string-append "v" version)
+  (test-generate-git-source "v1.0.0" "1.0.0"))
+
+(test-equal "generate-git-source: version without 'v' prefix tag"
+  'version
+  (test-generate-git-source "1.0.0" "1.0.0"))
+
+(test-assert "generate-git-source: calls error-procedure when tag not found"
+  (let ((sexp error-called? (test-generate-git-source "1.0.0" "2.0.0")))
+    error-called?))
+
 (test-end "import-utils")

Reply via email to