- Route failures through log_error/log_fatal (gum log --level error/fatal
with kitchen timestamps and colour), falling back to plain echo before
the gum bootstrap. log_fatal guards against gum's fatal level exiting 1
under errexit. record_failure uses log_error; $REPORT keeps plain
colour-free lines for the gum pager.
- Fatal level on the four aborting errors (gum install failures, gum
required, fish-shell refusal), error level on the non-fatal headlines
and invalid menu option; the "run it manually" command blocks stay as
plain echo.
- Snapshot the package database (pacman, else rpm) before the first
install step and report the net delta in the INSTALL SUMMARY. apt-only
systems report nothing, by request.
- Ask for sudo once up front and refresh the timestamp in the background
(250s, sudo -n true only) so shelly/makepkg stay un-sudo'd and the user
is never re-prompted mid-run; the loop is killed by a cleanup EXIT trap
that also removes WORK_DIR.
- Replace the numbered text menu with gum choose, wrap sub-script runs in
gum spin, and add sudo -v checkpoints before each privileged menu step.
- Add an INSTALL SUMMARY block (log/report paths, failure count).
- Move the fish-shell refusal after the gum bootstrap so it can always
use gum confirm; drop the ERR trap and hand-rolled select_options now
that errexit + gum cover those paths.
- timestamped .zshrc backups (was: .zshrc.bak overwritten every run, so
only the latest pre-run state survived)
- only remove ~/.oh-my-zsh when it actually contains oh-my-zsh.sh; warn
and leave anything else alone (was: unguarded rm -rf)
- add --needed to the pacman prerequisite install
- drop the empty ~/.fzf/shell/key-bindings.zsh placeholder (nothing
sourced it; fzf integration comes from the oh-my-zsh plugin)
- LICENSE spelling in banners (zsh.sh, installbeta.sh)
- print a 'log out and back in' notice after usermod -aG docker (both
fresh-install and already-installed branches; previously missing)
- remove the unexplained sleep 10 in the already-installed docker branch
- remove 'echo "+ sleep 10" && sleep 10' fake-command lines in failure
branches (record_failure already reports the failure)
- affinity keeps its 10s read-the-instructions delay but announces it
honestly instead of echoing a fake '+ 10 sleep' command
- set -Eeuo pipefail at the top (was only enabled after the menu, so
package installs and shelly bootstrap ran unchecked); preamble audited
for guarded vs unguarded commands ([ -t 1 ] && ... became an if, clear
is now 'clear || true')
- error_handler now reports exit status, line number and the failing
command, and the ERR trap is installed after strict mode so preamble
failures abort instead of printing a message and continuing
- exit 1 when any step was recorded as failed (was: always exit 0)
- single STAMP shared by LOG and REPORT; both created via mktemp
(predictable /tmp log names + tee -a was the same symlink class)
- local script/config fallbacks resolved via BASH_SOURCE (SCRIPT_DIR),
not the caller's CWD; falls back to remote fetch when piped
- $? captured via rc=$? inside each failure branch (idempotent under
reordering) for all record_failure call sites
- ${1:-} for the flag check, ${SHELL:-} in the fish detection,
tty-guarded fish warning prompt
- mktemp -d workspace (trap-cleaned) for the shelly AUR clone, shelly toml
downloads, docker installer and affinity script - no more predictable
/tmp/shelly_install, /tmp/shelly-standard.toml, /tmp/shelly-aur.toml
- download get.docker.sh and AffinityLinuxInstaller.py with curl -fsSL to a
file instead of piping to sh/python3 (the python pipe was missing -f, so an
HTTP 404 body was executed as Python)
- plain numbered menu fallback when gum is unavailable (Fedora has neither
shelly nor apt, so gum was never installed and 'gum choose' failed with a
misleading 'User cancelled installation.')
- $? capture via rc=$? inside the failure branch (safe under reordering)