derivations: 'substitution-oracle' returns a <substitutable>.

* guix/derivations.scm (substitution-oracle): Use
'substitution-path-info' instead of 'substitution-paths'.  Turn SUBST
into a vhash from path to <substitutable>.  Change the returned
procedure to provide a <substitutable> instead of a Boolean.
* tests/derivations.scm ("substitution-oracle and #:substitute? #f"):
Mock 'substitutable-path-info' instead of 'substitutable-paths'.
This commit is contained in:
Ludovic Courtès 2017-05-31 09:55:56 +02:00
parent fb226b4351
commit ef51ac21ee
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 13 additions and 5 deletions

View File

@ -271,13 +271,14 @@ result is the set of prerequisites of DRV not already in valid."
(define* (substitution-oracle store drv (define* (substitution-oracle store drv
#:key (mode (build-mode normal))) #:key (mode (build-mode normal)))
"Return a one-argument procedure that, when passed a store file name, "Return a one-argument procedure that, when passed a store file name,
returns #t if it's substitutable and #f otherwise. The returned procedure returns a 'substitutable?' if it's substitutable and #f otherwise.
The returned procedure
knows about all substitutes for all the derivations listed in DRV, *except* knows about all substitutes for all the derivations listed in DRV, *except*
those that are already valid (that is, it won't bother checking whether an those that are already valid (that is, it won't bother checking whether an
item is substitutable if it's already on disk); it also knows about their item is substitutable if it's already on disk); it also knows about their
prerequisites, unless they are themselves substitutable. prerequisites, unless they are themselves substitutable.
Creating a single oracle (thus making a single 'substitutable-paths' call) and Creating a single oracle (thus making a single 'substitutable-path-info' call) and
reusing it is much more efficient than calling 'has-substitutes?' or similar reusing it is much more efficient than calling 'has-substitutes?' or similar
repeatedly, because it avoids the costs associated with launching the repeatedly, because it avoids the costs associated with launching the
substituter many times." substituter many times."
@ -318,8 +319,15 @@ substituter many times."
(cons* self (dependencies drv) result))))) (cons* self (dependencies drv) result)))))
'() '()
drv)))) drv))))
(subst (list->set (substitutable-paths store paths)))) (subst (fold (lambda (subst vhash)
(cut set-contains? subst <>))) (vhash-cons (substitutable-path subst) subst
vhash))
vlist-null
(substitutable-path-info store paths))))
(lambda (item)
(match (vhash-assoc item subst)
(#f #f)
((key . value) value)))))
(define* (derivation-prerequisites-to-build store drv (define* (derivation-prerequisites-to-build store drv
#:key #:key

View File

@ -919,7 +919,7 @@
(set! query paths) (set! query paths)
'()) '())
(mock ((guix store) substitutable-paths (mock ((guix store) substitutable-path-info
record-substitutable-path-query) record-substitutable-path-query)
(let ((pred (substitution-oracle store (list drv)))) (let ((pred (substitution-oracle store (list drv))))