~ruther/guix-local

26059753aea72d0a2bc51204bad9fe416e7c6536 — Ludovic Courtès 10 years ago 4b7857a
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.
1 files changed, 17 insertions(+), 16 deletions(-)

M guix/scripts/refresh.scm
M guix/scripts/refresh.scm => guix/scripts/refresh.scm +17 -16
@@ 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.