add miri std support

This commit is contained in:
nora 2024-09-08 11:44:16 +02:00
parent ccb57e400c
commit 262e8acd9f
8 changed files with 394 additions and 225 deletions

View file

@ -4,19 +4,15 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Does it build?</title>
<link rel="stylesheet" href="/index.css" />
<link rel="stylesheet" href="index.css" />
</head>
<body>
<h1>Does it build?</h1>
<!--core-->
<h2>Core Build</h2>
<p>Builds every target with:
<pre>cargo build --release -Zbuild-std=core</pre></p>
<p>Does therefore currently not check for the std build status.</p>
<!--<form id="nightly-form">
<h2>Force manual build</h2>
<label for="nightly-date-field">Nightly date</label>
<input id="nightly-date-field" placeholder="2024-08-05" type="text" />
<input type="submit" />
</form>-->
<p>This checks that codegen/linking of core works, but does not check whether std builds.</p>
<label for="target-filter">Target Filter</label>
<input id="target-filter" />
<label for="target-filter-failed">Filter failed</label>
@ -27,6 +23,23 @@
<td>loading...</td>
</tr>
</table>
<!--std-->
<h2>Miri Std Build</h2>
<p>Builds every target with:
<pre>cargo miri setup</pre></p>
<p>This checks that std builds (on targets that have it) but does not check whether codegen/linking works.</p>
<label for="target-filter-miri">Target Filter</label>
<input id="target-filter-miri" />
<label for="target-filter-failed-miri">Filter failed</label>
<input type="checkbox" id="target-filter-failed-miri" />
<table id="target-state-miri" class="target-state-table">
<tr>
<td>loading...</td>
</tr>
</table>
<footer class="footer">
<span>does-it-build {{version}}</span>
<a href="https://github.com/Noratrieb/does-it-build">
@ -44,155 +57,7 @@
</svg>
</a>
</footer>
<script>
let data = [];
let filter = localStorage.getItem("filter") ?? "";
document.getElementById("target-filter").value = filter;
document.getElementById("target-filter-failed").value =
localStorage.getItem("filterFailed") ?? false;
const table = document.getElementById("target-state");
function fetchTargets() {
fetch("/target-state")
.then((body) => body.json())
.then((body) => {
data = body;
renderTable();
});
}
function renderTable() {
const allTargets = new Set();
const allNightlies = new Set();
const nightlyInfos = new Map();
// Targets that have, at some point, errored
const targetsWithErrors = new Set();
for (const info of data) {
allNightlies.add(info.nightly);
if (!info.target.includes(filter)) {
continue;
}
if (info.status === "error") {
targetsWithErrors.add(info.target);
}
allTargets.add(info.target);
if (!nightlyInfos.has(info.nightly)) {
nightlyInfos.set(info.nightly, new Map());
}
nightlyInfos.get(info.nightly).set(info.target, info);
}
const nightlies = Array.from(allNightlies);
nightlies.sort();
nightlies.reverse();
const targets = Array.from(allTargets);
targets.sort();
const header = document.createElement("tr");
const headerNightly = document.createElement("th");
headerNightly.innerText = "nightly";
header.appendChild(headerNightly);
const targetHeaders = targets.forEach((target) => {
if (
document.getElementById("target-filter-failed").checked &&
!targetsWithErrors.has(target)
) {
return;
}
const elem = document.createElement("th");
elem.innerText = target;
header.appendChild(elem);
});
const rows = nightlies.map((nightly) => {
const tr = document.createElement("tr");
const nightlyCol = document.createElement("td");
nightlyCol.innerText = nightly;
tr.appendChild(nightlyCol);
const info = nightlyInfos.get(nightly) ?? new Map();
for (const target of targets) {
if (
document.getElementById("target-filter-failed").checked &&
!targetsWithErrors.has(target)
) {
continue;
}
const td = document.createElement("td");
const targetInfo = info.get(target);
if (targetInfo) {
const a = document.createElement("a");
a.classList.add("build-info-a");
a.href = `/build?nightly=${encodeURIComponent(
nightly
)}&target=${encodeURIComponent(target)}`;
a.innerText = targetInfo.status;
td.appendChild(a);
td.classList.add(targetInfo.status);
} else {
td.innerText = "";
td.classList.add("missing");
}
tr.appendChild(td);
}
return tr;
});
table.replaceChildren(header, ...rows);
}
//function onTriggerBuild(e) {
// e.preventDefault();
//
// const date = document.getElementById("nightly-date-field").value;
// if (!date) {
// return;
// }
//
// fetch("/trigger-build", {
// method: "POST",
// body: JSON.stringify({
// nightly: date,
// }),
// headers: {
// "Content-Type": "application/json",
// },
// }).then(() =>
// alert(`triggered build for ${date}, this may take a few minutes`)
// );
//}
function onFilterChange(e) {
filter = e.target.value;
localStorage.setItem("filter", filter);
console.log(filter);
renderTable();
}
//document
// .getElementById("nightly-form")
// .addEventListener("submit", onTriggerBuild);
document
.getElementById("target-filter")
.addEventListener("input", onFilterChange);
document
.getElementById("target-filter-failed")
.addEventListener("input", renderTable);
// Initial fetch
fetchTargets();
<script src="index.js">
</script>
</body>
</html>

158
static/index.js Normal file
View file

@ -0,0 +1,158 @@
class Table {
constructor(data, tableElemId, filterElemId, filterFailedElemId) {
this.data = data;
this.elem = document.getElementById(tableElemId);
document.getElementById(filterElemId).addEventListener("input", (e) => {
this.filter.search = e.target.value;
this.render();
});
document
.getElementById(filterFailedElemId)
.addEventListener("input", (e) => {
this.filter.filterFailed = e.target.checked;
this.render();
});
this.filter = {
search: "",
filterFailed: false,
};
}
update(data) {
this.data = data;
}
render() {
const allTargets = new Set();
const allNightlies = new Set();
const nightlyInfos = new Map();
// Targets that have, at some point, errored
const targetsWithErrors = new Set();
// Whether a nightly is completely broken.
// These are still filtered out when filter failed is selected.
const isNightlyBroken = new Map();
// The first pass over the data, to find nightlies that are broken.
for (const info of this.data) {
if (!isNightlyBroken.has(info.nightly)) {
// Assume that a nightly is broken until proven otherwise.
isNightlyBroken.set(info.nightly, true);
}
if (info.status == "pass") {
// This nightly has built something, so it's clearly not broken :).
isNightlyBroken.set(info.nightly, false);
}
}
// Second pass over the data, group by nightly and prepare data for filter.
for (const info of this.data) {
allNightlies.add(info.nightly);
if (!info.target.includes(this.filter.search)) {
continue;
}
if (info.status === "error" && !isNightlyBroken.get(info.nightly)) {
targetsWithErrors.add(info.target);
}
allTargets.add(info.target);
if (!nightlyInfos.has(info.nightly)) {
nightlyInfos.set(info.nightly, new Map());
}
nightlyInfos.get(info.nightly).set(info.target, info);
}
const nightlies = Array.from(allNightlies);
nightlies.sort();
nightlies.reverse();
const targets = Array.from(allTargets);
targets.sort();
const header = document.createElement("tr");
const headerNightly = document.createElement("th");
headerNightly.innerText = "nightly";
header.appendChild(headerNightly);
targets.forEach((target) => {
if (this.filter.filterFailed && !targetsWithErrors.has(target)) {
return;
}
const elem = document.createElement("th");
elem.innerText = target;
header.appendChild(elem);
});
const rows = nightlies.map((nightly) => {
const tr = document.createElement("tr");
const nightlyCol = document.createElement("td");
nightlyCol.innerText = nightly;
tr.appendChild(nightlyCol);
const info = nightlyInfos.get(nightly) ?? new Map();
for (const target of targets) {
if (this.filter.filterFailed && !targetsWithErrors.has(target)) {
continue;
}
const td = document.createElement("td");
const targetInfo = info.get(target);
if (targetInfo) {
const a = document.createElement("a");
a.classList.add("build-info-a");
a.href = `build?nightly=${encodeURIComponent(
nightly
)}&target=${encodeURIComponent(target)}&mode=${encodeURIComponent(
targetInfo.mode
)}`;
a.innerText = targetInfo.status;
td.appendChild(a);
td.classList.add(targetInfo.status);
} else {
td.innerText = "";
td.classList.add("missing");
}
tr.appendChild(td);
}
return tr;
});
this.elem.replaceChildren(header, ...rows);
}
}
const coreTable = new Table(
[],
"target-state",
"target-filter",
"target-filter-failed"
);
const miriTable = new Table(
[],
"target-state-miri",
"target-filter-miri",
"target-filter-failed-miri"
);
function fetchTargets() {
fetch("target-state")
.then((body) => body.json())
.then((body) => {
const core = body.filter((info) => info.mode === "core");
const miri = body.filter((info) => info.mode === "miri-std");
coreTable.update(core);
miriTable.update(miri);
coreTable.render();
miriTable.render();
});
}
// Initial fetch
fetchTargets();