~ruther/guix-local

af0ba938255bb412ad021c19e651e632abd0103c — Ludovic Courtès 9 years ago 59fed2b
guix system: Return two values when failing to talk to shepherd.

Before that, when 'guix system reconfigure' failed to talk to shepherd
and a 'system-error' was raised, we would get a "too few values returned
to continuation" error, which would prevent GRUB from being installed.

Reported by fps on #guix.

* guix/scripts/system.scm (warn-on-system-error): Remove.
(with-shepherd-error-handling): Inline former 'warn-on-system-error'.
Return two values when 'system-error' is raised.
1 files changed, 10 insertions(+), 15 deletions(-)

M guix/scripts/system.scm
M guix/scripts/system.scm => guix/scripts/system.scm +10 -15
@@ 227,25 227,20 @@ BODY..., and restore them."
        (set! %load-path path)
        (set! %load-compiled-path cpath)))))

(define-syntax-rule (warn-on-system-error body ...)
  (catch 'system-error
    (lambda ()
      body ...)
    (lambda (key proc format-string format-args errno . rest)
      (warning (_ "while talking to shepherd: ~a~%")
               (apply format #f format-string format-args))
      (with-monad %store-monad
        (return #f)))))

(define-syntax-rule (with-shepherd-error-handling mbody ...)
  "Catch and report Shepherd errors that arise when binding MBODY, a monadic
expression in %STORE-MONAD."
  (lambda (store)
    (warn-on-system-error
     (guard (c ((shepherd-error? c)
                (values (report-shepherd-error c) store)))
       (values (run-with-store store (begin mbody ...))
               store)))))
    (catch 'system-error
      (lambda ()
        (guard (c ((shepherd-error? c)
                   (values (report-shepherd-error c) store)))
          (values (run-with-store store (begin mbody ...))
                  store)))
      (lambda (key proc format-string format-args errno . rest)
        (warning (_ "while talking to shepherd: ~a~%")
                 (apply format #f format-string format-args))
        (values #f store)))))

(define (report-shepherd-error error)
  "Report ERROR, a '&shepherd-error' error condition object."