From 1226d2a8f71fbedbb3858115a50409b2401145c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hern=C3=A2ni=20Marques?= Date: Sun, 19 Jul 2026 01:29:18 +0200 Subject: [PATCH] release 1.10.2: sticky ERROR word-boundary (no false wrote-errors) --- VERSION | 2 +- VERSIONS.md | 1 + site-gen/console_to_html.py | 7 ++++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 4dae298..5ad2491 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.10.1 +1.10.2 diff --git a/VERSIONS.md b/VERSIONS.md index e7946f4..971d9a6 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre | Tag | Date (UTC) | Notes | |-----|------------|--------| +| **v1.10.2** | 2026-07-19 | **Bugfix:** sticky ERROR count — classify with word-boundary `\bERROR\b` (not substring); avoids false red from git “wrote-errors” commit lines and similar. | | **v1.10.1** | 2026-07-19 | **Bugfix:** HTML converter must not treat teed `wrote … (errors=N)` lines as ERROR (false sticky red after clean host-agent runs). | | **v1.10.0** | 2026-07-19 | **Feature:** aptdeploy **container overview board** — inventory + per-pod matrix (state, merchant, httpd, ldd, OK/ERROR) in log and HTML sticky/top (`#container-overview`). | | **v1.9.4** | 2026-07-19 | **Fix:** restore **taler-monitoring-aptdeploy(+_err)** as first-class GOA mon page (catalog + monpages path allow + surface docs). Mail/mattermost stay folded into surface. | diff --git a/site-gen/console_to_html.py b/site-gen/console_to_html.py index a864b80..5d07a19 100755 --- a/site-gen/console_to_html.py +++ b/site-gen/console_to_html.py @@ -201,11 +201,12 @@ def classify(line: str) -> str: return "meta" if "BLOCKER" in u or "┌ BLOCKER" in u: return "blocker" - if "ERROR" in u or "┌ ERROR" in u: + # word-boundary: avoid "wrote-errors", "ERRORS=", commit subjects, etc. + if re.search(r"┌\s*ERROR\b|\[\s*ERROR\b|\bERROR\b", u) and not is_summary_error_line(line): return "error" - if "WARN" in u or "┌ WARN" in u: + if re.search(r"┌\s*WARN\b|\[\s*WARN\b|\bWARN\b", u): return "warn" - if "INFO" in u or "┌ INFO" in u: + if re.search(r"┌\s*INFO\b|\[\s*INFO\b|\bINFO\b", u): return "info" if " OK" in u or "[OK" in u or "┌ OK" in u or u.strip().startswith("OK"): return "ok"