guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Update: Implementing guix system rollback / switch-generation


From: Ludovic Courtès
Subject: Re: Update: Implementing guix system rollback / switch-generation
Date: Tue, 12 Jul 2016 17:30:26 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Hello Chris,

Chris Marusich <address@hidden> skribis:

> I've attached a preliminary patch which adds rudimentary roll-back and
> switch-generation commands to "guix system".  Currently, the commands
> just flip symlinks, which is part of the first milestone that Ludo
> suggested in the following thread:
>
> https://lists.gnu.org/archive/html/guix-devel/2016-06/msg00178.html

Awesome!

> Please let me know what you think.  After getting feedback, I intend to
> follow up a more complete patch that contains the following additional
> changes:
>
> * Regenerate grub.cfg, to complete the first milestone.  I'm not sure
>   exactly how this will play out, but I imagine I'll need to use the
>   store somehow to get it done.
>
> * Use a properly formatted ChangeLog-style Git commit message.
>
> * Mention these new commands in the manual.
>
> * Add tests.  I'm not new to automated testing, but I haven't done it
>   using autoconf/make or in Guile, so tips here would be welcome!
>
> * Add these new commands to the emacs interface.

Sounds good to me.

Automated tests for this will be a bit difficult because we don’t have
any ‘guix system’ tests yet.  I think this should be done in the new
system test infrastructure.

However, since you’ve done extensive manual testing, this part shouldn’t
block you.  We can add it at a later point.

> I've tested the changes on my bare metal GuixSD installation.  I would
> have used a VM, but my system has trouble launching VMs.  I first
> verified manually that the roll-back command switched the profile's
> symlink to the previous generation, by examining the output of
> list-generations and ls.  I then verified, in the same way, that the
> switch-generation command switched the profile's symlink to the
> specified generation.  I verified that switch-generation works for
> arbitrary numbers and relative numbers (note that a negative relative
> number must be preceded by the special "--" argument to prevent it from
> being interpreted as an option).  I also verified that if the user
> attempts to switch to a nonexistent generation (or to roll back from
> generation 1 in the case of "guix system"), an error is raised without
> modifying anything.  I repeated this manual verification process for
> both the "guix system" and "guix package" commands, since my changes
> involve some refactoring in "guix package".

Perfect.

> +(define (relative-generation-spec->number profile spec)
> +  "Return PROFILE's generation specified by SPEC, which is a string.  The 
> SPEC
> +may be a N, -N, or +N, where N is a number.  If the spec is N, then the 
> number
> +returned is N.  If it is -N, then the number returned is the profile's 
> current
> +generation number minus N.  If it is +N, then the number returned is the
> +profile's current generation number plus N.  Return #f if there is no such
> +generation."
> +  (let ((number (string->number spec)))
> +    (and number
> +         (case (string-ref spec 0)
> +           ((#\+ #\-)
> +            (relative-generation profile number))
> +           (else number)))))

(Refactored from (guix scripts package).)  Could you make this
refactoring in a separate patch?  It LGTM.

>  (define (switch-to-generation profile number)
>    "Atomically switch PROFILE to the generation NUMBER.  Return the number of
> -the generation that was current before switching."
> +the generation that was current before switching.  Raise a
> +&profile-not-found-error when the profile does not exist.  Raise a
> +&missing-generation-error when the generation does not exist."

Could you add the docstring in a separate patch?

(Isolating changes like this can be tedious but it simplifies review and
bisecting should a regression be introduced.)

>  (define (show-help)
> -  (display (_ "Usage: guix system [OPTION] ACTION [FILE]
> -Build the operating system declared in FILE according to ACTION.\n"))
> +  (display (_ "Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]
> +Build the operating system declared in FILE according to ACTION.
> +Some ACTIONS support additional ARGS.\n"))
>    (newline)
>    (display (_ "The valid values for ACTION are:\n"))
>    (newline)
>    (display (_ "\
> -   reconfigure      switch to a new operating system configuration\n"))
> +   reconfigure       switch to a new operating system configuration\n"))
> +  (display (_ "\
> +   roll-back         switch to the previous operating system 
> configuration\n"))
>    (display (_ "\
> -   list-generations list the system generations\n"))
> +   switch-generation switch to a generation matching a pattern\n"))
>    (display (_ "\
> -   build            build the operating system without installing 
> anything\n"))
> +   list-generations  list the system generations\n"))
>    (display (_ "\
> -   container        build a container that shares the host's store\n"))
> +   build             build the operating system without installing 
> anything\n"))
>    (display (_ "\
> -   vm               build a virtual machine image that shares the host's 
> store\n"))
> +   container         build a container that shares the host's store\n"))
>    (display (_ "\
> -   vm-image         build a freestanding virtual machine image\n"))
> +   vm                build a virtual machine image that shares the host's 
> store\n"))
>    (display (_ "\
> -   disk-image       build a disk image, suitable for a USB stick\n"))
> +   vm-image          build a freestanding virtual machine image\n"))
>    (display (_ "\
> -   init             initialize a root file system to run GNU\n"))
> +   disk-image        build a disk image, suitable for a USB stick\n"))
>    (display (_ "\
> -   extension-graph  emit the service extension graph in Dot format\n"))
> +   init              initialize a root file system to run GNU\n"))
>    (display (_ "\
> -   shepherd-graph   emit the graph of shepherd services in Dot format\n"))
> +   extension-graph   emit the service extension graph in Dot format\n"))
> +  (display (_ "\
> +   shepherd-graph    emit the graph of shepherd services in Dot format\n"))

Not sure what happened here.  :-)  Please avoid reformatting such
strings; they are translated so changing them makes translations stale.

Otherwise looks like Milestone #1 is already close to completion!

Thank you,
Ludo’.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]