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 /guix | |
parent | 0820098d1ccf63e3e8b44df67dcb4236b78975c6 (diff) | |
download | gnu-guix-3f26bfc18a70a65443688d7724e5f97c53855c01.tar gnu-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 'guix')
-rw-r--r-- | guix/scripts/build.scm | 58 | ||||
-rw-r--r-- | guix/scripts/package.scm | 15 |
2 files changed, 24 insertions, 49 deletions
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm index dd9a9b8127..1c6dce0539 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -32,8 +32,7 @@ #:use-module (srfi srfi-26) #:use-module (srfi srfi-34) #:use-module (srfi srfi-37) - #:autoload (gnu packages) (find-packages-by-name - find-newest-available-packages) + #:autoload (gnu packages) (find-best-packages-by-name) #:export (guix-build)) (define %store @@ -57,6 +56,27 @@ derivation of a package." ((? procedure? proc) (run-with-store (%store) (proc) #:system system)))) +(define (specification->package spec) + "Return a package matching SPEC. SPEC may be a package name, or a package +name followed by a hyphen and a version number. If the version number is not +present, return the preferred newest version." + (let-values (((name version) + (package-name->name+version spec))) + (match (find-best-packages-by-name name version) + ((p) ; one match + p) + ((p x ...) ; several matches + (warning (_ "ambiguous package specification `~a'~%") spec) + (warning (_ "choosing ~a from ~a~%") + (package-full-name p) + (location->string (package-location p))) + p) + (_ ; no matches + (if version + (leave (_ "~A: package not found for version ~a~%") + name version) + (leave (_ "~A: unknown package~%") name)))))) + ;;; ;;; Command-line options. @@ -212,38 +232,6 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) (leave (_ "failed to create GC root `~a': ~a~%") root (strerror (system-error-errno args))))))) - (define newest-available-packages - (memoize find-newest-available-packages)) - - (define (find-best-packages-by-name name version) - (if version - (find-packages-by-name name version) - (match (vhash-assoc name (newest-available-packages)) - ((_ version pkgs ...) pkgs) - (#f '())))) - - (define (find-package request) - ;; Return a package matching REQUEST. REQUEST may be a package - ;; name, or a package name followed by a hyphen and a version - ;; number. If the version number is not present, return the - ;; preferred newest version. - (let-values (((name version) - (package-name->name+version request))) - (match (find-best-packages-by-name name version) - ((p) ; one match - p) - ((p x ...) ; several matches - (warning (_ "ambiguous package specification `~a'~%") request) - (warning (_ "choosing ~a from ~a~%") - (package-full-name p) - (location->string (package-location p))) - p) - (_ ; no matches - (if version - (leave (_ "~A: package not found for version ~a~%") - name version) - (leave (_ "~A: unknown package~%") name)))))) - (with-error-handling ;; Ask for absolute file names so that .drv file names passed from the ;; user to 'read-derivation' are absolute when it returns. @@ -268,7 +256,7 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) ;; Nothing to do; maybe for --log-file. #f) (('argument . (? string? x)) - (let ((p (find-package x))) + (let ((p (specification->package x))) (if src? (let ((s (package-source p))) (package-source-derivation diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm index 49fa457a9c..8c197a741e 100644 --- a/guix/scripts/package.scm +++ b/guix/scripts/package.scm @@ -292,19 +292,6 @@ return its return value." (format (current-error-port) " interrupted by signal ~a~%" SIGINT) #f)))) -(define newest-available-packages - (memoize find-newest-available-packages)) - -(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 (newest-available-packages)) - ((_ version pkgs ...) pkgs) - (#f '())))) - (define* (specification->package+output spec #:optional (output "out")) "Find the package and output specified by SPEC, or #f and #f; SPEC may optionally contain a version number and an output name, as in these examples: @@ -342,7 +329,7 @@ version; if SPEC does not specify an output, return OUTPUT." "Return #t if there's a version of package NAME newer than CURRENT-VERSION, or if the newest available version is equal to CURRENT-VERSION but would have an output path different than CURRENT-PATH." - (match (vhash-assoc name (newest-available-packages)) + (match (vhash-assoc name (find-newest-available-packages)) ((_ candidate-version pkg . rest) (case (version-compare candidate-version current-version) ((>) #t) |