aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2022-03-14 18:20:31 +0100
committerLudovic Courtès <ludo@gnu.org>2022-04-04 22:58:03 +0200
commitf54f2aa9df5047b348ca104f5145af50c1a482f6 (patch)
tree0cba8a8b405861fdabaefa4eba5276c47247599d /gnu/packages.scm
parent4b451813f7c5677086772e29a66a8265ec0ca2c7 (diff)
downloadguix-f54f2aa9df5047b348ca104f5145af50c1a482f6.tar
guix-f54f2aa9df5047b348ca104f5145af50c1a482f6.tar.gz
packages: Add 'package-unique-version-prefix'.
* gnu/packages.scm (package-unique-version-prefix): New procedure. * guix/scripts/package.scm (manifest-entry-version-prefix): Use it. * tests/packages.scm ("package-unique-version-prefix, gcc@8") ("package-unique-version-prefix, grep"): New tests.
Diffstat (limited to 'gnu/packages.scm')
-rw-r--r--gnu/packages.scm21
1 files changed, 21 insertions, 0 deletions
diff --git a/gnu/packages.scm b/gnu/packages.scm
index 65ab7a7c1e..2ba838fd0a 100644
--- a/gnu/packages.scm
+++ b/gnu/packages.scm
@@ -66,6 +66,8 @@
specification->location
specifications->manifest
+ package-unique-version-prefix
+
generate-package-cache))
;;; Commentary:
@@ -559,3 +561,22 @@ output."
;; fiddle with multiple-value returns.
(packages->manifest
(map (compose list specification->package+output) specs)))
+
+(define (package-unique-version-prefix name version)
+ "Search among all the versions of package NAME that are available, and
+return the shortest unambiguous version prefix to designate VERSION. If only
+one version of the package is available, return the empty string."
+ (match (map package-version (find-packages-by-name name))
+ ((_)
+ ;; A single version of NAME is available, so do not specify the version
+ ;; number, even if the available version doesn't match VERSION.
+ "")
+ (versions
+ ;; If VERSION is the latest version, don't specify any version.
+ ;; Otherwise return the shortest unique version prefix. Note that this
+ ;; is based on the currently available packages so the result may vary
+ ;; over time.
+ (if (every (cut version>? version <>)
+ (delete version versions))
+ ""
+ (version-unique-prefix version versions)))))