From 189cea2782df67ea048a3982be69c8b1ff9762e9 Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Thu, 16 Oct 2014 21:35:47 +0400 Subject: [PATCH] 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. --- doc/emacs.texi | 5 +++++ emacs/guix-base.el | 6 +++++- emacs/guix-main.scm | 11 ++++++++++- emacs/guix-utils.el | 8 ++++++++ emacs/guix.el | 12 ++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/doc/emacs.texi b/doc/emacs.texi index 01a5712f3b..7f72ff7a17 100644 --- a/doc/emacs.texi +++ b/doc/emacs.texi @@ -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 diff --git a/emacs/guix-base.el b/emacs/guix-base.el index 15a26de01e..e9c1e00245 100644 --- a/emacs/guix-base.el +++ b/emacs/guix-base.el @@ -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." diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm index 7e26876dfa..b2f63351f0 100644 --- a/emacs/guix-main.scm +++ b/emacs/guix-main.scm @@ -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: diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el index f99c2ba884..878781489e 100644 --- a/emacs/guix-utils.el +++ b/emacs/guix-utils.el @@ -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 diff --git a/emacs/guix.el b/emacs/guix.el index a1425161c4..b91a88dc14 100644 --- a/emacs/guix.el +++ b/emacs/guix.el @@ -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