summary refs log tree commit diff
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.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
 
 
 ;;;