summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2016-01-04 22:27:38 +0100
committerLudovic Courtès <ludo@gnu.org>2016-01-05 00:28:42 +0100
commitdb5a94445f3b21b307c73ea72ed495bda891ef28 (patch)
tree8a9367de0e41b6742a47f46a36e751d102b5f934 /guix
parentd28ef4393719692371aee085d5723f5779cb6049 (diff)
guix package: Allow multiple '--search' flags.
* guix/scripts/package.scm (find-packages-by-description): Change 'rx' parameter to 'regexps'. [matches-all?, matches-one?]: New procedures. Use them. (process-query): Collect regexps from all 'search' queries, and pass them to 'find-packages-by-description'. * tests/guix-package.sh: Add tests. * doc/guix.texi (Invoking guix package): Document it.
Diffstat (limited to 'guix')
-rw-r--r--guix/scripts/package.scm33
1 files changed, 20 insertions, 13 deletions
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index d0b5abd0e2..02eb600c43 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2013, 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
@@ -230,21 +230,24 @@ specified in MANIFEST, a manifest object."
;;; Package specifications.
;;;
-(define (find-packages-by-description rx)
- "Return the list of packages whose name, synopsis, or description matches
-RX."
+(define (find-packages-by-description regexps)
+ "Return the list of packages whose name matches one of REGEXPS, or whose
+synopsis or description matches all of REGEXPS."
(define version<? (negate version>=?))
+ (define (matches-all? str)
+ (every (cut regexp-exec <> str) regexps))
+
+ (define (matches-one? str)
+ (find (cut regexp-exec <> str) regexps))
+
(sort
(fold-packages (lambda (package result)
- (define matches?
- (cut regexp-exec rx <>))
-
- (if (or (matches? (package-name package))
+ (if (or (matches-one? (package-name package))
(and=> (package-synopsis package)
- (compose matches? P_))
+ (compose matches-all? P_))
(and=> (package-description package)
- (compose matches? P_)))
+ (compose matches-all? P_)))
(cons package result)
result))
'())
@@ -696,11 +699,15 @@ processed, #f otherwise."
(package-name p2))))))
#t))
- (('search regexp)
- (let ((regexp (make-regexp* regexp regexp/icase)))
+ (('search _)
+ (let* ((patterns (filter-map (match-lambda
+ (('query 'search rx) rx)
+ (_ #f))
+ opts))
+ (regexps (map (cut make-regexp* <> regexp/icase) patterns)))
(leave-on-EPIPE
(for-each (cute package->recutils <> (current-output-port))
- (find-packages-by-description regexp)))
+ (find-packages-by-description regexps)))
#t))
(('show requested-name)