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:
parent
4b7857a48b
commit
26059753ae
@ -157,20 +157,21 @@ specified with `--select'.\n"))
|
||||
;;;
|
||||
|
||||
(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 @@ A conditional updater has this form:
|
||||
((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.
|
||||
|
Loading…
Reference in New Issue
Block a user