diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-12-21 22:36:32 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-12-21 22:36:32 +0100 |
commit | 3f26bfc18a70a65443688d7724e5f97c53855c01 (patch) | |
tree | 71c1928fbced3aeb99c2b5a1b9bb2f0a62bdf30b /gnu | |
parent | 0820098d1ccf63e3e8b44df67dcb4236b78975c6 (diff) | |
download | guix-3f26bfc18a70a65443688d7724e5f97c53855c01.tar guix-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')
-rw-r--r-- | gnu/packages.scm | 43 |
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 '())))) |