mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 21:38:07 -05:00
derivations: Do not fetch narinfos for non-substitutable items.
This avoids connections to substitute servers for derivations that are not substitutable anyway, such as profiles. Reported by Andy Wingo. * guix/derivations.scm (substitution-oracle): Skip derivations that do not pass 'substitutable-derivation?'. * tests/derivations.scm ("substitution-oracle and #:substitute? #f"): New test.
This commit is contained in:
parent
7aeb4ffa58
commit
bdb59b331b
2 changed files with 39 additions and 1 deletions
|
@ -293,7 +293,14 @@ (define (dependencies drv)
|
|||
;; 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
|
||||
;; Also, skip derivations marked as non-substitutable.
|
||||
(append-map (lambda (input)
|
||||
(let ((drv (call-with-input-file
|
||||
(derivation-input-path input)
|
||||
read-derivation)))
|
||||
(if (substitutable-derivation? drv)
|
||||
(derivation-input-output-paths input)
|
||||
'())))
|
||||
(derivation-prerequisites drv valid-input?)))
|
||||
|
||||
(let* ((paths (delete-duplicates
|
||||
|
@ -304,6 +311,8 @@ (define (dependencies drv)
|
|||
paths))))
|
||||
(cond ((eqv? mode (build-mode check))
|
||||
(cons (dependencies drv) result))
|
||||
((not (substitutable-derivation? drv))
|
||||
(cons (dependencies drv) result))
|
||||
((every valid? self)
|
||||
result)
|
||||
(else
|
||||
|
|
|
@ -888,6 +888,35 @@ (define %coreutils
|
|||
(string=? (derivation-input-path input)
|
||||
(derivation-file-name dep))))))))
|
||||
|
||||
(test-assert "substitution-oracle and #:substitute? #f"
|
||||
(with-store store
|
||||
(let* ((dep (build-expression->derivation store "dep"
|
||||
`(begin ,(random-text)
|
||||
(mkdir %output))))
|
||||
(drv (build-expression->derivation store "not-subst"
|
||||
`(begin ,(random-text)
|
||||
(mkdir %output))
|
||||
#:substitutable? #f
|
||||
#:inputs `(("dep" ,dep))))
|
||||
(query #f))
|
||||
(define (record-substitutable-path-query store paths)
|
||||
(when query
|
||||
(error "already called!" query))
|
||||
(set! query paths)
|
||||
'())
|
||||
|
||||
(mock ((guix store) substitutable-paths
|
||||
record-substitutable-path-query)
|
||||
|
||||
(let ((pred (substitution-oracle store (list drv))))
|
||||
(pred (derivation->output-path drv))))
|
||||
|
||||
;; Make sure the oracle didn't try to get substitute info for DRV since
|
||||
;; DRV is mark as non-substitutable. Assume that GUILE-FOR-BUILD is
|
||||
;; already in store and thus not part of QUERY.
|
||||
(equal? (pk 'query query)
|
||||
(list (derivation->output-path dep))))))
|
||||
|
||||
(test-assert "build-expression->derivation with expression returning #f"
|
||||
(let* ((builder '(begin
|
||||
(mkdir %output)
|
||||
|
|
Loading…
Reference in a new issue