summary refs log tree commit diff
path: root/gnu/packages.scm
diff options
context:
space:
mode:
authorMathieu Lirzin <mthl@gnu.org>2016-02-28 17:50:58 +0100
committerMathieu Lirzin <mthl@gnu.org>2016-03-02 21:41:41 +0100
commitfad155d47ea22c7ffd042ffddd03b0a6babd3b65 (patch)
tree118ffda1b1700dcb741b883fd13dc36014ef7331 /gnu/packages.scm
parentb134a80c36b973aa67072a542e9a01cf97975443 (diff)
downloadguix-fad155d47ea22c7ffd042ffddd03b0a6babd3b65.tar.gz
packages: Factorize package specification search.
* gnu/packages.scm (%find-package): New procedure.
(specification->package, specification->package+output): Use it.
Diffstat (limited to 'gnu/packages.scm')
-rw-r--r--gnu/packages.scm66
1 files changed, 31 insertions, 35 deletions
diff --git a/gnu/packages.scm b/gnu/packages.scm
index 64a695d970..9b111eda28 100644
--- a/gnu/packages.scm
+++ b/gnu/packages.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2013 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -276,26 +277,31 @@ return its return value."
                     (lambda (k signum)
                       (handler signum))))
 
+
+;;;
+;;; Package specification.
+;;;
+
+(define (%find-package spec name version)
+  (match (find-best-packages-by-name name version)
+    ((pkg . pkg*)
+     (unless (null? pkg*)
+       (warning (_ "ambiguous package specification `~a'~%") spec)
+       (warning (_ "choosing ~a from ~a~%")
+                (package-full-name pkg)
+                (location->string (package-location pkg))))
+     pkg)
+    (_
+     (if version
+         (leave (_ "~A: package not found for version ~a~%") name version)
+         (leave (_ "~A: unknown package~%") name)))))
+
 (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))))))
+  (let-values (((name version) (package-name->name+version spec)))
+    (%find-package spec name version)))
 
 (define* (specification->package+output spec #:optional (output "out"))
   "Return the package and output specified by SPEC, or #f and #f; SPEC may
@@ -308,24 +314,14 @@ optionally contain a version number and an output name, as in these examples:
 
 If SPEC does not specify a version number, return the preferred newest
 version; if SPEC does not specify an output, return OUTPUT."
-  (define (ensure-output p sub-drv)
-    (if (member sub-drv (package-outputs p))
-        sub-drv
-        (leave (_ "package `~a' lacks output `~a'~%")
-               (package-full-name p)
-               sub-drv)))
-
   (let-values (((name version sub-drv)
                 (package-specification->name+version+output spec output)))
-    (match (find-best-packages-by-name name version)
-      ((p)
-       (values p (ensure-output p sub-drv)))
-      ((p p* ...)
-       (warning (_ "ambiguous package specification `~a'~%")
-                spec)
-       (warning (_ "choosing ~a from ~a~%")
-                (package-full-name p)
-                (location->string (package-location p)))
-       (values p (ensure-output p sub-drv)))
-      (()
-       (leave (_ "~a: package not found~%") spec)))))
+    (match (%find-package spec name version)
+      (#f
+       (values #f #f))
+      (package
+       (if (member sub-drv (package-outputs package))
+           (values package sub-drv)
+           (leave (_ "package `~a' lacks output `~a'~%")
+                  (package-full-name package)
+                  sub-drv))))))