aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-02-16 09:54:27 +0000
committerChristopher Baines <mail@cbaines.net>2020-02-16 09:54:27 +0000
commit9c7310f8e3d4a05c87e1068b927356fd2091247b (patch)
treede104ab29c9caf6972859ef4a302fe062a1e3248
parent6f97cec96210b1e4d4852af2a799d2e0936c5dcb (diff)
downloaddata-service-9c7310f8e3d4a05c87e1068b927356fd2091247b.tar
data-service-9c7310f8e3d4a05c87e1068b927356fd2091247b.tar.gz
Make it possible to query builds servers for specific outputs
-rw-r--r--guix-data-service/builds.scm53
-rw-r--r--scripts/guix-data-service-query-build-servers.in16
2 files changed, 51 insertions, 18 deletions
diff --git a/guix-data-service/builds.scm b/guix-data-service/builds.scm
index 76d1fd0..70c30d4 100644
--- a/guix-data-service/builds.scm
+++ b/guix-data-service/builds.scm
@@ -119,6 +119,7 @@ initial connection on which HTTP requests are sent."
(make-parameter #f))
(define* (query-build-servers conn build-server-ids revision-commits
+ outputs
#:key verbose?)
(parameterize
((verbose-output? verbose?))
@@ -134,7 +135,7 @@ initial connection on which HTTP requests are sent."
(simple-format #t "\nQuerying ~A\n" url)
(catch #t
(lambda ()
- (query-build-server conn id url revision-commits))
+ (query-build-server conn id url revision-commits outputs))
(lambda (key . args)
(simple-format
(current-error-port)
@@ -142,11 +143,40 @@ initial connection on which HTTP requests are sent."
key args)))))))
build-servers)))))
-(define (query-build-server conn id url revision-commits)
+(define (query-build-server conn id url revision-commits outputs)
+ (define (fetch-derivation-output-details-set-id output)
+ (match (exec-query
+ conn
+ "
+SELECT derivations_by_output_details_set.derivation_output_details_set_id
+FROM derivations_by_output_details_set
+INNER JOIN derivation_outputs
+ ON derivation_outputs.derivation_id =
+ derivations_by_output_details_set.derivation_id
+INNER JOIN derivation_output_details
+ ON derivation_outputs.derivation_output_details_id =
+ derivation_output_details.id
+WHERE derivation_output_details.path = $1"
+ (list output))
+ (((id))
+ (string->number id))
+ (() #f)))
+
(simple-format #t "\nFetching pending builds\n")
(process-pending-builds conn id url)
(simple-format #t "\nFetching unseen derivations\n")
- (process-derivation-outputs conn id url revision-commits)
+ (process-derivation-outputs
+ conn id url
+ (if outputs
+ (fold (lambda (output result)
+ (vhash-cons output
+ (fetch-derivation-output-details-set-id output)
+ result))
+ vlist-null
+ outputs)
+ (select-derivation-outputs-with-no-known-build conn
+ id
+ revision-commits)))
(simple-format #t "\nFetching narinfo files\n")
(fetch-narinfo-files conn id url revision-commits))
@@ -216,12 +246,8 @@ initial connection on which HTTP requests are sent."
(usleep 200)))
(select-pending-builds conn build-server-id)))
-(define (process-derivation-outputs conn build-server-id url revision-commits)
- (define derivation-output-paths-and-details-sets-ids
- (select-derivation-outputs-with-no-known-build conn
- build-server-id
- revision-commits))
-
+(define (process-derivation-outputs conn build-server-id url
+ derivation-output-paths-and-details-sets-ids)
(simple-format (current-error-port) "Fetching ~A derivation outputs\n"
(vlist-length derivation-output-paths-and-details-sets-ids))
(fetch-builds-by-output
@@ -244,9 +270,12 @@ initial connection on which HTTP requests are sent."
build-server-id
derivation
#:derivation-output-details-set-id
- (cdr
- (vhash-assoc output
- derivation-output-paths-and-details-sets-ids)))))
+ (match
+ (vhash-assoc
+ output
+ derivation-output-paths-and-details-sets-ids)
+ ((key . value) value)
+ (#f #f)))))
(insert-build-statuses-from-data
conn
build-server-id
diff --git a/scripts/guix-data-service-query-build-servers.in b/scripts/guix-data-service-query-build-servers.in
index 8f96bed..8b87310 100644
--- a/scripts/guix-data-service-query-build-servers.in
+++ b/scripts/guix-data-service-query-build-servers.in
@@ -50,12 +50,15 @@
(lambda (opt name arg result)
(error "unrecognized option" name))
(lambda (arg result)
- (alist-cons
- 'revision-commits
- (cons arg
- (or (assoc-ref result 'revision-commits)
- '()))
- (alist-delete 'revision-commits result)))
+ (let ((type (if (string-prefix? "/gnu/store/" arg)
+ 'outputs
+ 'revision-commits)))
+ (alist-cons
+ type
+ (cons arg
+ (or (assoc-ref result type)
+ '()))
+ (alist-delete type result))))
%default-options))
(let ((opts (parse-options (cdr (program-arguments)))))
@@ -65,4 +68,5 @@
(query-build-servers conn
(assq-ref opts 'build-server-ids)
(assq-ref opts 'revision-commits)
+ (assq-ref opts 'outputs)
#:verbose? (assq-ref opts 'verbose)))))