diff options
author | Christopher Baines <mail@cbaines.net> | 2023-08-10 11:01:42 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2023-08-10 11:01:42 +0100 |
commit | f20372302f0361d64a7d44a7bf988e20d9ebf3f4 (patch) | |
tree | 2f8a7762080cfb362b0e5a99b478726e496944bf | |
parent | 15a5f5c39b398e6d01cc8112e2016fcf1313bc42 (diff) | |
download | build-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.scm | 1 | ||||
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 42 | ||||
-rw-r--r-- | guix-build-coordinator/hooks.scm | 13 |
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 |