~ruther/guix-local

189cea2782df67ea048a3982be69c8b1ff9762e9 — Alex Kost 11 years ago 347e17b
emacs: Add 'guix-generations-by-time' command.

* emacs/guix-main.scm (find-generations): Add finding generations by time.
* emacs/guix-utils.el (guix-read-date): New procedure.
* emacs/guix-base.el (guix-messages): Add new messages.
* emacs/guix.el (guix-generations-by-time): New command.
* doc/emacs.texi (emacs Commands): Document it.
5 files changed, 40 insertions(+), 2 deletions(-)

M doc/emacs.texi
M emacs/guix-base.el
M emacs/guix-main.scm
M emacs/guix-utils.el
M emacs/guix.el
M doc/emacs.texi => doc/emacs.texi +5 -0
@@ 102,6 102,11 @@ can be changed by modifying @code{guix-search-params} variable.
List generations for the current profile.  With numeric prefix, show so
many last generations.

@item M-x guix-generations-by-time
List generations matching time period.  You'll be prompted for the
period using Org mode time prompt based on Emacs calendar (@pxref{The
date/time prompt,,, org, Org Mode Manual}).

@end table

By default commands for displaying packages display each output on a

M emacs/guix-base.el => emacs/guix-base.el +5 -1
@@ 626,7 626,11 @@ This function will not update the information, use
     (all
      (0 "No available generations.")
      (1 "A single available generation.")
      (many "%d available generations." count)))))
      (many "%d available generations." count))
     (time
      (0 "Generations not found.")
      (1 "A single generation matching time period.")
      (many "%d generations matching time period." count)))))

(defun guix-result-message (entries entry-type search-type search-vals)
  "Display an appropriate message after displaying ENTRIES."

M emacs/guix-main.scm => emacs/guix-main.scm +10 -1
@@ 669,6 669,15 @@ If NUMBER is 0 or less, return all generations."
     (last-generations profile (car search-vals)))
    ((all)
     (last-generations profile +inf.0))
    ((time)
     (match search-vals
       ((from to)
        (matching-generations
         profile
         (lambda (gen)
           (let ((time (time-second (generation-time profile gen))))
             (< from time to)))))
       (_ '())))
    (else (search-type-error "generation" search-type))))

(define (generation-sexps profile params search-type search-vals)


@@ 696,7 705,7 @@ SEARCH-TYPE should be one of the following symbols:
  'installed', 'obsolete', 'generation'.

- If ENTRY-TYPE is 'generation':
  'id', 'last', 'all'.
  'id', 'last', 'all', 'time'.

PARAMS is a list of parameters for receiving.  If it is an empty list,
get information with all available parameters, which are:

M emacs/guix-utils.el => emacs/guix-utils.el +8 -0
@@ 138,6 138,14 @@ split it into several short lines."
                             hist def inherit-input-method)
   :test #'string=))

(declare-function org-read-date "org" t)

(defun guix-read-date (prompt)
  "Prompt for a date or time using `org-read-date'.
Return time value."
  (require 'org)
  (org-read-date nil t nil prompt))

(defun guix-get-key-val (alist &rest keys)
  "Return value from ALIST by KEYS.
ALIST is alist of alists of alists ... which can be consecutively

M emacs/guix.el => emacs/guix.el +12 -0
@@ 31,6 31,7 @@
(require 'guix-base)
(require 'guix-list)
(require 'guix-info)
(require 'guix-utils)

(defgroup guix nil
  "Interface for Guix package manager."


@@ 134,6 135,17 @@ Interactively, NUMBER is defined by a numeric prefix."
      (guix-get-show-generations 'last number)
    (guix-get-show-generations 'all)))

;;;###autoload
(defun guix-generations-by-time (from to)
  "Display information about generations created between FROM and TO.
FROM and TO should be time values."
  (interactive
   (list (guix-read-date "Find generations (from): ")
         (guix-read-date "Find generations (to): ")))
  (guix-get-show-generations 'time
                             (float-time from)
                             (float-time to)))

(provide 'guix)

;;; guix.el ends here