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
1 changed files with 15 additions and 5 deletions

View File

@ -195,21 +195,31 @@ BOOTLOADER-PACKAGE."
(srfi srfi-34) (srfi srfi-34)
(srfi srfi-35)) (srfi srfi-35))
(let* ((gc-root (string-append #$target %gc-roots-directory "/bootcfg")) (let* ((gc-root (string-append #$target %gc-roots-directory "/bootcfg"))
(temp-gc-root (string-append gc-root ".new"))) (new-gc-root (string-append gc-root ".new")))
(switch-symlinks temp-gc-root gc-root) ;; #$bootcfg has dependencies.
(install-boot-config #$bootcfg #$bootcfg-file #$target) ;; 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 ;; Preserve the previous activation's garbage collector root
;; until the bootloader installer has run, so that a failure in ;; until the bootloader installer has run, so that a failure in
;; the bootloader's installer script doesn't leave the user with ;; the bootloader's installer script doesn't leave the user with
;; a broken installation. ;; a broken installation.
(switch-symlinks new-gc-root #$bootcfg)
(install-boot-config #$bootcfg #$bootcfg-file #$target)
(when #$installer (when #$installer
(catch #t (catch #t
(lambda () (lambda ()
(#$installer #$bootloader-package #$device #$target)) (#$installer #$bootloader-package #$device #$target))
(lambda args (lambda args
(delete-file temp-gc-root) (delete-file new-gc-root)
(apply throw args)))) (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 (define* (install-bootloader eval configuration bootcfg
#:key #:key