guix-package: When rolling back to nothingness, point to the empty profile.

Suggested by Andreas Enge <andreas@enge.fr> at
<http://lists.gnu.org/archive/html/bug-guix/2013-01/msg00316.html>.

* guix-package.in (roll-back): Check whether PROFILE is valid using
  `file-exists?'.  When NUMBER is zero, just emit a notice.  When
  PREVIOUS-NUMBER is zero and PREVIOUS-PROFILE does not exist, build the
  empty profile, and link to it.
* tests/guix-package.sh: Add tests.
* doc/guix.texi (Invoking guix-package): Document the new behavior.
master
Ludovic Courtès 2013-01-27 17:18:55 +01:00
parent 29767aaef6
commit d9307267b3
3 changed files with 39 additions and 11 deletions

View File

@ -509,6 +509,11 @@ the last transaction.
When combined with options such as @code{--install}, roll back occurs When combined with options such as @code{--install}, roll back occurs
before any other actions. before any other actions.
When rolling back from the first generation that actually contains
installed packages, the profile is made to point to the @dfn{empty
profile}, also known as @dfn{profile zero}---i.e., it contains no files
apart from its own meta-data.
@item --profile=@var{profile} @item --profile=@var{profile}
@itemx -p @var{profile} @itemx -p @var{profile}
Use @var{profile} instead of the user's default profile. Use @var{profile} instead of the user's default profile.

View File

@ -220,14 +220,26 @@ all of PACKAGES, a list of name/version/output/path tuples."
(symlink previous-profile pivot) (symlink previous-profile pivot)
(rename-file pivot profile))) (rename-file pivot profile)))
(cond ((zero? number) (cond ((not (file-exists? profile)) ; invalid profile
(format (current-error-port) (format (current-error-port)
(_ "error: `~a' is not a valid profile~%") (_ "error: profile `~a' does not exist~%")
profile)) profile))
((or (zero? previous-number) ((zero? number) ; empty profile
(format (current-error-port)
(_ "nothing to do: already at the empty profile~%")))
((or (zero? previous-number) ; going to emptiness
(not (file-exists? previous-profile))) (not (file-exists? previous-profile)))
(leave (_ "error: no previous profile; not rolling back~%"))) (let*-values (((drv-path drv)
(else (switch-link))))) (profile-derivation (%store) '()))
((prof)
(derivation-output-path
(assoc-ref (derivation-outputs drv) "out"))))
(when (not (build-derivations (%store) (list drv-path)))
(leave (_ "failed to build the empty profile~%")))
(symlink prof previous-profile)
(switch-link)))
(else (switch-link))))) ; anything else
;;; ;;;

View File

@ -81,9 +81,14 @@ then
test "`readlink_base "$profile"`" = "$profile-1-link" test "`readlink_base "$profile"`" = "$profile-1-link"
test -x "$profile/bin/guile" && ! test -x "$profile/bin/make" test -x "$profile/bin/guile" && ! test -x "$profile/bin/make"
# Failed attempt to roll back because there's no previous generation. # Move to the empty profile.
if guix-package --roll-back -p "$profile"; for i in `seq 1 3`
then false; else true; fi do
guix-package --bootstrap --roll-back -p "$profile"
! test -f "$profile/bin"
! test -f "$profile/lib"
test "`readlink_base "$profile"`" = "$profile-0-link"
done
# Reinstall after roll-back to generation 1. # Reinstall after roll-back to generation 1.
guix-package --bootstrap -p "$profile" -i "$boot_make" guix-package --bootstrap -p "$profile" -i "$boot_make"
@ -136,9 +141,15 @@ then
test "`cd $HOME/.guix-profile ; pwd`" = "$first_environment" test "`cd $HOME/.guix-profile ; pwd`" = "$first_environment"
fi fi
# Failed attempt to roll back. # Move to the empty profile.
if guix-package --bootstrap --roll-back; default_profile="`readlink "$HOME/.guix-profile"`"
then false; else true; fi for i in `seq 1 3`
do
guix-package --bootstrap --roll-back
! test -f "$HOME/.guix-profile/bin"
! test -f "$HOME/.guix-profile/lib"
test "`readlink "$default_profile"`" = "$default_profile-0-link"
done
# Extraneous argument. # Extraneous argument.
! guix-package install foo-bar ! guix-package install foo-bar