aboutsummaryrefslogtreecommitdiff
path: root/home-manager
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager')
-rw-r--r--home-manager/home-manager14
1 files changed, 12 insertions, 2 deletions
diff --git a/home-manager/home-manager b/home-manager/home-manager
index 2fbf057f873..8e0bd40c2d5 100644
--- a/home-manager/home-manager
+++ b/home-manager/home-manager
@@ -77,8 +77,18 @@ function doBuild() {
function doSwitch() {
local generation
local exitCode=0
-
- generation=$(doBuild "--no-out-link") && $generation/activate || exitCode=1
+ local wrkdir
+
+ # Build the generation and run the activate script. Note, we
+ # specify an output link si that it is treated as a GC root. This
+ # prevents an unfortunately timed GC from removing the generation
+ # before activation completes.
+ wrkdir="$(mktemp -d)"
+ generation=$(doBuild "-o $wrkdir/result") && $generation/activate || exitCode=1
+
+ # Because the previous command never fails, the script keeps
+ # running and $wrkdir is always removed.
+ rm -r "$wrkdir"
return $exitCode
}