(function () { var POLL_MS = 30000; function cookieEdition() { var m = document.cookie.match(/(?:^|; )tdpd_edition=([^;]*)/); if (!m) return "flask"; try { return decodeURIComponent(m[1]) || "flask"; } catch (e) { return "flask"; } } function esc(s) { return String(s) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """); } /** ISO → "YYYY-MM-DD HH:MM" (date required; clock-only was misleading across days). */ function shortTime(iso) { if (!iso) return ""; var m = String(iso).match( /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2})(?::\d{2})?/ ); if (m) return m[1] + " " + m[2]; return String(iso).slice(0, 16).replace("T", " "); } function fmtBuildSec(sec) { if (sec == null || sec === "") return ""; var n = Number(sec); if (!isFinite(n)) return ""; if (n < 10) return n.toFixed(1) + "s"; return Math.round(n) + "s"; } function metaHtml(row) { var tip = row.tip || ""; var tipTime = row.tip_time || ""; var builtAt = row.built_at || ""; var buildSec = row.build_seconds; var parts = []; if (tip) parts.push(esc("@" + tip)); if (tipTime) parts.push(esc("tip " + shortTime(tipTime))); if (buildSec != null && buildSec !== "") parts.push(esc("build " + fmtBuildSec(buildSec))); if (builtAt) parts.push(esc("at " + shortTime(builtAt))); // vs main: +grün / −rot (omit on main / when both zero absent) var plus = row.vs_main_plus; var minus = row.vs_main_minus; if (plus != null || minus != null) { var p = plus == null ? 0 : Number(plus); var m = minus == null ? 0 : Number(minus); if (isFinite(p) && isFinite(m) && (p > 0 || m > 0 || row.branch !== "main")) { parts.push( '+' + esc(String(p)) + ' −' + esc(String(m)) + "" ); } } return parts.join(" · "); } function rowTitle(row, buildSec) { var tip = row.tip || ""; var tipTime = row.tip_time || ""; var plus = row.vs_main_plus; var minus = row.vs_main_minus; var vs = ""; if (plus != null || minus != null) { vs = " vs main +" + String(plus == null ? 0 : plus) + "/−" + String(minus == null ? 0 : minus); } return ( "Switch build to " + (row.branch || "") + (tip ? " @ " + tip : "") + (tipTime ? " tip=" + tipTime : "") + (buildSec != null && buildSec !== "" ? " build=" + fmtBuildSec(buildSec) : "") + vs ); } function structureKey(list) { var parts = []; for (var i = 0; i < list.length; i++) { var row = list[i]; parts.push( (row.edition || "") + "\t" + (row.branch || "") + "\t" + (row.prefix || "") + "\t" + (row.parent || "") ); } return parts.join("\n"); } function markActive(root, edition) { var links = root.querySelectorAll("a[data-edition]"); for (var i = 0; i < links.length; i++) { var a = links[i]; var ed = a.getAttribute("data-edition"); var on = ed === edition || (edition === "flask" && a.getAttribute("data-default") === "1"); if (on) { a.classList.add("is-active"); a.setAttribute("aria-current", "page"); } else { a.classList.remove("is-active"); a.removeAttribute("aria-current"); } } } function timingText(timing, listLen) { if (!timing || timing.wall_seconds == null) return ""; return ( "last full pass ~" + String(timing.wall_seconds) + "s · built " + String(timing.built || 0) + " / skipped " + String(timing.skipped || 0) + " / " + String(timing.branches || listLen) ); } function updateValues(mount, data) { var list = (data && data.branches) || []; var defaultBranch = (data && data.default_branch) || "feat/website-views"; var timing = (data && data.rebuild_timing) || null; var rows = mount.querySelectorAll("a.cascade-tree-row[data-edition]"); if (rows.length !== list.length) return false; for (var i = 0; i < list.length; i++) { var row = list[i]; var a = rows[i]; if (a.getAttribute("data-edition") !== (row.edition || "")) return false; if (a.getAttribute("data-branch") !== (row.branch || "")) return false; var tipHtml = metaHtml(row); var tipEl = a.querySelector(".tip"); var wantTip = tipHtml ? " " + tipHtml : ""; if (tipEl) { if (tipEl.innerHTML !== wantTip) tipEl.innerHTML = wantTip; } else if (wantTip) { tipEl = document.createElement("span"); tipEl.className = "tip"; tipEl.innerHTML = wantTip; a.appendChild(tipEl); } var defEl = a.querySelector(".cascade-default"); var isDefault = (row.branch || "") === defaultBranch; if (isDefault && !defEl) { defEl = document.createElement("span"); defEl.className = "cascade-default"; defEl.textContent = " · default"; a.appendChild(defEl); } else if (!isDefault && defEl) { defEl.parentNode.removeChild(defEl); } a.setAttribute("title", rowTitle(row, row.build_seconds)); } var timingEl = mount.querySelector(".cascade-timing"); var t = timingText(timing, list.length); if (t) { if (!timingEl) { timingEl = document.createElement("div"); timingEl.className = "cascade-timing"; mount.appendChild(timingEl); } if (timingEl.textContent !== t) timingEl.textContent = t; } else if (timingEl) { timingEl.parentNode.removeChild(timingEl); } markActive(mount, cookieEdition()); return true; } function renderTree(data, soft) { var mount = document.getElementById("cascade-tree"); if (!mount) return; var list = (data && data.branches) || []; if (!list.length) { mount.textContent = "No branches in branch-status.json"; return; } if (soft && mount.getAttribute("data-structure") === structureKey(list)) { if (updateValues(mount, data)) return; } var defaultBranch = (data && data.default_branch) || "feat/website-views"; var timing = (data && data.rebuild_timing) || null; var html = []; html.push('
" +
esc(branch) +
"" +
(tipHtml ? ' ' + tipHtml + "" : "") +
(isDefault ? ' · default' : "");
html.push(
'' +
label +
""
);
}
html.push("flask' +
' (branch-status unavailable)';
markActive(mount, cookieEdition());
}
});
}
loadStatus(false);
setInterval(function () {
loadStatus(true);
}, POLL_MS);
})();