[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
11/11: scripts: pull: Add options for generation management
From: |
guix-commits |
Subject: |
11/11: scripts: pull: Add options for generation management |
Date: |
Wed, 18 Sep 2019 17:10:38 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix.
commit da551107129d22dfb2a4278a55b702a7340e7f51
Author: Konrad Hinsen <address@hidden>
Date: Wed Sep 18 09:52:18 2019 +0200
scripts: pull: Add options for generation management
* guix/scripts/pull.scm (%options) Add --roll-back, --switch-generation,
--delete-generations
(process-generation-change): New function
(guix-pull): Execute generation management operations
* doc/guix.texi: Document the generation management operations
Signed-off-by: Ludovic Courtès <address@hidden>
---
doc/guix.texi | 47 +++++++++++++++++++++++++++++++++++++++++++++--
guix/scripts/pull.scm | 41 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 85 insertions(+), 3 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index da62194..0ed5907 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -3673,12 +3673,21 @@ Generation 3 Jun 13 2018 23:31:07 (current)
@xref{Invoking guix describe, @command{guix describe}}, for other ways to
describe the current status of Guix.
-This @code{~/.config/guix/current} profile works like any other profile
-created by @command{guix package} (@pxref{Invoking guix package}). That
+This @code{~/.config/guix/current} profile works exactly like the profiles
+created by @command{guix package} (@pxref{Invoking guix package}). That
is, you can list generations, roll back to the previous
generation---i.e., the previous Guix---and so on:
@example
+$ guix pull --roll-back
+switched from generation 3 to 2
+$ guix pull --delete-generations=1
+deleting /var/guix/profiles/per-user/charlie/current-guix-1-link
+@end example
+
+You can also use @command{guix package} (@pxref{Invoking guix package})
+to manage the profile by naming it explicitly:
+@example
$ guix package -p ~/.config/guix/current --roll-back
switched from generation 3 to 2
$ guix package -p ~/.config/guix/current --delete-generations=1
@@ -3724,6 +3733,40 @@ is provided, the subset of generations that match
@var{pattern}.
The syntax of @var{pattern} is the same as with @code{guix package
--list-generations} (@pxref{Invoking guix package}).
+@item --roll-back
+@cindex rolling back
+@cindex undoing transactions
+@cindex transactions, undoing
+Roll back to the previous @dfn{generation} of
@file{~/.config/guix/current}---i.e.,
+undo the last transaction.
+
+@item --switch-generation=@var{pattern}
+@itemx -S @var{pattern}
+@cindex generations
+Switch to a particular generation defined by @var{pattern}.
+
+@var{pattern} may be either a generation number or a number prefixed
+with ``+'' or ``-''. The latter means: move forward/backward by a
+specified number of generations. For example, if you want to return to
+the latest generation after @code{--roll-back}, use
+@code{--switch-generation=+1}.
+
+@item --delete-generations[=@var{pattern}]
+@itemx -d [@var{pattern}]
+When @var{pattern} is omitted, delete all generations except the current
+one.
+
+This command accepts the same patterns as @option{--list-generations}.
+When @var{pattern} is specified, delete the matching generations. When
+@var{pattern} specifies a duration, generations @emph{older} than the
+specified duration match. For instance, @code{--delete-generations=1m}
+deletes generations that are more than one month old.
+
+If the current generation matches, it is @emph{not} deleted.
+
+Note that deleting generations prevents rolling back to them.
+Consequently, this command must be used with care.
+
@xref{Invoking guix describe}, for a way to display information about the
current generation only.
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
index 4b03cea..c9835ce 100644
--- a/guix/scripts/pull.scm
+++ b/guix/scripts/pull.scm
@@ -38,7 +38,8 @@
#:use-module (guix git)
#:use-module (git)
#:use-module (gnu packages)
- #:use-module ((guix scripts package) #:select (build-and-use-profile))
+ #:use-module ((guix scripts package) #:select (build-and-use-profile
+ delete-matching-generations))
#:use-module ((gnu packages base) #:select (canonical-package))
#:use-module (gnu packages guile)
#:use-module ((gnu packages bootstrap)
@@ -92,6 +93,14 @@ Download and deploy the latest version of Guix.\n"))
-l, --list-generations[=PATTERN]
list generations matching PATTERN"))
(display (G_ "
+ --roll-back roll back to the previous generation"))
+ (display (G_ "
+ -d, --delete-generations[=PATTERN]
+ delete generations matching PATTERN"))
+ (display (G_ "
+ -S, --switch-generation=PATTERN
+ switch to a generation matching PATTERN"))
+ (display (G_ "
-p, --profile=PROFILE use PROFILE instead of ~/.config/guix/current"))
(display (G_ "
-v, --verbosity=LEVEL use the given verbosity LEVEL"))
@@ -120,6 +129,18 @@ Download and deploy the latest version of Guix.\n"))
(lambda (opt name arg result)
(cons `(query list-generations ,arg)
result)))
+ (option '("roll-back") #f #f
+ (lambda (opt name arg result)
+ (cons '(generation roll-back)
+ result)))
+ (option '(#\S "switch-generation") #t #f
+ (lambda (opt name arg result)
+ (cons `(generation switch ,arg)
+ result)))
+ (option '(#\d "delete-generations") #f #t
+ (lambda (opt name arg result)
+ (cons `(generation delete ,arg)
+ result)))
(option '(#\N "news") #f #f
(lambda (opt name arg result)
(cons '(query display-news) result)))
@@ -505,6 +526,22 @@ list of package changes.")))))
(display-profile-news profile
#:current-is-newer? #t))))
+(define (process-generation-change opts profile)
+ "Process a request to change the current generation (roll-back, switch,
delete)."
+ (unless (assoc-ref opts 'dry-run?)
+ (match (assoc-ref opts 'generation)
+ (('roll-back)
+ (with-store store
+ (roll-back* store profile)))
+ (('switch pattern)
+ (let ((number (relative-generation-spec->number profile pattern)))
+ (if number
+ (switch-to-generation* profile number)
+ (leave (G_ "cannot switch to generation '~a'~%") pattern))))
+ (('delete pattern)
+ (with-store store
+ (delete-matching-generations store profile pattern))))))
+
(define (channel-list opts)
"Return the list of channels to use. If OPTS specify a channel file,
channels are read from there; otherwise, if ~/.config/guix/channels.scm
@@ -572,6 +609,8 @@ Use '~/.config/guix/channels.scm' instead."))
(profile (or (assoc-ref opts 'profile) %current-profile)))
(cond ((assoc-ref opts 'query)
(process-query opts profile))
+ ((assoc-ref opts 'generation)
+ (process-generation-change opts profile))
(else
(with-store store
(ensure-default-profile)
- branch master updated (cf48ea9 -> da55110), guix-commits, 2019/09/18
- 04/11: gnu: Add python-jupyter-protocol., guix-commits, 2019/09/18
- 06/11: gnu: Add python-jupyter-kernel-test., guix-commits, 2019/09/18
- 01/11: guix package: "guix package -f FILE" ensures FILE returns a package., guix-commits, 2019/09/18
- 02/11: linux-container: 'eval/container' correctly passes -L and -C flags., guix-commits, 2019/09/18
- 05/11: gnu: Add python-jupyter-kernel-mgmt., guix-commits, 2019/09/18
- 08/11: doc: Mention the "repository name" for 'guix pack -f docker'., guix-commits, 2019/09/18
- 07/11: gnu: Add Xeus., guix-commits, 2019/09/18
- 03/11: gnu: nlohmann-json-cpp: Update to 3.7.0., guix-commits, 2019/09/18
- 09/11: import: pypi: Refresher recognizes pythonhosted.org source URLs., guix-commits, 2019/09/18
- 11/11: scripts: pull: Add options for generation management,
guix-commits <=
- 10/11: pull: Work around Ubuntu's 'sudo'., guix-commits, 2019/09/18