refresh: Check updater availability at run time.

This is a followup to b68d2db, which added a check for updaters at
macro-expansion time.  The problem is that, when running 'guix pull',
Guile-JSON is found, so the PyPi updater (say) is added to %UPDATERS,
but then at run time Guile-JSON might be missing.

Reported by orbea on #guix.

* guix/scripts/refresh.scm (maybe-updater): Rewrite as 'syntax-rules'.
Produce code that checks conditions at run time.
(list-updaters): Update docstring.
This commit is contained in:
Ludovic Courtès 2015-11-29 22:49:19 +01:00
parent 4b7857a48b
commit 26059753ae

View file

@ -157,20 +157,21 @@ (define (show-help)
;;;
(define-syntax maybe-updater
;; Helper macro for 'list-udpaters'.
(lambda (s)
(syntax-case s (=>)
((_ ((module => updater) rest ...) (result ...))
(let ((met? (false-if-exception
(resolve-interface (syntax->datum #'module)))))
(if met?
#'(maybe-updater (rest ...)
(result ... (@ module updater)))
#'(maybe-updater (rest ...) (result ...)))))
((_ (updater rest ...) (result ...))
#'(maybe-updater (rest ...) (result ... updater)))
((_ () result)
#'result))))
;; Helper macro for 'list-updaters'.
(syntax-rules (=>)
((_ ((module => updater) rest ...) result)
(maybe-updater (rest ...)
(let ((iface (false-if-exception
(resolve-interface 'module)))
(tail result))
(if iface
(cons (module-ref iface 'updater) tail)
tail))))
((_ (updater rest ...) result)
(maybe-updater (rest ...)
(cons updater result)))
((_ () result)
(reverse result))))
(define-syntax-rule (list-updaters updaters ...)
"Expand to '(list UPDATERS ...)' but only the subset of UPDATERS that are
@ -181,11 +182,11 @@ (define-syntax-rule (list-updaters updaters ...)
((SOME MODULE) => UPDATER)
meaning that UPDATER is added to the list if and only if (SOME MODULE) could
be resolved at macro expansion time.
be resolved at run time.
This is a way to discard at macro expansion time updaters that depend on
unavailable optional dependencies such as Guile-JSON."
(maybe-updater (updaters ...) (list)))
(maybe-updater (updaters ...) '()))
(define %updaters
;; List of "updaters" used by default. They are consulted in this order.