diff options
author | Ludovic Courtès <ludo@gnu.org> | 2016-02-25 12:42:01 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2016-02-25 12:44:41 +0100 |
commit | cfd503205e6b72895eaca73ffd76762d09218d36 (patch) | |
tree | 93fb9ba6096d23362e1bc773a314c41c2f6950ce | |
parent | 06b76accebd5c98ae50dc7ec4c3f4dad764a637e (diff) | |
download | guix-cfd503205e6b72895eaca73ffd76762d09218d36.tar.gz |
guix system: Restore load path after running the activation script.
Fixes <http://bugs.gnu.org/22753>. Reported by Mark H Weaver <mhw@netris.org>. * guix/scripts/system.scm (save-load-path-excursion): New variable. (upgrade-shepherd-services): Add comment about the issue. (switch-to-system): Use 'save-load-path-excursion' around 'primitive-load' call.
-rw-r--r-- | guix/scripts/system.scm | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm index 7279be0c43..401aa8b60a 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -211,6 +211,19 @@ the ownership of '~a' may be incorrect!~%") (lambda () (environ env))))) +(define-syntax-rule (save-load-path-excursion body ...) + "Save the current values of '%load-path' and '%load-compiled-path', run +BODY..., and restore them." + (let ((path %load-path) + (cpath %load-compiled-path)) + (dynamic-wind + (const #t) + (lambda () + body ...) + (lambda () + (set! %load-path path) + (set! %load-compiled-path cpath))))) + (define-syntax-rule (warn-on-system-error body ...) (catch 'system-error (lambda () @@ -273,6 +286,9 @@ bring the system down." (info (_ "loading new services:~{ ~a~}...~%") to-load-names) (mlet %store-monad ((files (mapm %store-monad shepherd-service-file to-load))) + ;; Here we assume that FILES are exactly those that were computed + ;; as part of the derivation that built OS, which is normally the + ;; case. (load-services (map derivation->output-path files)) (for-each start-service @@ -299,7 +315,12 @@ it atomically, and then run OS's activation script." ;; Tell 'activate-current-system' what the new system is. (setenv "GUIX_NEW_SYSTEM" system) - (primitive-load (derivation->output-path script))) + ;; The activation script may modify '%load-path' & co., so protect + ;; against that. This is necessary to ensure that + ;; 'upgrade-shepherd-services' gets to see the right modules when it + ;; computes derivations with (gexp->derivation #:modules …). + (save-load-path-excursion + (primitive-load (derivation->output-path script)))) ;; Finally, try to update system services. (upgrade-shepherd-services os)))) |