aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-10-24 17:33:10 +0100
committerChristopher Baines <mail@cbaines.net>2020-10-24 17:33:10 +0100
commit0d9228e549082eabc9311dd4202bd286bc4363e4 (patch)
tree93ce3a9db250ce3d6792241c691e59d9c3cc6747
parent3d8548d6a0b7a64b77fe9afe6059c9fb9ab62106 (diff)
downloadbuild-coordinator-0d9228e549082eabc9311dd4202bd286bc4363e4.tar
build-coordinator-0d9228e549082eabc9311dd4202bd286bc4363e4.tar.gz
WIP
-rw-r--r--guix-build-coordinator/agent.scm26
-rw-r--r--guix-build-coordinator/utils.scm50
2 files changed, 72 insertions, 4 deletions
diff --git a/guix-build-coordinator/agent.scm b/guix-build-coordinator/agent.scm
index dcee91f..850d378 100644
--- a/guix-build-coordinator/agent.scm
+++ b/guix-build-coordinator/agent.scm
@@ -134,7 +134,7 @@
derivation-substitute-urls
non-derivation-substitute-urls
derivation-name)
- (define (find-missing-inputs inputs)
+ (define (find-missing-inputs derivation inputs)
(let* ((output-paths
(append-map derivation-input-output-paths inputs))
(missing-paths
@@ -194,10 +194,28 @@
(begin
(simple-format
(current-error-port)
- "error: failed to fetch substitutes for: ~A\n"
+ "warning: failed to fetch substitutes for: ~A\n"
missing-files)
- missing-files))))))))
+ (let ((unavailable-outputs
+ (delete-duplicates
+ (append-map
+ (lambda (missing-output)
+ (find-missing-substitutes-for-output
+ non-derivation-substitute-urls
+ missing-output))
+ missing-files))))
+
+ (simple-format
+ (current-error-port)
+ "warning: the following outputs are missing:\n~A\n"
+ (string-join
+ (map (lambda (output)
+ (string-append
+ " - " output))
+ unavailable-outputs)))
+
+ unavailable-outputs)))))))))
(define (delete-outputs derivation)
(let* ((outputs (derivation-outputs derivation))
@@ -234,7 +252,7 @@
(match (delete-outputs derivation)
(#t
(let ((missing-inputs
- (find-missing-inputs (derivation-inputs derivation))))
+ (find-missing-inputs derivation (derivation-inputs derivation))))
(if (null? missing-inputs)
'((result . success))
`((result . failure)
diff --git a/guix-build-coordinator/utils.scm b/guix-build-coordinator/utils.scm
index ef26d3a..7b38130 100644
--- a/guix-build-coordinator/utils.scm
+++ b/guix-build-coordinator/utils.scm
@@ -36,6 +36,7 @@
call-with-streaming-http-request
make-chunked-input-port*
+ find-missing-substitutes-for-output
has-substiutes-no-cache?
substitute-derivation
@@ -256,6 +257,55 @@ upcoming chunk."
(values response
body))))))))
+(define (find-missing-substitutes-for-output substitute-urls output)
+ (define %narinfo-cache-directory
+ (if (zero? (getuid))
+ (or (and=> (getenv "XDG_CACHE_HOME")
+ (cut string-append <> "/guix/substitute"))
+ (string-append %state-directory "/substitute/cache"))
+ (string-append (cache-directory #:ensure? #f) "/substitute")))
+
+ ;; Because there's no control over the caching of 404 lookups, and I'd
+ ;; rather not reach inside and monkey patch the Guix code, just delete any
+ ;; cache files
+ (let ((hash-part (store-path-hash-part output))
+ (directories
+ (scandir %narinfo-cache-directory
+ (lambda (s) (= (string-length s) 52)))))
+
+ (for-each (lambda (directory)
+ (let ((cache-file
+ (string-append
+ %narinfo-cache-directory "/"
+ directory "/" hash-part)))
+ (when (file-exists? cache-file)
+ (with-exception-handler
+ (lambda (exn)
+ (simple-format
+ (current-error-port)
+ "error: when deleting substitute cache file: ~A\n"
+ exn))
+ (lambda ()
+ (delete-file cache-file))
+ #:unwind? #t))))
+ (or directories '())))
+
+ (let ((narinfo
+ (any (lambda (substitute-url)
+ (let ((result (lookup-narinfos substitute-url (list output))))
+ (if (null? result)
+ #f
+ (first result))))
+ substitute-urls)))
+ (if narinfo
+ (append-map
+ (lambda (referenced-output)
+ (peek "REF" referenced-output)
+ (find-missing-substitutes-for-output substitute-urls
+ referenced-output))
+ (narinfo-references narinfo))
+ (list output))))
+
(define (has-substiutes-no-cache? substitute-urls file)
(define %narinfo-cache-directory
(if (zero? (getuid))