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.
This commit is contained in:
Robert Helgesson 2017-09-04 22:19:56 +02:00
parent f5289c546e
commit 39fc16954b
No known key found for this signature in database
GPG key ID: C3DB11069E65DC86

View file

@ -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
}