packages: Allow package lookups with version prefixes.

* gnu/packages.scm (find-packages-by-name): Sort MATCHING according to
  'version>?'.  Use 'string-prefix?' instead of 'string=?' to compare
  against VERSION.
* doc/guix.texi (Invoking guix package): Add example and explanation.
This commit is contained in:
Ludovic Courtès 2015-04-18 22:30:07 +02:00
parent e7bf0e4465
commit 724311a26b
2 changed files with 12 additions and 5 deletions

View File

@ -962,7 +962,10 @@ Install the specified @var{package}s.
Each @var{package} may specify either a simple package name, such as Each @var{package} may specify either a simple package name, such as
@code{guile}, or a package name followed by a hyphen and version number, @code{guile}, or a package name followed by a hyphen and version number,
such as @code{guile-1.8.8}. If no version number is specified, the such as @code{guile-1.8.8} or simply @code{guile-1.8} (in the latter
case, the newest version prefixed by @code{1.8} is selected.)
If no version number is specified, the
newest available version will be selected. In addition, @var{package} newest available version will be selected. In addition, @var{package}
may contain a colon, followed by the name of one of the outputs of the may contain a colon, followed by the name of one of the outputs of the
package, as in @code{gcc:doc} or @code{binutils-2.22:lib} package, as in @code{gcc:doc} or @code{binutils-2.22:lib}

View File

@ -211,14 +211,18 @@ same package twice."
(let ((packages (delay (let ((packages (delay
(fold-packages (lambda (p r) (fold-packages (lambda (p r)
(vhash-cons (package-name p) p r)) (vhash-cons (package-name p) p r))
vlist-null)))) vlist-null)))
(version>? (lambda (p1 p2)
(version>? (package-version p1) (package-version p2)))))
(lambda* (name #:optional version) (lambda* (name #:optional version)
"Return the list of packages with the given NAME. If VERSION is not #f, "Return the list of packages with the given NAME. If VERSION is not #f,
then only return packages whose version is equal to VERSION." then only return packages whose version is prefixed by VERSION, sorted in
(let ((matching (vhash-fold* cons '() name (force packages)))) decreasing version order."
(let ((matching (sort (vhash-fold* cons '() name (force packages))
version>?)))
(if version (if version
(filter (lambda (package) (filter (lambda (package)
(string=? (package-version package) version)) (string-prefix? version (package-version package)))
matching) matching)
matching))))) matching)))))