Fix related builds in select-derivations-in-revision

Rather than just counting builds where the derivation matches, select builds
based on the derivation outputs, which accounts for different but equivalent
derivations.
This commit is contained in:
Christopher Baines 2019-12-07 19:27:56 +01:00
parent c8b93cb0d0
commit 544f122ff5

View file

@ -141,13 +141,25 @@ ORDER BY derivations.system DESC,
,@(if minimum-builds ,@(if minimum-builds
(list (list
(string-append (string-append
"(SELECT COUNT(DISTINCT id) FROM builds WHERE derivation_file_name = derivations.file_name) >= " "
(
SELECT COUNT(*)
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
) >= "
(number->string minimum-builds))) (number->string minimum-builds)))
'()) '())
,@(if maximum-builds ,@(if maximum-builds
(list (list
(string-append (string-append
"(SELECT COUNT(DISTINCT id) FROM builds WHERE derivation_file_name = derivations.file_name) <= " "
(
SELECT COUNT(*)
FROM builds
WHERE builds.derivation_output_details_set_id =
derivations_by_output_details_set.derivation_output_details_set_id
) <= "
(number->string maximum-builds))) (number->string maximum-builds)))
'())) '()))
" AND ")) " AND "))
@ -176,15 +188,8 @@ SELECT derivations.file_name,
ORDER BY build_id, timestamp DESC ORDER BY build_id, timestamp DESC
) AS latest_build_status ) AS latest_build_status
ON builds.id = latest_build_status.build_id ON builds.id = latest_build_status.build_id
WHERE builds.derivation_file_name IN ( WHERE builds.derivation_output_details_set_id =
SELECT dervs_for_file_names.file_name derivations_by_output_details_set.derivation_output_details_set_id
FROM derivations AS dervs_for_file_names
WHERE ARRAY[dervs_for_file_names.id] <@ (
SELECT equivalent_derivations.derivation_ids
FROM equivalent_derivations
WHERE ARRAY[derivations.id] <@ equivalent_derivations.derivation_ids
)
)
) AS builds, ) AS builds,
( (
SELECT SELECT
@ -219,6 +224,8 @@ SELECT derivations.file_name,
WHERE derivation_outputs.derivation_id = derivations.id WHERE derivation_outputs.derivation_id = derivations.id
) AS outputs ) AS outputs
FROM derivations FROM derivations
INNER JOIN derivations_by_output_details_set
ON derivations.id = derivations_by_output_details_set.derivation_id
INNER JOIN package_derivations INNER JOIN package_derivations
ON derivations.id = package_derivations.derivation_id ON derivations.id = package_derivations.derivation_id
INNER JOIN guix_revision_package_derivations INNER JOIN guix_revision_package_derivations