diff options
author | Ludovic Courtès <ludovic.courtes@inria.fr> | 2022-03-07 19:03:15 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-03-07 22:49:27 +0100 |
commit | 1cad3476189d2ce84fabe95b69db8fb85a10b67a (patch) | |
tree | 10909c5e7ce25638456e39615bde339de622760f /guix | |
parent | 6e09ab9f614916ad850155407755ef3421a23775 (diff) |
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.scm | 14 |
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 |