aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-11-19 21:02:30 +0000
committerChristopher Baines <mail@cbaines.net>2020-11-19 21:02:30 +0000
commit31475374f739db5c8baecfe2879573a4bff56e4d (patch)
tree3e4f6315ce32cb30bef6ff2682a3e4253f7d490a /guix-data-service
parent80c6fbd1ac6454519c99958797a04ad390217c60 (diff)
downloaddata-service-31475374f739db5c8baecfe2879573a4bff56e4d.tar
data-service-31475374f739db5c8baecfe2879573a4bff56e4d.tar.gz
Support selecting compared package derivations by build change
Diffstat (limited to 'guix-data-service')
-rw-r--r--guix-data-service/comparison.scm123
1 files changed, 118 insertions, 5 deletions
diff --git a/guix-data-service/comparison.scm b/guix-data-service/comparison.scm
index c475d83..6b3ed4d 100644
--- a/guix-data-service/comparison.scm
+++ b/guix-data-service/comparison.scm
@@ -250,7 +250,11 @@ GROUP BY derivation_source_files.store_path"))
#:key
(systems #f)
(targets #f)
- (include-builds? #t))
+ (include-builds? #t)
+ ;; Build changes are (symbols):
+ ;; broken, fixed, still-failing,
+ ;; still-working, unknown
+ (build-change 'unknown))
(define extra-constraints
(string-append
(if systems
@@ -364,10 +368,119 @@ FULL OUTER JOIN target_packages
AND base_packages.system = target_packages.system
AND base_packages.target = target_packages.target
WHERE
- base_packages.id IS NULL OR
- target_packages.id IS NULL OR
- base_packages.id != target_packages.id OR
- base_packages.file_name != target_packages.file_name
+ (
+ base_packages.id IS NULL OR
+ target_packages.id IS NULL OR
+ base_packages.id != target_packages.id OR
+ base_packages.file_name != target_packages.file_name
+ )"
+ (cond
+ ((eq? build-change #f) "")
+ ((eq? build-change 'unknown)
+ "
+ AND (
+ (
+ base_packages.id IS NULL OR
+ target_packages.id IS NULL
+ )
+ OR
+ (
+ NOT EXISTS (
+ SELECT 1
+ FROM builds
+ INNER JOIN latest_build_status
+ ON builds.id = latest_build_status.build_id
+ WHERE builds.derivation_output_details_set_id =
+ base_packages.derivation_output_details_set_id
+ AND (
+ latest_build_status.status = 'succeeded'
+ OR
+ latest_build_status.status = 'failed'
+ )
+ )
+ AND NOT EXISTS (
+ SELECT 1
+ FROM builds
+ INNER JOIN latest_build_status
+ ON builds.id = latest_build_status.build_id
+ WHERE builds.derivation_output_details_set_id =
+ target_packages.derivation_output_details_set_id
+ AND (
+ latest_build_status.status = 'succeeded'
+ OR
+ latest_build_status.status = 'failed'
+ )
+ )
+ )
+ )")
+ (else
+ (let ((exists-build-with-status
+ (lambda (base-or-target status)
+ (simple-format
+ #f
+ "EXISTS (
+ SELECT 1
+ FROM builds
+ INNER JOIN latest_build_status
+ ON builds.id = latest_build_status.build_id
+ WHERE builds.derivation_output_details_set_id =
+ ~A_packages.derivation_output_details_set_id
+ AND latest_build_status.status = '~A'
+ )
+"
+ base-or-target
+ status)))
+ (not-exists-build-with-status
+ (lambda (base-or-target status)
+ (simple-format
+ #f
+ "NOT EXISTS (
+ SELECT 1
+ FROM builds
+ INNER JOIN latest_build_status
+ ON builds.id = latest_build_status.build_id
+ WHERE builds.derivation_output_details_set_id =
+ ~A_packages.derivation_output_details_set_id
+ AND latest_build_status.status = '~A'
+ )
+"
+ base-or-target
+ status)))
+ (criteria
+ (lambda args
+ (string-append
+ "\n AND "
+ (string-join
+ args
+ " \nAND\n ")))))
+ (string-append
+ "
+ AND base_packages.id IS NOT NULL
+ AND target_packages.id IS NOT NULL"
+ (cond
+ ((eq? build-change 'broken)
+ (criteria
+ (exists-build-with-status "base" "succeeded")
+ (exists-build-with-status "target" "failed")
+ (not-exists-build-with-status "target" "succeeded")))
+ ((eq? build-change 'fixed)
+ (criteria
+ (exists-build-with-status "base" "failed")
+ (not-exists-build-with-status "base" "succeeded")
+ (exists-build-with-status "target" "succeeded")))
+ ((eq? build-change 'still-failing)
+ (criteria
+ (not-exists-build-with-status "base" "succeeded")
+ (exists-build-with-status "base" "failed")
+ (not-exists-build-with-status "target" "succeeded")
+ (exists-build-with-status "target" "failed")))
+ ((eq? build-change 'still-working)
+ (criteria
+ (exists-build-with-status "base" "succeeded")
+ (exists-build-with-status "target" "succeeded")))
+ (else
+ (error "unknown build-change-value")))))))
+ "
ORDER BY coalesce(base_packages.name, target_packages.name) ASC, base_packages.version, target_packages.version"))
(exec-query conn query (list base_guix_revision_id target_guix_revision_id)))