summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludovic.courtes@inria.fr>2022-03-07 19:03:15 +0100
committerLudovic Courtès <ludo@gnu.org>2022-03-07 22:49:27 +0100
commit1cad3476189d2ce84fabe95b69db8fb85a10b67a (patch)
tree10909c5e7ce25638456e39615bde339de622760f /guix
parent6e09ab9f614916ad850155407755ef3421a23775 (diff)
downloadguix-patches-1cad3476189d2ce84fabe95b69db8fb85a10b67a.tar
guix-patches-1cad3476189d2ce84fabe95b69db8fb85a10b67a.tar.gz
derivations: Coalesce inputs that have the same output path.
Fixes <https://issues.guix.gnu.org/54209>. * guix/derivations.scm (coalesce-duplicate-inputs): Use the output paths of DRV as a hash table key. * tests/derivations.scm ("derivation with duplicate fixed-output inputs"): Expect a single input for FINAL. ("derivation with equivalent fixed-output inputs"): New test.
Diffstat (limited to 'guix')
-rw-r--r--guix/derivations.scm14
1 files changed, 11 insertions, 3 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm
index f77ea179f4..354ec20e3f 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -245,11 +245,19 @@ Nix itself keeps only one of them."
(make-hash-table 25))
(for-each (lambda (input)
- (let* ((drv (derivation-input-path input))
+ ;; If DRV1 and DRV2 are fixed-output derivations with the same
+ ;; output path, they must be coalesced. Thus, TABLE is keyed by
+ ;; output paths.
+ (let* ((drv (derivation-input-derivation input))
+ (key (string-join
+ (map (match-lambda
+ ((_ . output)
+ (derivation-output-path output)))
+ (derivation-outputs drv))))
(sub-drvs (derivation-input-sub-derivations input)))
- (match (hash-get-handle table drv)
+ (match (hash-get-handle table key)
(#f
- (hash-set! table drv input))
+ (hash-set! table key input))
((and handle (key . ($ <derivation-input> drv sub-drvs2)))
;; Merge DUP with INPUT.
(let* ((sub-drvs (delete-duplicates