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.
This commit is contained in:
Ludovic Courtès 2022-03-14 18:20:31 +01:00
parent 4b451813f7
commit f54f2aa9df
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
3 changed files with 36 additions and 18 deletions

@ -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)))))

@ -334,24 +334,8 @@ Alternately, see @command{guix package --search-paths -p ~s}.")
"Search among all the versions of ENTRY's package that are available, and
return the shortest unambiguous version prefix for this package. If only one
version of ENTRY's package is available, return the empty string."
(let ((name (manifest-entry-name entry)))
(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 ENTRY.
"")
(versions
;; If ENTRY uses 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, which could
;; differ from the packages available in the revision that was used
;; to build MANIFEST.
(let ((current (manifest-entry-version entry)))
(if (every (cut version>? current <>)
(delete current versions))
""
(version-unique-prefix (manifest-entry-version entry)
versions)))))))
(package-unique-version-prefix (manifest-entry-name entry)
(manifest-entry-version entry)))
(define* (export-manifest manifest
#:optional (port (current-output-port)))

@ -1923,6 +1923,19 @@
(package-location (specification->package "guile@2"))
(specification->location "guile@2"))
(test-equal "package-unique-version-prefix, gcc@8"
"8"
(let ((gcc (specification->package "gcc-toolchain@8")))
(package-unique-version-prefix (package-name gcc)
(package-version gcc))))
(test-equal "package-unique-version-prefix, grep"
""
(let ((grep (specification->package "grep")))
(package-unique-version-prefix (package-name grep)
(package-version grep))))
(test-eq "this-package-input, exists"
hello
(package-arguments