summary refs log tree commit diff
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