summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/scripts/package.scm21
-rw-r--r--tests/guix-package.sh14
2 files changed, 29 insertions, 6 deletions
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 1ff898d8dd..fc116d8f6c 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -661,10 +661,20 @@ removed from MANIFEST."
(_ #f))
options))
-(define (maybe-register-gc-root store profile)
- "Register PROFILE as a GC root, unless it doesn't need it."
- (unless (string=? profile %current-profile)
- (add-indirect-root store (canonicalize-path profile))))
+(define (register-gc-root store profile)
+ "Register PROFILE, a profile generation symlink, as a GC root, unless it
+doesn't need it."
+ (define absolute
+ ;; We must pass the daemon an absolute file name for PROFILE. However, we
+ ;; cannot use (canonicalize-path profile) because that would return us the
+ ;; target of PROFILE in the store; using a store item as an indirect root
+ ;; would mean that said store item will always remain live, which is not
+ ;; what we want here.
+ (if (string-prefix? "/" profile)
+ profile
+ (string-append (getcwd) "/" profile)))
+
+ (add-indirect-root store absolute))
(define (readlink* file)
"Call 'readlink' until the result is not a symlink."
@@ -857,7 +867,8 @@ more information.~%"))
(count (length entries)))
(switch-symlinks name prof)
(switch-symlinks profile name)
- (maybe-register-gc-root (%store) profile)
+ (unless (string=? profile %current-profile)
+ (register-gc-root (%store) name))
(format #t (N_ "~a package in profile~%"
"~a packages in profile~%"
count)
diff --git a/tests/guix-package.sh b/tests/guix-package.sh
index 3959269d44..d4917bbf90 100644
--- a/tests/guix-package.sh
+++ b/tests/guix-package.sh
@@ -32,7 +32,7 @@ module_dir="t-guix-package-$$"
profile="t-profile-$$"
rm -f "$profile"
-trap 'rm "$profile" "$profile-"[0-9]* ; rm -rf "$module_dir" t-home-'"$$" EXIT
+trap 'rm -f "$profile" "$profile-"[0-9]* ; rm -rf "$module_dir" t-home-'"$$" EXIT
# Use `-e' with a non-package expression.
if guix package --bootstrap -e +;
@@ -203,6 +203,18 @@ if guix package -p "$profile" --delete-generations=12m;
then false; else true; fi
test "`readlink_base "$profile"`" = "$generation"
+# Make sure $profile is a GC root at this point.
+real_profile="`readlink -f "$profile"`"
+if guix gc -d "$real_profile"
+then false; else true; fi
+test -d "$real_profile"
+
+# Now, let's remove all the symlinks to $real_profile, and make sure
+# $real_profile is no longer a GC root.
+rm "$profile" "$profile"-[0-9]-link
+guix gc -d "$real_profile"
+[ ! -d "$real_profile" ]
+
#
# Try with the default profile.
#