release 1.13.3: sticky generated time in Europe/Zurich (CEST)

Display wall-clock like local `date` (CEST/CET), not UTC …Z. ISO datetime
keeps +02:00 offset so the live age counter stays correct.
This commit is contained in:
Hernâni Marques 2026-07-19 02:43:17 +02:00
parent aa854b034a
commit d5213adb7a
No known key found for this signature in database
GPG key ID: CB5738652768F7E9
4 changed files with 31 additions and 9 deletions

View file

@ -1 +1 @@
1.13.2
1.13.3

View file

@ -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.13.3** | 2026-07-19 | **Bugfix:** sticky **generated** time in **Europe/Zurich** (CEST/CET · MESZ/MEZ), not UTC `…Z`; ISO keeps offset for age JS. |
| **v1.13.2** | 2026-07-19 | **Bugfix:** sticky version link uses **commit** URL (`/src/commit/<sha>`) not `/src/tag/v…` (tags not yet pushed → Forgejo fat 404); tags v1.11v1.13.1 pushed to origin. |
| **v1.13.1** | 2026-07-19 | **Bugfix:** progress bar **global** done/total — phase `summary()` no longer snaps total to phase-local N (fixes 34/34 then 38/47); final `progress_finish` snaps once; header shows 0/N. |
| **v1.13.0** | 2026-07-19 | **Feature:** phase **devtesting** / **franken** — fake-franken CHF via `rusty.taler-ops.ch` (`taler-devtesting` geniban + fake-incoming); stage host-agent can include it. |

View file

@ -293,8 +293,14 @@ write_bootstrap_html() {
local curl="${COMMIT_URL:-}"
local clink="$cshort"
local gen iso
gen=$(date -u +"%Y-%m-%d %H:%M:%SZ" 2>/dev/null || date)
iso=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -Iseconds)
# Local wall clock (CEST/CET · MESZ/MEZ on CH/DE hosts), not UTC Z
if TZ=Europe/Zurich date +"%Y-%m-%d %H:%M:%S %Z" >/dev/null 2>&1; then
gen=$(TZ=Europe/Zurich date +"%Y-%m-%d %H:%M:%S %Z")
iso=$(TZ=Europe/Zurich date +"%Y-%m-%dT%H:%M:%S%z" | sed 's/\([+-][0-9][0-9]\)\([0-9][0-9]\)$/\1:\2/')
else
gen=$(date +"%Y-%m-%d %H:%M:%S %Z" 2>/dev/null || date)
iso=$(date -Iseconds 2>/dev/null || date)
fi
if [ -n "$curl" ]; then
clink="<a href=\"$(printf '%s' "$curl" | sed 's/&/\&amp;/g')\">$cshort</a>"
fi

View file

@ -8,6 +8,25 @@ import re
from datetime import datetime, timezone
from pathlib import Path
# Display timestamps in Central European time (CEST/CET · MESZ/MEZ), same as `date` on CH/DE hosts.
try:
from zoneinfo import ZoneInfo
MON_TZ = ZoneInfo("Europe/Zurich")
except Exception: # pragma: no cover
MON_TZ = timezone.utc
def format_generated_now() -> tuple[str, str]:
"""Return (display_local, iso_with_offset) for sticky bar + <time datetime>."""
now = datetime.now(MON_TZ)
# ISO with offset so JS Date.parse / age stays correct
generated_iso = now.isoformat(timespec="seconds")
# Human: 2026-07-19 02:41:34 CEST (MESZ in German speech = CEST)
tz_name = now.tzname() or "CEST"
generated_at = now.strftime("%Y-%m-%d %H:%M:%S") + f" {tz_name}"
return generated_at, generated_iso
def ui_lang(explicit: str = "") -> str:
"""en (default) or fr. Env: TALER_MON_LANG; auto fr for lefrancpaysan hosts."""
import os
@ -1734,9 +1753,7 @@ def build_redirect_html(
else html.escape(commit_short)
)
if not generated_at:
now = datetime.now(timezone.utc)
generated_iso = now.strftime("%Y-%m-%dT%H:%M:%SZ")
generated_at = now.strftime("%Y-%m-%d %H:%M:%SZ")
generated_at, generated_iso = format_generated_now()
# Redirect pages exist only when the run failed → treat as red if n_err unknown
if n_err <= 0:
n_err = max(n_err, 1)
@ -1842,9 +1859,7 @@ def main() -> None:
import os
os.environ["TALER_MON_LANG"] = args.lang
log_text = args.log.read_text(errors="replace") if args.log.is_file() else ""
now = datetime.now(timezone.utc)
generated_iso = now.strftime("%Y-%m-%dT%H:%M:%SZ")
generated_at = now.strftime("%Y-%m-%d %H:%M:%SZ")
generated_at, generated_iso = format_generated_now()
title = args.title or f"{args.page_label} {args.mode} · {args.hostname}"
raw_for_counts = [