aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xguix/scripts/substitute-binary.scm23
1 files changed, 16 insertions, 7 deletions
diff --git a/guix/scripts/substitute-binary.scm b/guix/scripts/substitute-binary.scm
index 088a41a15c..13c382877b 100755
--- a/guix/scripts/substitute-binary.scm
+++ b/guix/scripts/substitute-binary.scm
@@ -236,8 +236,8 @@ reading PORT."
(define (fetch-narinfo cache path)
"Return the <narinfo> record for PATH, or #f if CACHE does not hold PATH."
(define (download url)
- ;; Download the `nix-cache-info' from URL, and return its contents as an
- ;; list of key/value pairs.
+ ;; Download the .narinfo from URL, and return its contents as a list of
+ ;; key/value pairs.
(false-if-exception (fetch (string->uri url))))
(and (string=? (cache-store-directory cache) (%store-prefix))
@@ -288,11 +288,15 @@ check what it has."
(values #f #f)))))
(if valid?
cached ; including negative caches
- (let ((narinfo (and=> (force cache)
- (cut fetch-narinfo <> path))))
- (with-atomic-file-output cache-file
- (lambda (out)
- (write (cache-entry narinfo) out)))
+ (let* ((cache (force cache))
+ (narinfo (and cache (fetch-narinfo cache path))))
+ ;; Cache NARINFO only when CACHE was actually accessible. This
+ ;; avoids caching negative hits when in fact we just lacked network
+ ;; access.
+ (when cache
+ (with-atomic-file-output cache-file
+ (lambda (out)
+ (write (cache-entry narinfo) out))))
narinfo))))
(define (remove-expired-cached-narinfos)
@@ -457,4 +461,9 @@ indefinitely."
(("--version")
(show-version-and-exit "guix substitute-binary")))))
+
+;;; Local Variable:
+;;; eval: (put 'with-atomic-file-output 'scheme-indent-function 1)
+;;; End:
+
;;; substitute-binary.scm ends here