summary refs log tree commit diff
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.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.