From 74e76aff2c82e2734ff7a4e2015011c5396a5d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hern=C3=A2ni=20Marques?= Date: Sun, 19 Jul 2026 02:35:09 +0200 Subject: [PATCH] release 1.13.1: global progress done/total stable across phases Phase summary no longer resets PROGRESS_TOTAL to local done (which made bars like 34/34 then 38/47). Total is fixed at run start; only grows if short; progress_finish snaps once at the end of the whole run. --- VERSION | 2 +- VERSIONS.md | 1 + i18n.sh | 3 +++ lib.sh | 60 +++++++++++++++++++++++++++++++++------------ taler-monitoring.sh | 27 ++++++++++++++------ 5 files changed, 70 insertions(+), 23 deletions(-) diff --git a/VERSION b/VERSION index feaae22..b50dd27 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.13.0 +1.13.1 diff --git a/VERSIONS.md b/VERSIONS.md index abe5e61..7719546 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.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.12.0** | 2026-07-19 | **Feature:** collapsible **monitoring env context** (agent header: env_file, suite pin, domain/hosts/flags) — `
` default closed; summary shows agent · domain · suite. | | **v1.11.0** | 2026-07-19 | **Feature:** sticky **error/warn filter** — click counts to show only error or only warn log lines; sticky bar + overviews stay; `#filter-error` / `#filter-warn` (+ `#first-*` still works). | diff --git a/i18n.sh b/i18n.sh index 45dd1b7..5ca1d18 100644 --- a/i18n.sh +++ b/i18n.sh @@ -55,6 +55,9 @@ i18n_text() { fi case "$s" in "numbered checks this run:") printf 'controles numerotes de cette execution :' ;; + "numbered checks:") printf 'controles numerotes :' ;; + "(global done/total)") printf '(fait/total global)' ;; + "global checks:") printf 'controles globaux :' ;; "failed — see list above"|"failed - see list above") printf 'echec — voir la liste ci-dessus' ;; "BLOCKERS · pay/withdraw cannot finish") printf 'BLOCAGES · paiement/retrait impossible' ;; "BLOCKERS (pay/withdraw cannot finish)") printf 'BLOCAGES (paiement/retrait impossible)' ;; diff --git a/lib.sh b/lib.sh index 7eb8e99..92dc43b 100755 --- a/lib.sh +++ b/lib.sh @@ -590,20 +590,38 @@ add_progress_total() { PROGRESS_TOTAL=$((PROGRESS_TOTAL + n)) _mon_state_save } -# When estimate was short, grow total so we never print done>total (e.g. 224/205). -# Keeps ~10% headroom so the bar is not stuck at 100% while checks continue. +# When the global estimate was short, grow total just enough so done≤total. +# Never shrink. Mid-run headroom is small and monotonic (stable N in done/N). _progress_rebalance() { [ "${PROGRESS_TOTAL:-0}" -gt 0 ] || return 0 [ "${PROGRESS_DONE:-0}" -gt 0 ] || return 0 if [ "$PROGRESS_DONE" -gt "$PROGRESS_TOTAL" ]; then - local head=$((PROGRESS_DONE / 10)) - [ "$head" -lt 12 ] && head=12 + # + max(8, 5% of done) so we do not snap to 100% then jump again next check + local head=$((PROGRESS_DONE / 20)) + [ "$head" -lt 8 ] && head=8 PROGRESS_TOTAL=$((PROGRESS_DONE + head)) + _mon_state_save + fi +} +# Snap total to actual done — only at whole-run end (not after each phase). +progress_finish() { + [ "${PROGRESS_OFF:-0}" = "1" ] && return 0 + [ "${PROGRESS_DONE:-0}" -gt 0 ] || return 0 + if [ "${PROGRESS_TOTAL:-0}" -ne "$PROGRESS_DONE" ]; then + PROGRESS_TOTAL=$PROGRESS_DONE + _mon_state_save + fi + _progress_bar_line "$PROGRESS_DONE" "$PROGRESS_TOTAL" + if [ "${GLOBAL_N:-0}" -gt 0 ]; then + printf -- '%s %s %d/%d (#001…#%03d)%s\n' \ + "$D" "$(i18n_text 'global checks:')" \ + "$PROGRESS_DONE" "$PROGRESS_TOTAL" "$GLOBAL_N" "$N" fi } _progress_bar_line() { - # Format (grows left → right; badge = percent, not "PROG"): + # Format (grows left → right; badge = percent): # ┌ 42% ┐ ████████░░░░░░░░░░░░░░░░ 31/74 + # done/total = global numbered checks so far / global expected total local done="$1" total="$2" width=28 pct=0 filled empty i bar pct_lab # Defensive: never display done > total if [ "$total" -gt 0 ] && [ "$done" -gt "$total" ]; then @@ -636,7 +654,7 @@ _progress_bar_line() { while [ "$i" -lt "$empty" ]; do bar="${bar}░"; i=$((i + 1)); done pct_lab=$(printf '%3d%%' "$pct") if [ "${BOX:-0}" = "1" ]; then - # badge = percent (clearer than "PROG"); bar grows ░→█ left to right + # badge = percent; bar grows ░→█ left to right; N/M = global check count printf '%s┌%s┐%s %s%s%s %s%d/%d%s\n' \ "$BG_PROG" "$pct_lab" "$N" \ "$C" "$bar" "$N" \ @@ -647,10 +665,10 @@ _progress_bar_line() { fi else if [ "${BOX:-0}" = "1" ]; then - printf '%s┌ … ┐%s %sdone=%d%s (set PROGRESS_TOTAL= for %%)\n' \ + printf '%s┌ … ┐%s %s%d/?%s (set PROGRESS_TOTAL= for global %%)\n' \ "$BG_PROG" "$N" "$D" "$done" "$N" else - printf -- '%sdone=%d%s (set PROGRESS_TOTAL= for %%)\n' "$D" "$done" "$N" + printf -- '%s%d/?%s (set PROGRESS_TOTAL= for global %%)\n' "$D" "$done" "$N" fi fi } @@ -811,17 +829,29 @@ section() { summary() { local blk_n=${#BLOCKERS[@]} echo "" - # final progress line (no _take_tid — plain printf) - if [ "${PROGRESS_OFF:-0}" != "1" ] && [ "$PROGRESS_DONE" -gt 0 ]; then - # Snap total to actual so last line is exact N/N 100% - if [ "$PROGRESS_TOTAL" -gt 0 ] && [ "$PROGRESS_DONE" -ne "$PROGRESS_TOTAL" ]; then - PROGRESS_TOTAL=$PROGRESS_DONE - _mon_state_save + # Phase progress snapshot — keep GLOBAL total (do not snap N to phase-local done). + # Snapping here made mid-run bars like 34/34 then 38/47. Whole-run snap: progress_finish. + if [ "${PROGRESS_OFF:-0}" != "1" ] && [ "${PROGRESS_DONE:-0}" -gt 0 ]; then + if [ "${PROGRESS_FINAL:-0}" = "1" ]; then + # last phase / explicit final: done/total exact + if [ "$PROGRESS_TOTAL" -gt 0 ] && [ "$PROGRESS_DONE" -ne "$PROGRESS_TOTAL" ]; then + PROGRESS_TOTAL=$PROGRESS_DONE + _mon_state_save + fi fi + _progress_rebalance _progress_bar_line "$PROGRESS_DONE" "$PROGRESS_TOTAL" fi if [ "$GLOBAL_N" -gt 0 ]; then - printf -- '%s %s #001…#%03d%s\n' "$D" "$(i18n_text 'numbered checks this run:')" "$GLOBAL_N" "$N" + # Always show global position: current # / expected total (if known) + if [ "${PROGRESS_TOTAL:-0}" -gt 0 ]; then + printf -- '%s %s #001…#%03d · %d/%d %s%s\n' \ + "$D" "$(i18n_text 'numbered checks:')" "$GLOBAL_N" \ + "$PROGRESS_DONE" "$PROGRESS_TOTAL" \ + "$(i18n_text '(global done/total)')" "$N" + else + printf -- '%s %s #001…#%03d%s\n' "$D" "$(i18n_text 'numbered checks this run:')" "$GLOBAL_N" "$N" + fi fi if [ "$blk_n" -gt 0 ]; then if [ "${BOX:-0}" = "1" ]; then diff --git a/taler-monitoring.sh b/taler-monitoring.sh index 679049d..5db2872 100755 --- a/taler-monitoring.sh +++ b/taler-monitoring.sh @@ -395,28 +395,34 @@ if [ "${#PHASES[@]}" -eq 0 ]; then PHASES=(urls) fi -# Rough expected check counts for progress % (override: PROGRESS_TOTAL=N). -# Prefer slightly high — lib.sh rebalances if still short (never shows done>total). +# Global expected check count for progress bar done/total (override: PROGRESS_TOTAL=N). +# One estimate for the whole run — phase summary() must NOT reset this mid-run. +# Prefer slightly high; lib.sh only grows if short (never shrinks until progress_finish). if [ "${PROGRESS_TOTAL:-0}" = "0" ] || [ -z "${PROGRESS_TOTAL:-}" ]; then _pt=0 for p in "${PHASES[@]}"; do case "$p" in urls) _pt=$((_pt + 95)) ;; # +qr + webui SPA fingerprints inside) _pt=$((_pt + 30)) ;; - versions) _pt=$((_pt + 25)) ;; + versions) _pt=$((_pt + 35)) ;; # + disk probes can be many sanity) _pt=$((_pt + 35)) ;; server) _pt=$((_pt + 20)) ;; # e2e: ATM ladder emits many INFO lines (coins before/after each note) e2e) _pt=$((_pt + 240)) ;; ladder|goa-ladder) _pt=$((_pt + 120)) ;; auth401) _pt=$((_pt + 70)) ;; - aptdeploy) _pt=$((_pt + 20)) ;; - surface|ecosystem) _pt=$((_pt + 80)) ;; - monpages|pages) _pt=$((_pt + 30)) ;; + aptdeploy) _pt=$((_pt + 40)) ;; + surface|ecosystem) _pt=$((_pt + 120)) ;; + monpages|pages) _pt=$((_pt + 20)) ;; mattermost) _pt=$((_pt + 25)) ;; mail) _pt=$((_pt + 40)) ;; + devtesting|franken|fake-franken|fake_franken) _pt=$((_pt + 12)) ;; esac done + # monpages post-check after htmlify can add another inventory pass + case " ${PHASES[*]} " in + *" monpages "*|*" pages "*) _pt=$((_pt + 12)) ;; + esac set_progress_total "$_pt" unset _pt fi @@ -503,7 +509,8 @@ if [ "${RUN_TIMEOUT:-0}" -eq 0 ]; then else printf ' run_timeout %ss wall clock (RUN_TIMEOUT=; 0=unlimited)\n' "$RUN_TIMEOUT" fi -printf ' progress total≈%s (set PROGRESS_TOTAL= to override; PROGRESS_OFF=1 to hide)\n' "${PROGRESS_TOTAL:-0}" +printf ' progress %s/%s (global done/total · set PROGRESS_TOTAL= to override; PROGRESS_OFF=1 to hide)\n' \ + "${PROGRESS_DONE:-0}" "${PROGRESS_TOTAL:-0}" unset _INSIDE_ACCESS_HINT chmod +x "$ROOT"/check_*.sh 2>/dev/null || true @@ -573,4 +580,10 @@ if [ "$RUN_TIMED_OUT" = "1" ]; then "$RUN_TIMEOUT" "$elapsed" fi +# Snap progress bar to real global count (done/total) once for the whole run +if type progress_finish >/dev/null 2>&1; then + printf '\n' + progress_finish +fi + exit "$ec"