From 27c7f4e37ea556b8053123abdc49e51a23cabd8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hern=C3=A2ni=20Marques?= Date: Wed, 30 Sep 2026 22:17:03 +0200 Subject: [PATCH] feat(dossiers-ngi): sticky bar + JSON diffstat vs parent tip --- scripts/dossiers-ngi/README.md | 2 +- scripts/dossiers-ngi/branch-status-hourly.py | 21 ++++++++----------- .../_cascade/bar.js | 20 ++++++++++-------- .../cascade/_cascade/bar.js | 20 ++++++++++-------- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/scripts/dossiers-ngi/README.md b/scripts/dossiers-ngi/README.md index 064b830..6479398 100644 --- a/scripts/dossiers-ngi/README.md +++ b/scripts/dossiers-ngi/README.md @@ -58,7 +58,7 @@ Per branch in JSON / sticky bar: | `tip_time` | committer time of tip (`%cI`) | | `built_at` | when this edition freeze was written | | `build_seconds` | wall time of that freeze | -| `vs_main_plus` / `vs_main_minus` | `git diff --numstat` tip vs `main` tip (sticky bar +grün/−rot; omitted on `main`) | +| `vs_parent_plus` / `vs_parent_minus` | `git diff --numstat` tip vs parent tip (sticky bar +grün/−rot; omitted when no parent) | Rebuild runs **only when** `.edition-tip` ≠ current tip (timer never forces). Each run also: `git fetch --prune`, `worktree prune`, drop stale diff --git a/scripts/dossiers-ngi/branch-status-hourly.py b/scripts/dossiers-ngi/branch-status-hourly.py index 9bed2c3..f9caaec 100755 --- a/scripts/dossiers-ngi/branch-status-hourly.py +++ b/scripts/dossiers-ngi/branch-status-hourly.py @@ -235,9 +235,9 @@ def tip_recorded(editions: Path, slug: str) -> str: -def diff_vs_main(repo: Path, main_tip: str, tip: str) -> tuple[int, int]: - """Insertions/deletions of tip vs main tip (git diff --numstat).""" - if not main_tip or not tip or main_tip == tip: +def diff_numstat(repo: Path, parent_tip: str, tip: str) -> tuple[int, int]: + """Insertions/deletions of tip vs parent tip (git diff --numstat).""" + if not parent_tip or not tip or parent_tip == tip: return 0, 0 cp = git(repo, "diff", "--numstat", main_tip, tip, check=False) if cp.returncode != 0: @@ -555,10 +555,6 @@ def build_payload(repo: Path, tips: dict[str, str], rebuild: bool) -> dict: sync_flask_alias(ed_root, tips) tip_times = {name: tip_commit_time(repo, tip) for name, tip in tips.items()} - main_tip = tips.get("main", "") - vs_main = { - name: diff_vs_main(repo, main_tip, tip) for name, tip in tips.items() - } branches_out = [] for row in rows: name = row["branch"] @@ -584,11 +580,12 @@ def build_payload(repo: Path, tips: dict[str, str], rebuild: bool) -> dict: entry["built_at"] = meta["built_at"] if "build_seconds" in meta: entry["build_seconds"] = meta["build_seconds"] - # sticky bar: +grün / −rot vs main (omit on main itself) - if name != "main" and main_tip: - plus, minus = vs_main.get(name, (0, 0)) - entry["vs_main_plus"] = plus - entry["vs_main_minus"] = minus + # sticky bar: +grün / −rot vs parent tip; omit when no parent + parent = row["parent"] + if parent and parent in tips: + plus, minus = diff_numstat(repo, tips[parent], row["tip"]) + entry["vs_parent_plus"] = plus + entry["vs_parent_minus"] = minus branches_out.append(entry) payload = { diff --git a/sites/dossiers.ngi.hacktivism.ch/_cascade/bar.js b/sites/dossiers.ngi.hacktivism.ch/_cascade/bar.js index a4f4ea4..00fbc83 100644 --- a/sites/dossiers.ngi.hacktivism.ch/_cascade/bar.js +++ b/sites/dossiers.ngi.hacktivism.ch/_cascade/bar.js @@ -48,13 +48,13 @@ 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) { + // vs parent: +grün / −rot (omit when no parent) + var plus = row.vs_parent_plus; + var minus = row.vs_parent_minus; + if (row.parent && (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")) { + if (isFinite(p) && isFinite(m)) { parts.push( '+' + esc(String(p)) + @@ -70,12 +70,14 @@ 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 plus = row.vs_parent_plus; + var minus = row.vs_parent_minus; var vs = ""; - if (plus != null || minus != null) { + if (row.parent && (plus != null || minus != null)) { vs = - " vs main +" + + " vs " + + row.parent + + " +" + String(plus == null ? 0 : plus) + "/−" + String(minus == null ? 0 : minus); diff --git a/sites/dossiers.ngi.hacktivism.ch/cascade/_cascade/bar.js b/sites/dossiers.ngi.hacktivism.ch/cascade/_cascade/bar.js index a4f4ea4..00fbc83 100644 --- a/sites/dossiers.ngi.hacktivism.ch/cascade/_cascade/bar.js +++ b/sites/dossiers.ngi.hacktivism.ch/cascade/_cascade/bar.js @@ -48,13 +48,13 @@ 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) { + // vs parent: +grün / −rot (omit when no parent) + var plus = row.vs_parent_plus; + var minus = row.vs_parent_minus; + if (row.parent && (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")) { + if (isFinite(p) && isFinite(m)) { parts.push( '+' + esc(String(p)) + @@ -70,12 +70,14 @@ 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 plus = row.vs_parent_plus; + var minus = row.vs_parent_minus; var vs = ""; - if (plus != null || minus != null) { + if (row.parent && (plus != null || minus != null)) { vs = - " vs main +" + + " vs " + + row.parent + + " +" + String(plus == null ? 0 : plus) + "/−" + String(minus == null ? 0 : minus);