derivations: 'substitution-oracle' now ignores sub-trees that are valid. Before that, "guix build qt", when only qt itself is missing, would lead 'substitution-oracle' to call 'substitutable-paths' with 318 items. Now, this is down to 6 items, because it doesn't ask about prerequisites that are already valid. * guix/derivations.scm (substitution-oracle)[valid-input?, dependencies]: New procedures. Use 'dependencies' and remove call to 'remove'.
1 files changed, 13 insertions(+), 5 deletions(-) M guix/derivations.scm
M guix/derivations.scm => guix/derivations.scm +13 -5
@@ 249,6 249,17 @@ substituter many times." (define valid? (cut valid-path? store <>)) (define valid-input? (cut valid-derivation-input? store <>)) (define (dependencies drv) ;; Skip prerequisite sub-trees of DRV whose root is valid. This allows us ;; to ask the substituter for just as much as needed, instead of asking it ;; for the whole world, which can be significantly faster when substitute ;; info is not already in cache. (append-map derivation-input-output-paths (derivation-prerequisites drv valid-input?))) (let* ((paths (delete-duplicates (fold (lambda (drv result) (let ((self (match (derivation->output-paths drv) @@ 256,11 267,8 @@ substituter many times." paths)))) (if (every valid? self) result (let ((deps (append-map derivation-input-output-paths (derivation-prerequisites drv)))) (append (remove valid? (append self deps)) result))))) (append (append self (dependencies drv)) result)))) '() drv))) (subst (list->set (substitutable-paths store paths))))