aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-02-12 08:37:38 +0000
committerChristopher Baines <mail@cbaines.net>2020-02-12 08:37:38 +0000
commit7306df0a0f6607d8b6fe385ffa83ad7638a66d7d (patch)
treec1fbac4e7fd0272b0718469d6332b205548cc9ae
parent7326e8b3bb08c0352cd53abb818c4a7e9f00d6eb (diff)
downloaddata-service-7306df0a0f6607d8b6fe385ffa83ad7638a66d7d.tar
data-service-7306df0a0f6607d8b6fe385ffa83ad7638a66d7d.tar.gz
Add a function to select channel instances for a revision
-rw-r--r--guix-data-service/model/channel-instance.scm50
1 files changed, 49 insertions, 1 deletions
diff --git a/guix-data-service/model/channel-instance.scm b/guix-data-service/model/channel-instance.scm
index 9df2722..b08ecae 100644
--- a/guix-data-service/model/channel-instance.scm
+++ b/guix-data-service/model/channel-instance.scm
@@ -23,7 +23,8 @@
#:use-module (guix utils)
#:use-module (guix-data-service model utils)
#:use-module (guix-data-service model derivation)
- #:export (insert-channel-instances))
+ #:export (insert-channel-instances
+ select-channel-instances-for-guix-revision))
(define (insert-channel-instances conn
guix-revision-id
@@ -50,3 +51,50 @@ VALUES "
derivation-ids)
", "))))
#t)
+
+(define (select-channel-instances-for-guix-revision conn
+ commit-hash)
+ (define query
+ "
+SELECT channel_instances.system,
+ derivations.file_name,
+ JSON_AGG(
+ json_build_object(
+ 'build_server_id', builds.build_server_id,
+ 'status', latest_build_status.status,
+ 'timestamp', latest_build_status.timestamp,
+ 'build_for_equivalent_derivation',
+ builds.derivation_file_name != derivations.file_name
+ )
+ ORDER BY latest_build_status.timestamp
+ ) AS builds
+FROM channel_instances
+INNER JOIN derivations
+ ON channel_instances.derivation_id = derivations.id
+INNER JOIN derivations_by_output_details_set
+ ON derivations.id = derivations_by_output_details_set.derivation_id
+LEFT OUTER JOIN builds
+ ON derivations_by_output_details_set.derivation_output_details_set_id =
+ builds.derivation_output_details_set_id
+LEFT OUTER JOIN (
+ SELECT DISTINCT ON (build_id) *
+ FROM build_status
+ ORDER BY build_id, timestamp DESC
+) AS latest_build_status
+ ON builds.id = latest_build_status.build_id
+INNER JOIN guix_revisions
+ ON guix_revisions.id = channel_instances.guix_revision_id
+WHERE guix_revisions.commit = $1
+GROUP BY channel_instances.system, derivations.file_name
+ORDER BY channel_instances.system DESC")
+
+ (map
+ (match-lambda
+ ((system derivation_file_name builds-json)
+ (list system
+ derivation_file_name
+ (filter (lambda (build)
+ (assoc-ref build "status"))
+ (vector->list
+ (json-string->scm builds-json))))))
+ (exec-query conn query (list commit-hash))))