diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-11-29 22:49:19 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-11-29 22:56:29 +0100 |
commit | 26059753aea72d0a2bc51204bad9fe416e7c6536 (patch) | |
tree | de81fc9d186fccb5952009650885cc2a1f510f98 | |
parent | 4b7857a48bbd79830697a111b2c027200020d8c3 (diff) | |
download | guix-26059753aea72d0a2bc51204bad9fe416e7c6536.tar guix-26059753aea72d0a2bc51204bad9fe416e7c6536.tar.gz |
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.
-rw-r--r-- | guix/scripts/refresh.scm | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm index 8e8a34bd0f..a94bb22a91 100644 --- a/guix/scripts/refresh.scm +++ b/guix/scripts/refresh.scm @@ -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. |