From 39fc16954b48ab2d59015c3615c71919e80bae7e Mon Sep 17 00:00:00 2001
From: Robert Helgesson <robert@rycee.net>
Date: Mon, 4 Sep 2017 22:19:56 +0200
Subject: [PATCH] home-manager: make sure switch generation is GC root

Using `--no-out-link` is convenient but it does not set up a GC root,
so an unfortunately timed GC could remove the generation before
activation completes. Many thanks to @nonsequitur for noting this
problem.
---
 home-manager/home-manager | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/home-manager/home-manager b/home-manager/home-manager
index 2fbf057f8..8e0bd40c2 100644
--- a/home-manager/home-manager
+++ b/home-manager/home-manager
@@ -77,8 +77,18 @@ function doBuild() {
 function doSwitch() {
     local generation
     local exitCode=0
+    local wrkdir
 
-    generation=$(doBuild "--no-out-link") && $generation/activate || exitCode=1
+    # 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
 }