summaryrefslogtreecommitdiff
path: root/gnu/packages.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-12-21 22:36:32 +0100
committerLudovic Courtès <ludo@gnu.org>2013-12-21 22:36:32 +0100
commit3f26bfc18a70a65443688d7724e5f97c53855c01 (patch)
tree71c1928fbced3aeb99c2b5a1b9bb2f0a62bdf30b /gnu/packages.scm
parent0820098d1ccf63e3e8b44df67dcb4236b78975c6 (diff)
downloadguix-patches-3f26bfc18a70a65443688d7724e5f97c53855c01.tar
guix-patches-3f26bfc18a70a65443688d7724e5f97c53855c01.tar.gz
Factorize package search between 'guix package' and 'guix build'.
* guix/scripts/package.scm (newest-available-packages): Remove. (find-best-packages-by-name): Move to... * gnu/packages.scm (find-best-packages-by-name): ... here. (find-newest-available-packages): Memoize. * guix/scripts/build.scm (specification->package): New procedure, formerly called 'find-package' within 'guix-build'. (guix-build): Adjust accordingly.
Diffstat (limited to 'gnu/packages.scm')
-rw-r--r--gnu/packages.scm43
1 files changed, 28 insertions, 15 deletions
diff --git a/gnu/packages.scm b/gnu/packages.scm
index e9f2540b91..8365a00051 100644
--- a/gnu/packages.scm
+++ b/gnu/packages.scm
@@ -33,6 +33,7 @@
%bootstrap-binaries-path
fold-packages
find-packages-by-name
+ find-best-packages-by-name
find-newest-available-packages))
;;; Commentary:
@@ -148,24 +149,36 @@ then only return packages whose version is equal to VERSION."
result))
'()))
-(define (find-newest-available-packages)
- "Return a vhash keyed by package names, and with
+(define find-newest-available-packages
+ (memoize
+ (lambda ()
+ "Return a vhash keyed by package names, and with
associated values of the form
(newest-version newest-package ...)
where the preferred package is listed first."
- ;; FIXME: Currently, the preferred package is whichever one
- ;; was found last by 'fold-packages'. Find a better solution.
- (fold-packages (lambda (p r)
- (let ((name (package-name p))
- (version (package-version p)))
- (match (vhash-assoc name r)
- ((_ newest-so-far . pkgs)
- (case (version-compare version newest-so-far)
- ((>) (vhash-cons name `(,version ,p) r))
- ((=) (vhash-cons name `(,version ,p ,@pkgs) r))
- ((<) r)))
- (#f (vhash-cons name `(,version ,p) r)))))
- vlist-null))
+ ;; FIXME: Currently, the preferred package is whichever one
+ ;; was found last by 'fold-packages'. Find a better solution.
+ (fold-packages (lambda (p r)
+ (let ((name (package-name p))
+ (version (package-version p)))
+ (match (vhash-assoc name r)
+ ((_ newest-so-far . pkgs)
+ (case (version-compare version newest-so-far)
+ ((>) (vhash-cons name `(,version ,p) r))
+ ((=) (vhash-cons name `(,version ,p ,@pkgs) r))
+ ((<) r)))
+ (#f (vhash-cons name `(,version ,p) r)))))
+ vlist-null))))
+
+(define (find-best-packages-by-name name version)
+ "If version is #f, return the list of packages named NAME with the highest
+version numbers; otherwise, return the list of packages named NAME and at
+VERSION."
+ (if version
+ (find-packages-by-name name version)
+ (match (vhash-assoc name (find-newest-available-packages))
+ ((_ version pkgs ...) pkgs)
+ (#f '()))))