~ruther/guix-local

db393b333f77ffbb573faf47b6df74dc65a0e85b — Ludovic Courtès 13 years ago 9f55cf8
build-expression->derivation: Have the build fail when EXP returns #f.

* guix/derivations.scm (build-expression->derivation)[builder]: Pass the
  result of EXP to `exit'.

* tests/derivations.scm ("build-expression->derivation with expression
  returning #f"): New test.
2 files changed, 21 insertions(+), 2 deletions(-)

M guix/derivations.scm
M tests/derivations.scm
M guix/derivations.scm => guix/derivations.scm +5 -2
@@ 446,7 446,9 @@ derivation NAME.  INPUTS must be a list of (NAME DRV-PATH SUB-DRV) tuples;
when SUB-DRV is omitted, \"out\" is assumed.  EXP is evaluated in an
environment where %OUTPUT is bound to the main output path, %OUTPUTS is bound
to a list of output/path pairs, and where %BUILD-INPUTS is bound to an alist
of string/output-path pairs made from INPUTS."
of string/output-path pairs made from INPUTS.  The builder terminates by
passing the result of EXP to `exit'; thus, when EXP returns #f, the build is
considered to have failed."
  (define guile
    (string-append (derivation-path->output-path (%guile-for-build))
                   "/bin/guile"))


@@ 472,7 474,8 @@ of string/output-path pairs made from INPUTS."
         (builder  (add-text-to-store store
                                      (string-append name "-guile-builder")
                                      (string-append (object->string prologue)
                                                     (object->string exp))
                                                     (object->string
                                                      `(exit ,exp)))
                                      (map second inputs)))
         (mod-drv  (if (null? modules)
                       #f

M tests/derivations.scm => tests/derivations.scm +16 -0
@@ 29,6 29,7 @@
  #:use-module (rnrs io ports)
  #:use-module (rnrs bytevectors)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 regex)
  #:use-module (ice-9 ftw)
  #:use-module (ice-9 match))



@@ 181,6 182,20 @@
           (equal? '(hello guix)
                   (call-with-input-file (string-append p "/test") read))))))

(test-assert "build-expression->derivation with expression returning #f"
  (let* ((builder  '(begin
                      (mkdir %output)
                      #f))                        ; fail!
         (drv-path (build-expression->derivation %store "fail" (%current-system)
                                                 builder '())))
    (guard (c ((nix-protocol-error? c)
               ;; Note that the output path may exist at this point, but it
               ;; is invalid.
               (not (not (string-match "build .* failed"
                                       (nix-protocol-error-message c))))))
      (build-derivations %store (list drv-path))
      #f)))

(test-assert "build-expression->derivation with two outputs"
  (let* ((builder    '(begin
                        (call-with-output-file (assoc-ref %outputs "out")


@@ 265,4 280,5 @@

;;; Local Variables:
;;; eval: (put 'test-assert 'scheme-indent-function 1)
;;; eval: (put 'guard 'scheme-indent-function 1)
;;; End: