aboutsummaryrefslogtreecommitdiff
path: root/guix-package.in
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-01-27 17:18:55 +0100
committerLudovic Courtès <ludo@gnu.org>2013-01-27 17:18:55 +0100
commitd9307267b3b4a87391e33daacef162745f057c3d (patch)
tree8aa72a440c39aa507936abfb1ed7d625e5ff3fd2 /guix-package.in
parent29767aaef67e78ca4ca80448725a4183146e463a (diff)
downloadguix-d9307267b3b4a87391e33daacef162745f057c3d.tar
guix-d9307267b3b4a87391e33daacef162745f057c3d.tar.gz
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.
Diffstat (limited to 'guix-package.in')
-rw-r--r--guix-package.in22
1 files changed, 17 insertions, 5 deletions
diff --git a/guix-package.in b/guix-package.in
index 37a1df0c11..caddae1392 100644
--- a/guix-package.in
+++ b/guix-package.in
@@ -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
;;;