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.
This commit is contained in:
parent
29767aaef6
commit
d9307267b3
@ -509,6 +509,11 @@ the last transaction.
|
||||
When combined with options such as @code{--install}, roll back occurs
|
||||
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}
|
||||
@itemx -p @var{profile}
|
||||
Use @var{profile} instead of the user's default profile.
|
||||
|
@ -220,14 +220,26 @@ all of PACKAGES, a list of name/version/output/path tuples."
|
||||
(symlink previous-profile pivot)
|
||||
(rename-file pivot profile)))
|
||||
|
||||
(cond ((zero? number)
|
||||
(cond ((not (file-exists? profile)) ; invalid profile
|
||||
(format (current-error-port)
|
||||
(_ "error: `~a' is not a valid profile~%")
|
||||
(_ "error: profile `~a' does not exist~%")
|
||||
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)))
|
||||
(leave (_ "error: no previous profile; not rolling back~%")))
|
||||
(else (switch-link)))))
|
||||
(let*-values (((drv-path drv)
|
||||
(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
|
||||
|
||||
|
||||
;;;
|
||||
|
@ -81,9 +81,14 @@ then
|
||||
test "`readlink_base "$profile"`" = "$profile-1-link"
|
||||
test -x "$profile/bin/guile" && ! test -x "$profile/bin/make"
|
||||
|
||||
# Failed attempt to roll back because there's no previous generation.
|
||||
if guix-package --roll-back -p "$profile";
|
||||
then false; else true; fi
|
||||
# Move to the empty profile.
|
||||
for i in `seq 1 3`
|
||||
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.
|
||||
guix-package --bootstrap -p "$profile" -i "$boot_make"
|
||||
@ -136,9 +141,15 @@ then
|
||||
test "`cd $HOME/.guix-profile ; pwd`" = "$first_environment"
|
||||
fi
|
||||
|
||||
# Failed attempt to roll back.
|
||||
if guix-package --bootstrap --roll-back;
|
||||
then false; else true; fi
|
||||
# Move to the empty profile.
|
||||
default_profile="`readlink "$HOME/.guix-profile"`"
|
||||
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.
|
||||
! guix-package install foo-bar
|
||||
|
Loading…
Reference in New Issue
Block a user