8787 "${{ steps.next.outputs.workflows }}" \
8888 )
8989 EXISTING_FILES=$(echo "$EXISTING_FILES" | sort -u)
90- echo $EXISTING_FILES
90+ printf "%s\n" $EXISTING_FILES
9191
9292 # Find deleted workflows as the items in `WORKFLOWS` but not in the union of main and next.
9393 # This assumes that _all_ items in main and next are present in `WORKFLOWS`.
@@ -113,48 +113,91 @@ jobs:
113113 set -euo pipefail
114114
115115 TOTAL_AFFECTED=0
116-
117- echo ""
118- echo "=== Workflow Cleanup Summary ==="
119- echo ""
120-
121- while IFS= read -r workflow; do
116+ SUMMARY=()
117+
118+ # Read workflows into an array for indexing
119+ mapfile -t WORKFLOWS_ARRAY <<< "$DELETED_WORKFLOWS"
120+ TOTAL_WORKFLOWS=${#WORKFLOWS_ARRAY[@]}
121+
122+ # Determine max workflow name length for alignment
123+ MAX_WF_LENGTH=0
124+ for wf in "${WORKFLOWS_ARRAY[@]}"; do
125+ len=${#wf}
126+ (( len > MAX_WF_LENGTH )) && MAX_WF_LENGTH=$len
127+ done
128+ (( MAX_WF_LENGTH < 40 )) && MAX_WF_LENGTH=40 # minimum width
129+
130+ # Index column width: enough for [100/100] → 9 chars including brackets
131+ INDEX_WIDTH=9
132+
133+ printf "\n"
134+ printf "=== Workflow Cleanup Progress ===\n"
135+ printf "%*s | %-*s | %-14s | %-12s\n" "$INDEX_WIDTH" "Index" "$MAX_WF_LENGTH" "Workflow" "Workflow Count" "Global Total"
136+ printf "%*s-+-%-*s-+-%-14s-+-%-12s\n" "$INDEX_WIDTH" "---------" "$MAX_WF_LENGTH" "$(printf '%.0s-' $(seq 1 $MAX_WF_LENGTH))" "--------------" "------------"
137+
138+ for i in "${!WORKFLOWS_ARRAY[@]}"; do
139+ workflow=${WORKFLOWS_ARRAY[$i]}
122140 [ -z "$workflow" ] && continue
123-
124- WF_COUNT =0
141+ CURRENT_INDEX=$((i + 1))
142+ WORKFLOW_COUNT =0
125143
126144 while true; do
145+ # List workflow runs.
146+ #
147+ # Note that github will return 404 once all runs are deleted.
148+ # We use `|| true` to ignore this error since it is expected when all runs are deleted.
127149 RUN_IDS=$(gh run list \
128150 --workflow "$workflow" \
129151 --limit 100 \
130152 --json databaseId \
131- --jq '.[].databaseId')
153+ --jq '.[].databaseId' 2>/dev/null || true )
132154
133- if [ -z "$RUN_IDS" ]; then
134- break
135- fi
155+ [ -z "$RUN_IDS" ] && break # stop when no runs remain
136156
137157 BATCH_COUNT=$(echo "$RUN_IDS" | wc -l | tr -d ' ')
138- WF_COUNT=$((WF_COUNT + BATCH_COUNT))
158+ WORKFLOW_COUNT=$((WORKFLOW_COUNT + BATCH_COUNT))
159+ TOTAL_AFFECTED=$((TOTAL_AFFECTED + BATCH_COUNT))
160+
161+ # Print aligned progress per batch
162+ printf "%*s | %-*s | %14s | %12s\n" \
163+ "$INDEX_WIDTH" "[$CURRENT_INDEX/$TOTAL_WORKFLOWS]" \
164+ "$MAX_WF_LENGTH" "$workflow" \
165+ "$WORKFLOW_COUNT" "$TOTAL_AFFECTED"
139166
140167 if [ "$MODE" = "execute" ]; then
141168 for RUN_ID in $RUN_IDS; do
142- gh run delete "$RUN_ID" --yes >/dev/null
169+ gh run delete "$RUN_ID" >/dev/null
143170 done
144171 fi
172+
173+ # TEMPORARY BREAK for testing: stop if workflow count > 20
174+ if [ "$WORKFLOW_COUNT" -gt 20 ]; then
175+ echo "⚠️ Temporary break: workflow count exceeded 20, stopping early for safety."
176+ break
177+ fi
145178 done
146179
147- echo "$workflow → $WF_COUNT runs"
148- TOTAL_AFFECTED=$((TOTAL_AFFECTED + WF_COUNT))
180+ # Save summary
181+ SUMMARY+=("$workflow|$WORKFLOW_COUNT")
182+ done
183+
184+ # Print final aligned summary table
185+ printf "\n"
186+ printf "=== Workflow Cleanup Summary ===\n"
187+ printf "%-*s | %14s\n" "$MAX_WF_LENGTH" "Workflow" "Runs"
188+ printf "%-*s-+-%14s\n" "$MAX_WF_LENGTH" "$(printf '%.0s-' $(seq 1 $MAX_WF_LENGTH))" "--------------"
149189
150- done <<< "$DELETED_WORKFLOWS"
190+ for entry in "${SUMMARY[@]}"; do
191+ wf="${entry%%|*}"
192+ count="${entry##*|}"
193+ printf "%-*s | %14s\n" "$MAX_WF_LENGTH" "$wf" "$count"
194+ done
151195
152- echo ""
153- echo "--------------------------------------"
154- echo "Total runs affected: $TOTAL_AFFECTED"
196+ printf "%-*s-+-%14s\n" "$MAX_WF_LENGTH" "$(printf '%.0s-' $(seq 1 $MAX_WF_LENGTH))" "--------------"
197+ printf "%-*s | %14s\n" "$MAX_WF_LENGTH" "TOTAL" "$TOTAL_AFFECTED"
155198
156199 if [ "$MODE" = "dry run" ]; then
157- echo "Dry run complete. No runs were deleted."
200+ printf "Dry run complete. No runs were deleted.\n "
158201 else
159- echo "Cleanup complete."
202+ printf "Cleanup complete.\n "
160203 fi
0 commit comments