~ruther/guix-local

83aab70b2d4d11fa345c1fbf2ccdbec8b7ad6662 — Alex Kost 10 years ago cefb7ae
emacs: Add 'guix-packages-by-license' command.

* emacs/guix-main.scm (packages-by-license): New procedure.
(%patterns-makers): Add 'license' search type.
* emacs/guix-messages.el (guix-message-packages-by-license): New procedure.
(guix-messages): Use it.
* emacs/guix-ui-package.el (guix-packages-by-license): New command.
* doc/emacs.texi (Emacs Commands): Document it.
4 files changed, 41 insertions(+), 0 deletions(-)

M doc/emacs.texi
M emacs/guix-main.scm
M emacs/guix-messages.el
M emacs/guix-ui-package.el
M doc/emacs.texi => doc/emacs.texi +3 -0
@@ 158,6 158,9 @@ but cannot be found among available packages).
@item M-x guix-packages-by-name
Display package(s) with the specified name.

@item M-x guix-packages-by-license
Display package(s) with the specified license.

@item M-x guix-search-by-regexp
Search for packages by a specified regexp.  By default ``name'',
``synopsis'' and ``description'' of the packages will be searched.  This

M emacs/guix-main.scm => emacs/guix-main.scm +11 -0
@@ 403,6 403,12 @@ MATCH-PARAMS is a list of parameters that REGEXP can match."
  (let ((re (make-regexp regexp regexp/icase)))
    (matching-packages (cut package-match? <> re))))

(define (packages-by-license license)
  "Return a list of packages with LICENSE."
  (matching-packages
   (lambda (package)
     (memq license (list-maybe (package-license package))))))

(define (all-available-packages)
  "Return a list of all available packages."
  (matching-packages (const #t)))


@@ 663,6 669,9 @@ ENTRIES is a list of installed manifest entries."
         (manifest-output-proc  (apply-to-first manifest-output-patterns))
         (regexp-proc           (lambda (_ regexp params . __)
                                  (packages-by-regexp regexp params)))
         (license-proc          (lambda (_ license-name)
                                  (packages-by-license
                                   (lookup-license license-name))))
         (all-proc              (lambda _ (all-available-packages)))
         (newest-proc           (lambda _ (newest-available-packages))))
    `((package


@@ 671,6 680,7 @@ ENTRIES is a list of installed manifest entries."
       (installed        . ,manifest-package-proc)
       (obsolete         . ,(apply-to-first obsolete-package-patterns))
       (regexp           . ,regexp-proc)
       (license          . ,license-proc)
       (all-available    . ,all-proc)
       (newest-available . ,newest-proc))
      (output


@@ 679,6 689,7 @@ ENTRIES is a list of installed manifest entries."
       (installed        . ,manifest-output-proc)
       (obsolete         . ,(apply-to-first obsolete-output-patterns))
       (regexp           . ,regexp-proc)
       (license          . ,license-proc)
       (all-available    . ,all-proc)
       (newest-available . ,newest-proc)))))


M emacs/guix-messages.el => emacs/guix-messages.el +15 -0
@@ 36,6 36,10 @@
     (name
      ,(lambda (_ entries names)
         (guix-message-packages-by-name entries 'package names)))
     (license
      ,(lambda (_ entries licenses)
         (apply #'guix-message-packages-by-license
                entries 'package licenses)))
     (regexp
      (0 "No packages matching '%s'." val)
      (1 "A single package matching '%s'." val)


@@ 64,6 68,10 @@
     (name
      ,(lambda (_ entries names)
         (guix-message-packages-by-name entries 'output names)))
     (license
      ,(lambda (_ entries licenses)
         (apply #'guix-message-packages-by-license
                entries 'output licenses)))
     (regexp
      (0 "No package outputs matching '%s'." val)
      (1 "A single package output matching '%s'." val)


@@ 159,6 167,13 @@ Try \"M-x guix-search-by-name\"."
                            (guix-message-string-name (car names))))))
    (message "%s %s." str-beg str-end)))

(defun guix-message-packages-by-license (entries entry-type license)
  "Display a message for packages or outputs searched by LICENSE."
  (let* ((count (length entries))
         (str-beg (guix-message-string-entries count entry-type))
         (str-end (format "with license '%s'" license)))
    (message "%s %s." str-beg str-end)))

(defun guix-message-generations-by-time (profile entries times)
  "Display a message for generations searched by TIMES."
  (let* ((count (length entries))

M emacs/guix-ui-package.el => emacs/guix-ui-package.el +12 -0
@@ 35,6 35,7 @@
(require 'guix-entry)
(require 'guix-utils)
(require 'guix-hydra-build)
(require 'guix-read)
(require 'guix-license)

(guix-ui-define-entry-type package)


@@ 933,6 934,17 @@ Interactively with prefix, prompt for PROFILE."
  (guix-package-get-display profile 'name name))

;;;###autoload
(defun guix-packages-by-license (license &optional profile)
  "Display Guix packages with LICENSE.
LICENSE is a license name string.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
  (interactive
   (list (guix-read-license-name)
         (guix-ui-read-profile)))
  (guix-package-get-display profile 'license license))

;;;###autoload
(defun guix-search-by-regexp (regexp &optional params profile)
  "Search for Guix packages by REGEXP.
PARAMS are package parameters that should be searched.