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:
parent
aa854b034a
commit
d5213adb7a
4 changed files with 31 additions and 9 deletions
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
1.13.2
|
1.13.3
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre
|
||||||
|
|
||||||
| Tag | Date (UTC) | Notes |
|
| 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.11–v1.13.1 pushed to origin. |
|
| **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.11–v1.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.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. |
|
| **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. |
|
||||||
|
|
|
||||||
|
|
@ -293,8 +293,14 @@ write_bootstrap_html() {
|
||||||
local curl="${COMMIT_URL:-}"
|
local curl="${COMMIT_URL:-}"
|
||||||
local clink="$cshort"
|
local clink="$cshort"
|
||||||
local gen iso
|
local gen iso
|
||||||
gen=$(date -u +"%Y-%m-%d %H:%M:%SZ" 2>/dev/null || date)
|
# Local wall clock (CEST/CET · MESZ/MEZ on CH/DE hosts), not UTC Z
|
||||||
iso=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -Iseconds)
|
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
|
if [ -n "$curl" ]; then
|
||||||
clink="<a href=\"$(printf '%s' "$curl" | sed 's/&/\&/g')\">$cshort</a>"
|
clink="<a href=\"$(printf '%s' "$curl" | sed 's/&/\&/g')\">$cshort</a>"
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,25 @@ import re
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from pathlib import Path
|
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:
|
def ui_lang(explicit: str = "") -> str:
|
||||||
"""en (default) or fr. Env: TALER_MON_LANG; auto fr for lefrancpaysan hosts."""
|
"""en (default) or fr. Env: TALER_MON_LANG; auto fr for lefrancpaysan hosts."""
|
||||||
import os
|
import os
|
||||||
|
|
@ -1734,9 +1753,7 @@ def build_redirect_html(
|
||||||
else html.escape(commit_short)
|
else html.escape(commit_short)
|
||||||
)
|
)
|
||||||
if not generated_at:
|
if not generated_at:
|
||||||
now = datetime.now(timezone.utc)
|
generated_at, generated_iso = format_generated_now()
|
||||||
generated_iso = now.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
||||||
generated_at = now.strftime("%Y-%m-%d %H:%M:%SZ")
|
|
||||||
# Redirect pages exist only when the run failed → treat as red if n_err unknown
|
# Redirect pages exist only when the run failed → treat as red if n_err unknown
|
||||||
if n_err <= 0:
|
if n_err <= 0:
|
||||||
n_err = max(n_err, 1)
|
n_err = max(n_err, 1)
|
||||||
|
|
@ -1842,9 +1859,7 @@ def main() -> None:
|
||||||
import os
|
import os
|
||||||
os.environ["TALER_MON_LANG"] = args.lang
|
os.environ["TALER_MON_LANG"] = args.lang
|
||||||
log_text = args.log.read_text(errors="replace") if args.log.is_file() else ""
|
log_text = args.log.read_text(errors="replace") if args.log.is_file() else ""
|
||||||
now = datetime.now(timezone.utc)
|
generated_at, generated_iso = format_generated_now()
|
||||||
generated_iso = now.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
||||||
generated_at = now.strftime("%Y-%m-%d %H:%M:%SZ")
|
|
||||||
title = args.title or f"{args.page_label} {args.mode} · {args.hostname}"
|
title = args.title or f"{args.page_label} {args.mode} · {args.hostname}"
|
||||||
|
|
||||||
raw_for_counts = [
|
raw_for_counts = [
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue