summary refs log tree commit diff
path: root/guix-package.in
diff options
context:
space:
mode:
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
 
 
 ;;;