~ruther/guix-local

d9307267b3b4a87391e33daacef162745f057c3d — Ludovic Courtès 13 years ago 29767aa
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.
3 files changed, 39 insertions(+), 11 deletions(-)

M doc/guix.texi
M guix-package.in
M tests/guix-package.sh
M doc/guix.texi => doc/guix.texi +5 -0
@@ 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.

M guix-package.in => guix-package.in +17 -5
@@ 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


;;;

M tests/guix-package.sh => tests/guix-package.sh +17 -6
@@ 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