aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/hooks.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-04-17 11:48:07 +0100
committerChristopher Baines <mail@cbaines.net>2020-04-17 11:48:07 +0100
commita43c537109766d6403dbb0f03e551aa7020d1150 (patch)
tree1a48614fb33fb9d96dd9cfd7121d49542be0be50 /guix-build-coordinator/hooks.scm
parent1f46168cc9005aa5ec3114a0d2745031c8bc3a47 (diff)
downloadbuild-coordinator-a43c537109766d6403dbb0f03e551aa7020d1150.tar
build-coordinator-a43c537109766d6403dbb0f03e551aa7020d1150.tar.gz
Add a hook to handle missing inputs
That submits new build jobs to build these missing inputs if appropriate. This means that you can tell the coordinator to build something, and it will automatically attempt to build the dependencies if they're missing.
Diffstat (limited to 'guix-build-coordinator/hooks.scm')
-rw-r--r--guix-build-coordinator/hooks.scm44
1 files changed, 42 insertions, 2 deletions
diff --git a/guix-build-coordinator/hooks.scm b/guix-build-coordinator/hooks.scm
index ed0b890..0116605 100644
--- a/guix-build-coordinator/hooks.scm
+++ b/guix-build-coordinator/hooks.scm
@@ -19,9 +19,13 @@
;;; <http://www.gnu.org/licenses/>.
(define-module (guix-build-coordinator hooks)
+ #:use-module (srfi srfi-1)
+ #:use-module (ice-9 match)
#:use-module (guix-build-coordinator datastore)
+ #:use-module (guix-build-coordinator coordinator)
#:export (default-build-success-hook
- default-build-failure-hook))
+ default-build-failure-hook
+ default-build-missing-inputs-hook))
(define (default-build-success-hook datastore build-id)
(let ((agent-id
@@ -32,7 +36,7 @@
build-id agent-id)
(current-error-port))))
-(define* (default-build-failure-hook datastore build-id)
+(define (default-build-failure-hook datastore build-id)
(let ((agent-id
(datastore-agent-for-build datastore build-id)))
(display
@@ -40,3 +44,39 @@
"build ~A failed (on agent ~A)\n"
build-id agent-id)
(current-error-port))))
+
+(define (default-build-missing-inputs-hook datastore build-id missing-inputs)
+ (let ((build (datastore-find-build datastore build-id)))
+ (let ((derivation-inputs
+ (datastore-find-derivation-inputs datastore
+ (assq-ref build 'derivation-name))))
+ (simple-format #t "missing-inputs: ~A\n~A\n"
+ build-id
+ (string-join (map (lambda (input)
+ (string-append " - " input))
+ missing-inputs)
+ "\n"))
+ (for-each (lambda (missing-input)
+ (let ((input-derivation
+ (any (lambda (derivation-input)
+ (if (string=? (assq-ref derivation-input 'output)
+ missing-input)
+ (assq-ref derivation-input 'derivation)
+ #f))
+ derivation-inputs)))
+ (unless input-derivation
+ (error "couldn't find a derivation for " missing-input))
+
+ (let ((builds-for-output
+ (datastore-list-builds-for-output datastore
+ missing-input)))
+ (if (null? builds-for-output)
+ (begin
+ (simple-format #t
+ "submitting build for ~A\n"
+ input-derivation)
+ (submit-build datastore input-derivation))
+ (simple-format #t "~A builds exist for ~A, skipping\n"
+ (length builds-for-output)
+ missing-input)))))
+ missing-inputs))))