aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2023-08-10 11:01:42 +0100
committerChristopher Baines <mail@cbaines.net>2023-08-10 11:01:42 +0100
commitf20372302f0361d64a7d44a7bf988e20d9ebf3f4 (patch)
tree2f8a7762080cfb362b0e5a99b478726e496944bf
parent15a5f5c39b398e6d01cc8112e2016fcf1313bc42 (diff)
downloadbuild-coordinator-f20372302f0361d64a7d44a7bf988e20d9ebf3f4.tar
build-coordinator-f20372302f0361d64a7d44a7bf988e20d9ebf3f4.tar.gz
Switch to a more rigorous method for finding potential source refs
-rw-r--r--guix-build-coordinator/datastore.scm1
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm42
-rw-r--r--guix-build-coordinator/hooks.scm13
3 files changed, 47 insertions, 9 deletions
diff --git a/guix-build-coordinator/datastore.scm b/guix-build-coordinator/datastore.scm
index 3fec2b5..ad143f4 100644
--- a/guix-build-coordinator/datastore.scm
+++ b/guix-build-coordinator/datastore.scm
@@ -80,6 +80,7 @@
(re-export datastore-find-derivation-output-details)
(re-export datastore-find-derivation-system)
(re-export datastore-find-derivation-inputs)
+(re-export datastore-find-recursive-derivation-input-outputs)
(re-export datastore-find-derivation-for-output)
(re-export datastore-list-builds-for-output)
(re-export datastore-list-builds-for-output-and-system)
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm
index bc086fb..054ad96 100644
--- a/guix-build-coordinator/datastore/sqlite.scm
+++ b/guix-build-coordinator/datastore/sqlite.scm
@@ -74,6 +74,7 @@
datastore-find-derivation
datastore-find-derivation-system
datastore-find-derivation-inputs
+ datastore-find-recursive-derivation-input-outputs
datastore-find-derivation-for-output
datastore-find-derivation-outputs
datastore-find-derivation-output-details
@@ -3972,6 +3973,47 @@ WHERE derivations.id = :derivation_id"
result)))))
+(define-method (datastore-find-recursive-derivation-input-outputs
+ (datastore <sqlite-datastore>)
+ derivation-name)
+ (call-with-worker-thread
+ (slot-ref datastore 'worker-reader-thread-channel)
+ (lambda (db)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+WITH RECURSIVE related_derivations(id) AS (
+ VALUES(:derivation_id)
+UNION
+ SELECT derivation_outputs.derivation_id
+ FROM related_derivations
+ INNER JOIN derivation_inputs
+ ON related_derivations.id = derivation_inputs.derivation_id
+ INNER JOIN derivation_outputs
+ ON derivation_inputs.derivation_output_id = derivation_outputs.id
+)
+SELECT outputs.output
+FROM related_derivations
+INNER JOIN derivation_outputs
+ ON related_derivations.id = derivation_outputs.derivation_id
+INNER JOIN outputs
+ ON derivation_outputs.output_id = outputs.id"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:derivation_id (db-find-derivation-id db derivation-name))
+
+ (let ((result
+ (sqlite-map
+ (match-lambda
+ (#(output) output))
+ statement)))
+ (sqlite-reset statement)
+
+ result)))))
+
(define-method (datastore-find-derivation-for-output
(datastore <sqlite-datastore>)
start-derivation-name
diff --git a/guix-build-coordinator/hooks.scm b/guix-build-coordinator/hooks.scm
index f7e911a..a0ae0c1 100644
--- a/guix-build-coordinator/hooks.scm
+++ b/guix-build-coordinator/hooks.scm
@@ -104,8 +104,6 @@
(define (process-referenced-derivation-source-files drv-name)
(let* ((build-outputs
(datastore-list-build-outputs datastore build-id))
- (derivation-inputs
- (datastore-find-derivation-inputs datastore drv-name))
(potential-referenced-source-files
;; Just subtract the inputs from the output references
(lset-difference
@@ -118,13 +116,10 @@
'()))
build-outputs)
string=?)
- (map (lambda (input)
- (basename (assq-ref input 'output)))
- derivation-inputs)
- ;; Ignore references to outputs of this build
- (map (lambda (output)
- (basename (assq-ref output 'output)))
- build-outputs))))
+ (map basename
+ (datastore-find-recursive-derivation-input-outputs
+ datastore
+ drv-name)))))
(unless (null? potential-referenced-source-files)
(display