~ruther/guix-local

578dfbe07bcd1bdef9129c6ce8529332a0abcba6 — Ludovic Courtès 8 years ago 1cbcbc8
gexp: 'ungexp-splicing' properly accounts for nested native inputs.

Previously, (gexp-native-inputs #~#$@(list #~#+foo)) would return '().

This is a followup to 5b14a7902c58d9fb7923f9e16871f549fbe59b6e.

* guix/gexp.scm (gexp-inputs)[add-reference-inputs]: In the list case,
remove 'if' around 'fold-right'.  In 'map' lambda, always inherit N?.
* tests/gexp.scm ("gexp list splicing + ungexp-splicing"): New test.
2 files changed, 19 insertions(+), 9 deletions(-)

M guix/gexp.scm
M tests/gexp.scm
M guix/gexp.scm => guix/gexp.scm +11 -9
@@ 706,15 706,17 @@ references; otherwise, return only non-native references."
           (cons `(,thing ,output) result)
           result))
      (($ <gexp-input> (lst ...) output n?)
       (if (eqv? native? n?)
           (fold-right add-reference-inputs result
                       ;; XXX: For now, automatically convert LST to a list of
                       ;; gexp-inputs.
                       (map (match-lambda
                              ((? gexp-input? x) x)
                              (x (%gexp-input x "out" (or n? native?))))
                            lst))
           result))
       (fold-right add-reference-inputs result
                   ;; XXX: For now, automatically convert LST to a list of
                   ;; gexp-inputs.  Inherit N?.
                   (map (match-lambda
                          ((? gexp-input? x)
                           (%gexp-input (gexp-input-thing x)
                                        (gexp-input-output x)
                                        n?))
                          (x
                           (%gexp-input x "out" n?)))
                        lst)))
      (_
       ;; Ignore references to other kinds of objects.
       result)))

M tests/gexp.scm => tests/gexp.scm +8 -0
@@ 355,6 355,14 @@
         (equal? (gexp->sexp* exp)                ;native
                 (gexp->sexp* exp "mips64el-linux")))))

(test-assert "gexp list splicing + ungexp-splicing"
  (let* ((inner (gexp (ungexp-native glibc)))
         (exp   (gexp (list (ungexp-splicing (list inner))))))
    (and (equal? `((,glibc "out")) (gexp-native-inputs exp))
         (null? (gexp-inputs exp))
         (equal? (gexp->sexp* exp)                ;native
                 (gexp->sexp* exp "mips64el-linux")))))

(test-equal "output list"
  2
  (let ((exp (gexp (begin (mkdir (ungexp output))