From: Alex Kost <alezost@gmail.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: guix-devel@gnu.org
Subject: [PATCH] emacs: Add support for deleting generations.
Date: Sun, 05 Oct 2014 12:54:05 +0400 [thread overview]
Message-ID: <87k34ekic2.fsf_-_@gmail.com> (raw)
In-Reply-To: <87eguninyx.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Sat, 04 Oct 2014 22:23:02 +0200")
[-- Attachment #1: Type: text/plain, Size: 3116 bytes --]
Ludovic Courtès (2014-10-05 00:23 +0400) wrote:
> Hi!
>
> Alex Kost <alezost@gmail.com> skribis:
>
>> What about the attached patch? Some comments and questions:
>>
>> - I added 'store' argument to the exported procedures, however it is
>> used only in one particular case: when we need to create an empty
>> profile (i.e. to call ‘link-to-empty-profile’). Is there a way to
>> avoid using 'store' argument there or is it fine to leave it like
>> this?
>
> For now it’s fine to leave it like this, with the ‘store’ argument.
> Eventually it should be changed to use the monadic style, though.
I read the info manual about gexps and monads. However I don't really
understand how to use monadic style here, sorry.
>> - I actually need only ‘delete-generations’ procedure for Emacs UI, but
>> I think other procedures are also worth to be exported or not?
>
> Yes, sure.
Thanks.
>> - Perhaps there is a better place for those functions than
>> (guix scripts package)?
>
> Yes, (guix profiles) would be a better place IMO.
OK.
>> - (Not related to this patch, but still …) Currently with “roll-back”,
>> we can only switch to the previous generation. What about adding a
>> possibility to switch to any generation? So that we could use
>> something like this:
>>
>> guix package --switch-generation=7
>>
>> Also such functionality can be added to Emacs UI: for example pressing
>> "C" on a generation in *Guix Generation List* will make this
>> generation the current one.
>>
>> So ‘roll-back’ procedure may become a special case of the
>> ‘switch-generation’ one. WDYT?
>
> I think it’s a good idea! (I think it was suggested in earlier
> discussions, but never implemented.)
Great, I think I can make it, but without monads :-(
>> From c50d1674d3be699198afb649a2a9932ca44c89bc Mon Sep 17 00:00:00 2001
>> From: Alex Kost <alezost@gmail.com>
>> Date: Sat, 4 Oct 2014 20:45:35 +0400
>> Subject: [PATCH] guix package: Export generation procedures.
>>
>> * guix/scripts/package.scm: Export 'roll-back', 'delete-generation',
>> 'delete-generations'.
>> (link-to-empty-profile, roll-back): Add 'store' argument.
>> (delete-generations): New procedure.
>> (guix-package): Adjust accordingly.
>> [delete-generation]: Move to the top level. Add 'store' and 'profile'
>> arguments.
>> [display-and-delete]: Move to 'delete-generation'.
>
> OK to commit.
>
> To sum up, I would imagine two followups to this:
>
> 1. Move these procedures to (guix profiles).
> 2. Convert them to monadic style.
>
> WDYT?
I like the idea of using monads there, but as I said I'm too week (I
mean "month" (I mean "weak")) for writing that.
Also those followups would make my commit totally redundant, no?
Wouldn't it be better to make a commit for adding the monadic functions
to (guix profiles) directly?
However if you still allow me to push this commit, I think I can also
push the attached one with the changes for Emacs UI now (if it looks OK
for you).
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-emacs-Add-support-for-deleting-generations.patch --]
[-- Type: text/x-diff, Size: 4811 bytes --]
From c335cdf17a97d07cc3d4149fa7dc13882d16cc87 Mon Sep 17 00:00:00 2001
From: Alex Kost <alezost@gmail.com>
Date: Sun, 5 Oct 2014 12:31:23 +0400
Subject: [PATCH] emacs: Add support for deleting generations.
* doc/emacs.texi (emacs List buffer): Mention new key bindings.
* emacs/guix-base.el (guix-delete-generations): New procedure.
* emacs/guix-info.el (guix-generation-info-insert-number): Use it.
* emacs/guix-list.el (guix-generation-list-mark-delete,
guix-generation-list-execute): New procedures.
* emacs/guix-main.scm (delete-generations*): New procedure.
---
doc/emacs.texi | 5 +++++
emacs/guix-base.el | 14 ++++++++++++++
emacs/guix-info.el | 6 ++++--
emacs/guix-list.el | 19 ++++++++++++++++++-
emacs/guix-main.scm | 6 ++++++
5 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/doc/emacs.texi b/doc/emacs.texi
index 3c5698f..4176f2e 100644
--- a/doc/emacs.texi
+++ b/doc/emacs.texi
@@ -205,6 +205,11 @@ List packages installed in the current generation.
@item i
Describe marked generations (display available information in a
``generation-info'' buffer).
+@item d
+Mark the current generation for deletion (with prefix, mark all
+generations).
+@item x
+Execute actions on the marked generations (i.e.@: delete generations).
@end table
@node emacs Info buffer
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index 8da7835..d31fb79 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -801,6 +801,20 @@ Return non-nil, if the operation should be continued; nil otherwise."
guix-operation-option-separator)))
(force-mode-line-update))
+(defun guix-delete-generations (&rest generations)
+ "Delete GENERATIONS.
+Each element from GENERATIONS is a generation number."
+ (when (or (not guix-operation-confirm)
+ (y-or-n-p
+ (let ((count (length generations)))
+ (if (> count 1)
+ (format "Delete %d generations? " count)
+ (format "Delete generation number %d? "
+ (car generations))))))
+ (guix-eval-in-repl
+ (guix-make-guile-expression
+ 'delete-generations* guix-current-profile generations))))
+
(provide 'guix-base)
;;; guix-base.el ends here
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index d0a320f..d5226b1 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -627,8 +627,10 @@ ENTRY is an alist with package info."
(guix-info-insert-indent)
(guix-info-insert-action-button
"Delete"
- (lambda (btn) (error "Sorry, not implemented yet"))
- "Delete this generation"))
+ (lambda (btn)
+ (guix-delete-generations (button-get btn 'number)))
+ "Delete this generation"
+ 'number number))
(provide 'guix-info)
diff --git a/emacs/guix-list.el b/emacs/guix-list.el
index 6a4cdfc..4b4b9c5 100644
--- a/emacs/guix-list.el
+++ b/emacs/guix-list.el
@@ -728,8 +728,9 @@ Also see `guix-package-info-type'."
(let ((map guix-generation-list-mode-map))
(define-key map (kbd "RET") 'guix-generation-list-show-packages)
+ (define-key map (kbd "x") 'guix-generation-list-execute)
(define-key map (kbd "i") 'guix-list-describe)
- (define-key map (kbd "d") 'guix-generation-list-mark-delete-simple))
+ (define-key map (kbd "d") 'guix-generation-list-mark-delete))
(defun guix-generation-list-show-packages ()
"List installed packages for the generation at point."
@@ -737,6 +738,22 @@ Also see `guix-package-info-type'."
(guix-get-show-entries 'list guix-package-list-type 'generation
(guix-list-current-id)))
+(defun guix-generation-list-mark-delete (&optional arg)
+ "Mark the current generation for deletion and move to the next line.
+With ARG, mark all generations for deletion."
+ (interactive "P")
+ (if arg
+ (guix-list-mark-all 'delete)
+ (guix-list-mark 'delete t)))
+
+(defun guix-generation-list-execute ()
+ "Delete marked generations."
+ (interactive)
+ (let ((marked (guix-list-get-marked-id-list 'delete)))
+ (or marked
+ (user-error "No generations marked for deletion"))
+ (apply #'guix-delete-generations marked)))
+
(provide 'guix-list)
;;; guix-list.el ends here
diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm
index 026a9e9..24ca4d1 100644
--- a/emacs/guix-main.scm
+++ b/emacs/guix-main.scm
@@ -815,3 +815,9 @@ OUTPUTS is a list of package outputs (may be an empty list)."
"~a packages in profile~%"
count)
count)))))))))
+
+(define (delete-generations* profile generations)
+ "Delete GENERATIONS from PROFILE.
+GENERATIONS is a list of generation numbers."
+ (let ((store (open-connection)))
+ (delete-generations store profile generations)))
--
2.1.2
next prev parent reply other threads:[~2014-10-05 8:54 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-25 17:58 Emacs interface for Guix Alex Kost
2014-07-25 20:36 ` Ludovic Courtès
2014-07-26 17:44 ` Alex Kost
2014-07-28 10:15 ` Alex Kost
2014-08-11 20:54 ` Ludovic Courtès
2014-08-12 10:19 ` [PATCH] " Alex Kost
2014-08-12 14:19 ` Ludovic Courtès
2014-08-12 16:20 ` Alex Kost
2014-08-12 19:50 ` Ludovic Courtès
2014-08-13 6:57 ` Alex Kost
2014-08-13 16:03 ` Ludovic Courtès
2014-08-13 20:58 ` Alex Kost
2014-08-15 5:51 ` Alex Kost
2014-08-16 9:27 ` Ludovic Courtès
2014-08-16 10:52 ` [PATCH] manifest-transaction Alex Kost
2014-08-20 12:10 ` [PATCH] profiles: Report about upgrades Alex Kost
2014-08-23 11:58 ` Ludovic Courtès
2014-08-30 19:56 ` Ludovic Courtès
2014-08-31 6:04 ` Alex Kost
2014-08-31 19:57 ` Ludovic Courtès
2014-08-31 22:54 ` Jason Self
2014-09-01 7:13 ` Alex Kost
2014-09-02 19:45 ` Ludovic Courtès
[not found] ` <87egvrke1z.fsf@gmail.com>
2014-09-04 19:37 ` Ludovic Courtès
2014-08-16 12:24 ` [PATCH] Emacs interface for Guix Ludovic Courtès
2014-08-16 13:07 ` Alex Kost
2014-08-19 21:00 ` Ludovic Courtès
2014-08-20 10:54 ` Alex Kost
2014-08-22 8:56 ` Ludovic Courtès
2014-08-22 12:44 ` Alex Kost
2014-08-27 8:34 ` Ludovic Courtès
2014-10-04 17:59 ` [PATCH] guix package: Export generation procedures Alex Kost
2014-10-04 20:23 ` Ludovic Courtès
2014-10-05 8:54 ` Alex Kost [this message]
2014-10-05 13:14 ` [PATCH] emacs: Add support for deleting generations Ludovic Courtès
2014-10-05 18:23 ` Alex Kost
2014-10-05 19:20 ` Ludovic Courtès
2014-10-05 20:04 ` Alex Kost
2014-10-06 7:36 ` Ludovic Courtès
2014-10-06 14:14 ` [PATCH] guix package: Add '--switch-generation' option Alex Kost
2014-10-06 19:27 ` Ludovic Courtès
2014-10-07 10:04 ` Alex Kost
2014-10-07 16:00 ` Ludovic Courtès
2014-10-07 21:32 ` Alex Kost
2014-10-08 9:44 ` Ludovic Courtès
2014-10-05 14:44 ` [PATCH] guix package: Export generation procedures Andreas Enge
2014-10-05 19:21 ` Ludovic Courtès
2014-07-26 20:58 ` Emacs interface for Guix Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87k34ekic2.fsf_-_@gmail.com \
--to=alezost@gmail.com \
--cc=guix-devel@gnu.org \
--cc=ludo@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).