Allow filtering package derivations based on build server builds

This means you can query for derivations where builds exist or don't exist on
a given build server.

I think this will come in useful when submitting builds from a Guix Data
Service instance.
This commit is contained in:
Christopher Baines 2022-05-23 22:39:32 +01:00
parent 40035bcf9a
commit 6d403cbc8d
3 changed files with 80 additions and 0 deletions

View file

@ -191,6 +191,8 @@ ORDER BY systems.system DESC,
targets targets
minimum-builds minimum-builds
maximum-builds maximum-builds
build-from-build-servers
no-build-from-build-servers
limit-results limit-results
after-name after-name
(include-builds? #t) (include-builds? #t)
@ -238,6 +240,30 @@ ORDER BY systems.system DESC,
) <= " ) <= "
(number->string maximum-builds))) (number->string maximum-builds)))
'()) '())
,@(map
(lambda (build-server-id)
(string-append
"
EXISTS(
SELECT 1
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
AND builds.build_server_id = " (number->string build-server-id) "
)"))
(or build-from-build-servers '()))
,@(map
(lambda (build-server-id)
(string-append
"
NOT EXISTS(
SELECT 1
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
AND builds.build_server_id = " (number->string build-server-id) "
)"))
(or no-build-from-build-servers '()))
,@(cond ,@(cond
((eq? build-status #f) '()) ((eq? build-status #f) '())
((eq? build-status 'failing) ((eq? build-status 'failing)
@ -382,6 +408,8 @@ ORDER BY derivations.file_name
targets targets
minimum-builds minimum-builds
maximum-builds maximum-builds
build-from-build-servers
no-build-from-build-servers
limit-results limit-results
after-name after-name
(include-builds? #t) (include-builds? #t)
@ -429,6 +457,30 @@ ORDER BY derivations.file_name
) <= " ) <= "
(number->string maximum-builds))) (number->string maximum-builds)))
'()) '())
,@(map
(lambda (build-server-id)
(string-append
"
EXISTS(
SELECT 1
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
AND builds.build_server_id = " (number->string build-server-id) "
)"))
(or build-from-build-servers '()))
,@(map
(lambda (build-server-id)
(string-append
"
NOT EXISTS(
SELECT 1
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
AND builds.build_server_id = " (number->string build-server-id) "
)"))
(or no-build-from-build-servers '()))
,@(cond ,@(cond
((eq? build-status #f) '()) ((eq? build-status #f) '())
((eq? build-status 'failing) ((eq? build-status 'failing)

View file

@ -206,6 +206,10 @@
(target ,parse-target #:multi-value) (target ,parse-target #:multi-value)
(maximum_builds ,parse-number) (maximum_builds ,parse-number)
(minimum_builds ,parse-number) (minimum_builds ,parse-number)
(build_from_build_server ,parse-number
#:multi-value)
(no_build_from_build_server ,parse-number
#:multi-value)
(build_status ,parse-derivation-build-status) (build_status ,parse-derivation-build-status)
(field ,identity #:multi-value (field ,identity #:multi-value
#:default ("system" "target" "builds")) #:default ("system" "target" "builds"))
@ -1053,6 +1057,10 @@
#:targets (assq-ref query-parameters 'target) #:targets (assq-ref query-parameters 'target)
#:maximum-builds (assq-ref query-parameters 'maximum_builds) #:maximum-builds (assq-ref query-parameters 'maximum_builds)
#:minimum-builds (assq-ref query-parameters 'minimum_builds) #:minimum-builds (assq-ref query-parameters 'minimum_builds)
#:build-from-build-servers (assq-ref query-parameters
'build_from_build_server)
#:no-build-from-build-servers (assq-ref query-parameters
'no_build_from_build_server)
#:build-status (and=> (assq-ref query-parameters #:build-status (and=> (assq-ref query-parameters
'build_status) 'build_status)
string->symbol) string->symbol)
@ -1066,6 +1074,10 @@
#:targets (assq-ref query-parameters 'target) #:targets (assq-ref query-parameters 'target)
#:maximum-builds (assq-ref query-parameters 'maximum_builds) #:maximum-builds (assq-ref query-parameters 'maximum_builds)
#:minimum-builds (assq-ref query-parameters 'minimum_builds) #:minimum-builds (assq-ref query-parameters 'minimum_builds)
#:build-from-build-servers (assq-ref query-parameters
'build_from_build_server)
#:no-build-from-build-servers (assq-ref query-parameters
'no_build_from_build_server)
#:build-status (and=> (assq-ref query-parameters #:build-status (and=> (assq-ref query-parameters
'build_status) 'build_status)
string->symbol) string->symbol)

View file

@ -1548,6 +1548,12 @@ figure {
("Failing" . "failing") ("Failing" . "failing")
("Unknown" . "unknown"))) ("Unknown" . "unknown")))
(define build-server-options
(map (match-lambda
((id . url)
(cons url id)))
build-server-urls))
(define field-options (define field-options
(map (map
(lambda (field) (lambda (field)
@ -1606,6 +1612,16 @@ figure {
,(form-horizontal-control ,(form-horizontal-control
"Maximum builds" query-parameters "Maximum builds" query-parameters
#:help-text "Only show derivations with a maximum number of known builds.") #:help-text "Only show derivations with a maximum number of known builds.")
,(form-horizontal-control
"Build from build server" query-parameters
#:options build-server-options
#:help-text ""
#:font-family "monospace")
,(form-horizontal-control
"No build from build server" query-parameters
#:options build-server-options
#:help-text ""
#:font-family "monospace")
,(form-horizontal-control ,(form-horizontal-control
"Build status" query-parameters "Build status" query-parameters
#:allow-selecting-multiple-options #f #:allow-selecting-multiple-options #f