Add a page with charts to show package reproducibility

This commit is contained in:
Christopher Baines 2019-12-16 19:57:36 +00:00
parent 34b3585b48
commit 96f897cf3b
3 changed files with 328 additions and 0 deletions

View file

@ -13,6 +13,8 @@
select-nars-for-output
select-signing-key
select-reproducibility-status-for-revision
record-narinfo-details-and-return-ids))
(define narinfo-contents
@ -217,6 +219,67 @@ VALUES ($1, $2)")
(list (list (cons "jsonb"
public-key-json-string)))))))
(define (select-reproducibility-status-for-revision conn revision-commit)
(define query
"
SELECT system, target, reproducible, COUNT(*)
FROM (
SELECT derivation_output_details.path,
package_derivations.system,
package_derivations.target,
JSON_AGG(
json_build_object(
'hash', nars.hash,
'build_server_id', narinfo_fetch_records.build_server_id
)
),
CASE
WHEN (COUNT(DISTINCT narinfo_fetch_records.build_server_id) <= 1) THEN NULL
ELSE (COUNT(DISTINCT nars.hash) = 1)
END AS reproducible
FROM derivation_output_details
INNER JOIN derivation_outputs
ON derivation_outputs.derivation_output_details_id =
derivation_output_details.id
INNER JOIN package_derivations
ON derivation_outputs.derivation_id = package_derivations.derivation_id
INNER JOIN guix_revision_package_derivations
ON package_derivations.id = guix_revision_package_derivations.package_derivation_id
INNER JOIN guix_revisions
ON guix_revision_package_derivations.revision_id = guix_revisions.id
LEFT JOIN nars
ON derivation_output_details.path = nars.store_path
LEFT JOIN narinfo_signatures
ON narinfo_signatures.nar_id = nars.id
LEFT JOIN narinfo_signature_data
ON narinfo_signatures.narinfo_signature_data_id = narinfo_signature_data.id
LEFT JOIN narinfo_fetch_records
ON narinfo_fetch_records.narinfo_signature_data_id = narinfo_signature_data.id
WHERE derivation_output_details.hash IS NULL AND
guix_revisions.commit = $1 AND
package_derivations.system = package_derivations.target -- Exclude cross builds
GROUP BY derivation_output_details.path,
package_derivations.system,
package_derivations.target
) data
GROUP BY system, target, reproducible
ORDER BY COUNT(*) DESC")
(group-to-alist
(match-lambda
((system status count)
(cons system
(cons status count))))
(map (match-lambda
((system target status count)
(list system
(match status
("t" 'reproducible)
("f" 'unreproducible)
("" 'unknown))
(string->number count))))
(exec-query conn query (list revision-commit)))))
(define (select-outputs-for-successful-builds-without-known-nar-entries
conn
build-server-id