aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/hooks.scm
diff options
context:
space:
mode:
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))))