From 39fc16954b48ab2d59015c3615c71919e80bae7e Mon Sep 17 00:00:00 2001 From: Robert Helgesson 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 }