diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-08-16 18:41:55 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-08-16 23:00:26 +0200 |
commit | 268896444bed7b958add74b2e1e86ff802c5f5cb (patch) | |
tree | bd03a16c4ae409435b056104c8388cb618e8da62 | |
parent | a7c714d3983c746d14b759707ff9e3487d580dd2 (diff) |
derivations: Delete duplicate inputs when computing derivation hash.
Fixes <https://bugs.gnu.org/36777>.
Reported by Carl Dong <contact@carldong.me>.
* guix/derivations.scm (derivation/masked-inputs): Call
'delete-duplicates' on INPUTS.
* tests/derivations.scm ("derivation with duplicate fixed-output inputs"):
New test.
-rw-r--r-- | guix/derivations.scm | 2 | ||||
-rw-r--r-- | tests/derivations.scm | 32 |
2 files changed, 33 insertions, 1 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm index 92d50503ce..b3928920e2 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -685,7 +685,7 @@ name of each input with that input's hash." (make-derivation-input hash sub-drvs)))) inputs))) (make-derivation outputs - (sort inputs + (sort (delete-duplicates inputs) (lambda (drv1 drv2) (string<? (derivation-input-derivation drv1) (derivation-input-derivation drv2)))) diff --git a/tests/derivations.scm b/tests/derivations.scm index 368012d2b2..db73d19b3a 100644 --- a/tests/derivations.scm +++ b/tests/derivations.scm @@ -410,6 +410,38 @@ (equal? (derivation->output-path final1) (derivation->output-path final2))))) +(test-assert "derivation with duplicate fixed-output inputs" + ;; Here we create a derivation that has two inputs, both of which are + ;; fixed-output leading to the same result. This test ensures the hash of + ;; that derivation is correctly computed, namely that duplicate inputs are + ;; coalesced. See <https://bugs.gnu.org/36777>. + (let* ((builder1 (add-text-to-store %store "fixed-builder1.sh" + "echo -n hello > $out" '())) + (builder2 (add-text-to-store %store "fixed-builder2.sh" + "echo hey; echo -n hello > $out" '())) + (hash (sha256 (string->utf8 "hello"))) + (fixed1 (derivation %store "fixed" + %bash `(,builder1) + #:hash hash #:hash-algo 'sha256)) + (fixed2 (derivation %store "fixed" + %bash `(,builder2) + #:hash hash #:hash-algo 'sha256)) + (builder3 (add-text-to-store %store "builder.sh" + "echo fake builder")) + (final (derivation %store "final" + %bash `(,builder3) + #:sources (list %bash builder3) + #:inputs (list (derivation-input fixed1) + (derivation-input fixed2))))) + (and (derivation? final) + (match (derivation-inputs final) + (((= derivation-input-derivation one) + (= derivation-input-derivation two)) + (and (not (string=? (derivation-file-name one) + (derivation-file-name two))) + (string=? (derivation->output-path one) + (derivation->output-path two)))))))) + (test-assert "multiple-output derivation" (let* ((builder (add-text-to-store %store "my-fixed-builder.sh" "echo one > $out ; echo two > $second" |