From 6da60453e25f3941202ab51f74821c9ed7299bca Mon Sep 17 00:00:00 2001 From: Hartmut Goebel Date: Thu, 30 Jun 2022 11:05:13 +0200 Subject: import: git: Allow updating to a specific version. * guix/import/git.scm (latest-tag): Add #:version argument. If version is given, try to find the respective version tag. (latest-git-tag-version): Add #:version argument and pass it on to called functions. (latest-releease) Rename to 'import-release', add #:version argument and pass it on to called functions. --- guix/import/git.scm | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'guix/import/git.scm') diff --git a/guix/import/git.scm b/guix/import/git.scm index bb5ba4d97e..c15943bd7c 100644 --- a/guix/import/git.scm +++ b/guix/import/git.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2021 Xinglu Chen ;;; Copyright © 2021 Sarah Morgensen ;;; Copyright © 2022 Maxime Devos +;;; Copyright © 2022 Hartmut Goebel ;;; ;;; This file is part of GNU Guix. ;;; @@ -146,9 +147,11 @@ (define (entry tag) %pre-release-rx)) @@ -169,13 +172,22 @@ (define (pre-release? tag) ((null? versions->tags) (git-no-valid-tags-error)) (else - (match (last versions->tags) - ((version . tag) - (values version tag))))))) - -(define (latest-git-tag-version package) + (let ((versions (if version + (filter (match-lambda + ((candidate-version . tag) + (string=? version candidate-version))) + versions->tags) + versions->tags))) + (if (null? versions) + (values #f #f) + (match (last versions) + ((version . tag) + (values version tag))))))))) + +(define* (latest-git-tag-version package #:key (version #f)) "Given a PACKAGE, return the latest version of it and the corresponding git -tag, or #false and #false if the latest version could not be determined." +tag, or #false and #false if the latest version could not be determined. +Optionally include a VERSION string to fetch a specific version." (guard (c ((or (git-no-tags-error? c) (git-no-valid-tags-error? c)) (warning (or (package-field-location package 'source) (package-location package)) @@ -193,6 +205,7 @@ (define (latest-git-tag-version package) (url (git-reference-url (origin-uri source))) (property (cute assq-ref (package-properties package) <>))) (latest-tag url + #:version version #:prefix (property 'release-tag-prefix) #:suffix (property 'release-tag-suffix) #:delim (property 'release-tag-version-delimiter) @@ -206,12 +219,14 @@ (define (git-package? package) (git-reference? (origin-uri origin)))) (_ #f))) -(define (latest-git-release package) - "Return an for the latest release of PACKAGE." +(define* (import-git-release package #:key (version #f)) + "Return an for the latest release of PACKAGE. +Optionally include a VERSION string to fetch a specific version." (let* ((name (package-name package)) (old-version (package-version package)) (old-reference (origin-uri (package-source package))) - (new-version new-version-tag (latest-git-tag-version package))) + (new-version new-version-tag + (latest-git-tag-version package #:version version))) (and new-version new-version-tag (upstream-source (package name) @@ -226,4 +241,4 @@ (define %generic-git-updater (name 'generic-git) (description "Updater for packages hosted on Git repositories") (pred git-package?) - (import latest-git-release))) + (import import-git-release))) -- cgit v1.2.3