mirror of
https://github.com/Noratrieb/does-it-build.git
synced 2026-01-14 10:25:01 +01:00
198 lines
6.4 KiB
HTML
198 lines
6.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<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" />
|
|
</head>
|
|
<body>
|
|
<h1>Does it build?</h1>
|
|
<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>-->
|
|
<label for="target-filter">Target Filter</label>
|
|
<input id="target-filter" />
|
|
<label for="target-filter-failed">Filter failed</label>
|
|
<input type="checkbox" id="target-filter-failed" />
|
|
|
|
<table id="target-state" 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">
|
|
<svg
|
|
viewBox="0 0 16 16"
|
|
width="32"
|
|
height="32"
|
|
aria-labelledby="github-logo-title"
|
|
>
|
|
<title id="github-logo-title">GitHub</title>
|
|
<path
|
|
fill="black"
|
|
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"
|
|
></path>
|
|
</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>
|
|
</body>
|
|
</html>
|