reconfigure: Fix GC root installation.

Fixes <https://bugs.gnu.org/36942>.
Reported by ison <ison@airmail.cc>.

guix/scripts/system/reconfigure.scm (install-bootloader-program): Switch
new symlink to the canonical bootloader configuration file.

Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>
This commit is contained in:
Jakob L. Kreuze 2019-08-06 13:37:32 -04:00 committed by Danny Milosavljevic
parent d97ce20400
commit 5f04e9f962
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5

View file

@ -195,21 +195,31 @@ (define (install-bootloader-program installer bootloader-package bootcfg
(srfi srfi-34)
(srfi srfi-35))
(let* ((gc-root (string-append #$target %gc-roots-directory "/bootcfg"))
(temp-gc-root (string-append gc-root ".new")))
(switch-symlinks temp-gc-root gc-root)
(install-boot-config #$bootcfg #$bootcfg-file #$target)
(new-gc-root (string-append gc-root ".new")))
;; #$bootcfg has dependencies.
;; The bootloader magically loads the configuration from
;; (string-append #$target #$bootcfg-file) (for example
;; "/boot/grub/grub.cfg").
;; If we didn't do something special, the garbage collector
;; would remove the dependencies of #$bootcfg.
;; Register #$bootcfg as a GC root.
;; Preserve the previous activation's garbage collector root
;; until the bootloader installer has run, so that a failure in
;; the bootloader's installer script doesn't leave the user with
;; a broken installation.
(switch-symlinks new-gc-root #$bootcfg)
(install-boot-config #$bootcfg #$bootcfg-file #$target)
(when #$installer
(catch #t
(lambda ()
(#$installer #$bootloader-package #$device #$target))
(lambda args
(delete-file temp-gc-root)
(delete-file new-gc-root)
(apply throw args))))
(rename-file temp-gc-root gc-root)))))))
;; We are sure that the installation of the bootloader
;; succeeded, so we can replace the old GC root by the new
;; GC root now.
(rename-file new-gc-root gc-root)))))))
(define* (install-bootloader eval configuration bootcfg
#:key