From 456c67eea44479a34431fe5eb80cff9637352efc Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:10:29 +0100 Subject: [PATCH] spinner --- ct/alpine-gitea.sh | 1 - misc/build.func | 55 ++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/ct/alpine-gitea.sh b/ct/alpine-gitea.sh index 3cadb49..1b31e27 100644 --- a/ct/alpine-gitea.sh +++ b/ct/alpine-gitea.sh @@ -21,7 +21,6 @@ catch_errors function update_script() { header_info - msg_info "Updating Alpine Packages" apk update apk upgrade diff --git a/misc/build.func b/misc/build.func index 8cf4a61..47eec0e 100644 --- a/misc/build.func +++ b/misc/build.func @@ -86,15 +86,21 @@ error_handler() { } # This function displays an informational message with logging support. +declare -A MSG_INFO_SHOWN +SPINNER_ACTIVE=0 +SPINNER_PID="" + +trap 'stop_spinner' EXIT INT TERM HUP + start_spinner() { local msg="$1" - local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏') + local frames=(⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏) local spin_i=0 local interval=0.1 { - while [ "${SPINNER_ACTIVE:-0}" -eq 1 ]; do - printf "\r\e[2K${frames[spin_i]} ${YW}%b${CL}" "$msg" >&2 + while [[ "$SPINNER_ACTIVE" -eq 1 ]]; do + printf "\r\e[2K%s %b" "${frames[spin_i]}" "${YW}${msg}${CL}" >&2 spin_i=$(((spin_i + 1) % ${#frames[@]})) sleep "$interval" done @@ -105,33 +111,33 @@ start_spinner() { } stop_spinner() { - if [ -n "${SPINNER_PID:-}" ]; then - if ps -p "$SPINNER_PID" >/dev/null 2>&1; then - kill "$SPINNER_PID" >/dev/null 2>&1 - sleep 0.1 - if ps -p "$SPINNER_PID" >/dev/null 2>&1; then - kill -9 "$SPINNER_PID" >/dev/null 2>&1 - fi - fi + if [[ -n "$SPINNER_PID" ]] && kill -0 "$SPINNER_PID" 2>/dev/null; then + kill "$SPINNER_PID" 2>/dev/null + sleep 0.1 + kill -0 "$SPINNER_PID" 2>/dev/null && kill -9 "$SPINNER_PID" 2>/dev/null wait "$SPINNER_PID" 2>/dev/null || true - unset SPINNER_PID fi SPINNER_ACTIVE=0 + unset SPINNER_PID } -MSG_INFO_SHOWN_LIST="" +spinner_guard() { + if [[ "$SPINNER_ACTIVE" -eq 1 ]] && [[ -n "$SPINNER_PID" ]]; then + kill "$SPINNER_PID" 2>/dev/null + wait "$SPINNER_PID" 2>/dev/null || true + SPINNER_ACTIVE=0 + unset SPINNER_PID + fi +} msg_info() { local msg="$1" - if echo "$MSG_INFO_SHOWN_LIST" | grep -Fqx "$msg"; then - return - fi - MSG_INFO_SHOWN_LIST="${MSG_INFO_SHOWN_LIST}${msg}"$'\n' + [[ -n "${MSG_INFO_SHOWN["$msg"]+x}" ]] && return + MSG_INFO_SHOWN["$msg"]=1 - if [ "${SPINNER_ACTIVE:-0}" -eq 1 ]; then - return - fi + [[ "$SPINNER_ACTIVE" -eq 1 ]] && return + spinner_guard SPINNER_ACTIVE=1 start_spinner "$msg" } @@ -139,17 +145,14 @@ msg_info() { msg_ok() { local msg="$1" stop_spinner - printf "\e[?25h\r\e[2K${CM}${GN}%b${CL}\n" "$msg" >&2 - unset SPINNER_PID - SPINNER_ACTIVE=0 - - MSG_INFO_SHOWN_LIST=$(echo "$MSG_INFO_SHOWN_LIST" | grep -Fvx "$msg") + printf "\e[?25h\r\e[2K%s %b\n" "${CM}" "${GN}${msg}${CL}" >&2 + unset MSG_INFO_SHOWN["$msg"] } msg_error() { stop_spinner local msg="$1" - printf "\r\e[2K${CROSS}${RD}%b${CL}\n" "$msg" >&2 + printf "\r\e[2K%s %b\n" "${CROSS}" "${RD}${msg}${CL}" >&2 log_message "ERROR" "$msg" }