~ruther/guix-local

79c0c8cdf74cc0587187aa8f25af29b21fe91ba2 — Ludovic Courtès 12 years ago 6968938
gexp: Add support for 'origin?' objects in 'ungexp' forms.

* guix/gexp.scm (lower-inputs, gexp-inputs, gexp->sexp,
  canonicalize-reference): Add 'origin?' case.
* guix/monads.scm (origin->derivation): New procedure.
* tests/gexp.scm ("one input origin"): New test.
3 files changed, 28 insertions(+), 2 deletions(-)

M guix/gexp.scm
M guix/monads.scm
M tests/gexp.scm
M guix/gexp.scm => guix/gexp.scm +12 -0
@@ 85,6 85,9 @@ input list as a monadic value."
                    (((? package? package) sub-drv ...)
                     (mlet %store-monad ((drv (package->derivation package)))
                       (return `(,drv ,@sub-drv))))
                    (((? origin? origin) sub-drv ...)
                     (mlet %store-monad ((drv (origin->derivation origin)))
                       (return `(,drv ,@sub-drv))))
                    (input
                     (return input)))
                   inputs))))


@@ 158,6 161,8 @@ The other arguments are as for 'derivation'."
       (cons ref result))
      (((? package?) (? string?))
       (cons ref result))
      (((? origin?) (? string?))
       (cons ref result))
      ((? gexp? exp)
       (append (gexp-inputs exp) result))
      (((? string? file))


@@ 199,6 204,9 @@ and in the current monad setting (system type, etc.)"
         (return (derivation->output-path drv output)))
        (((? package? p) (? string? output))
         (package-file p #:output output))
        (((? origin? o) (? string? output))
         (mlet %store-monad ((drv (origin->derivation o)))
           (return (derivation->output-path drv output))))
        (($ <output-ref> output)
         ;; Output file names are not known in advance but the daemon defines
         ;; an environment variable for each of them at build time, so use


@@ 224,10 232,14 @@ package/derivation references."
  (match ref
    ((? package? p)
     `(,p "out"))
    ((? origin? o)
     `(,o "out"))
    ((? derivation? d)
     `(,d "out"))
    (((? package?) (? string?))
     ref)
    (((? origin?) (? string?))
     ref)
    (((? derivation?) (? string?))
     ref)
    ((? string? s)

M guix/monads.scm => guix/monads.scm +4 -0
@@ 56,6 56,7 @@
            text-file
            text-file*
            package-file
            origin->derivation
            package->derivation
            built-derivations)
  #:replace (imported-modules


@@ 395,6 396,9 @@ input list as a monadic value."
(define package->derivation
  (store-lift package-derivation))

(define origin->derivation
  (store-lift package-source-derivation))

(define imported-modules
  (store-lift (@ (guix derivations) imported-modules)))


M tests/gexp.scm => tests/gexp.scm +12 -2
@@ 21,8 21,7 @@
  #:use-module (guix monads)
  #:use-module (guix gexp)
  #:use-module (guix derivations)
  #:use-module ((guix packages)
                #:select (package-derivation %current-system))
  #:use-module (guix packages)
  #:use-module (gnu packages)
  #:use-module (gnu packages base)
  #:use-module (gnu packages bootstrap)


@@ 83,6 82,17 @@
                             (package-derivation %store coreutils)))
                 (gexp->sexp* exp)))))

(test-assert "one input origin"
  (let ((exp (gexp (display (ungexp (package-source coreutils))))))
    (and (gexp? exp)
         (match (gexp-inputs exp)
           (((o "out"))
            (eq? o (package-source coreutils))))
         (equal? `(display ,(derivation->output-path
                             (package-source-derivation
                              %store (package-source coreutils))))
                 (gexp->sexp* exp)))))

(test-assert "same input twice"
  (let ((exp (gexp (begin
                     (display (ungexp coreutils))