I think sometimes it may be useful to select generations for a
particular period of time.

>From 91cbf61d8cfb978a877f8c9f1b2174ffd3616556 Mon Sep 17 00:00:00 2001
From: Alex Kost <alez...@gmail.com>
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 01a5712..7f72ff7 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 15a26de..e9c1e00 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 7e26876..b2f6335 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 f99c2ba..8787814 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 a142516..b91a88d 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
-- 
2.1.2

Reply via email to