aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-11-29 22:49:19 +0100
committerLudovic Courtès <ludo@gnu.org>2015-11-29 22:56:29 +0100
commit26059753aea72d0a2bc51204bad9fe416e7c6536 (patch)
treede81fc9d186fccb5952009650885cc2a1f510f98
parent4b7857a48bbd79830697a111b2c027200020d8c3 (diff)
downloadguix-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.scm33
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.