From ae5a980cac5b18cfe8146b2be76c324de3d75a7e Mon Sep 17 00:00:00 2001 From: lingkai5wu Date: Sat, 10 Oct 2026 17:04:51 +0800 Subject: [PATCH] feat: add compose-style grouped progress --- manage.sh | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/manage.sh b/manage.sh index f93a789..4efef56 100755 --- a/manage.sh +++ b/manage.sh @@ -290,20 +290,26 @@ run_group() { local action="$2" local group_name="${GROUP_NAMES[group_index]}" local limit="${GROUP_LIMITS[group_index]}" - local stack pid finished_pid status result result_color success_result details - local next=0 running=0 completed=0 failed=0 + local stack pid finished_pid status result result_color marker success_result details + local next=0 running=0 completed=0 failed=0 stack_width=0 interactive=0 local success_color="" failure_color="" color_reset="" local -a stacks=() local -A pid_stacks=() - if [[ -t 1 && -z "${NO_COLOR:-}" ]]; then - success_color=$'\033[32m' - failure_color=$'\033[31m' - color_reset=$'\033[0m' + if [[ -t 1 ]]; then + interactive=1 + if [[ -z "${NO_COLOR:-}" ]]; then + success_color=$'\033[32m' + failure_color=$'\033[31m' + color_reset=$'\033[0m' + fi fi read -r -a stacks <<<"${GROUP_STACKS[group_index]}" ((${#stacks[@]} > 0)) || return 0 + for stack in "${stacks[@]}"; do + ((${#stack} > stack_width)) && stack_width="${#stack}" + done if ((limit == 0 || limit > ${#stacks[@]})); then limit="${#stacks[@]}" @@ -318,7 +324,11 @@ run_group() { fi echo - echo "==> Group $group_name: $action ($details)" + if ((interactive)); then + printf '[+] %s: %s 0/%d\n' "$group_name" "$action" "${#stacks[@]}" + else + echo "==> Group $group_name: $action ($details)" + fi case "$action" in up | start) success_result="Started" ;; @@ -348,10 +358,12 @@ run_group() { ((running -= 1)) if ((status == 0)); then + marker="✔" result="$success_result" result_color="$success_color" ((RUN_SUCCESS += 1)) else + marker="✘" result="Failed" result_color="$failure_color" ((RUN_FAILED += 1)) @@ -360,8 +372,14 @@ run_group() { fi ((completed += 1)) - printf '[%d/%d] %s: %s%s%s\n' \ - "$completed" "${#stacks[@]}" "$stack" \ + if ((interactive)); then + printf '\033[%dA\r\033[2K[+] %s: %s %d/%d\n' \ + "$completed" "$group_name" "$action" "$completed" "${#stacks[@]}" + ((completed > 1)) && printf '\033[%dB\r' "$((completed - 1))" + fi + + printf ' %s%s%s Stack %-*s %s%s%s\n' \ + "$result_color" "$marker" "$color_reset" "$stack_width" "$stack" \ "$result_color" "$result" "$color_reset" done