diff --git a/scripts/cleanup-duplicate-prs.sh b/scripts/cleanup-duplicate-prs.sh index 297c3719..fee8878f 100755 --- a/scripts/cleanup-duplicate-prs.sh +++ b/scripts/cleanup-duplicate-prs.sh @@ -168,3 +168,62 @@ else fi log "Script complete" + +# ─── Stale Branch Cleanup ───────────────────────────────── +# Clean up branches from closed (unmerged) PRs and merged PRs +log "Checking for stale branches from closed/merged PRs..." + +# Get all open PRs to avoid deleting active branches +OPEN_BRANCHES=$(curl -s -H "$AUTH" "$API/repos/$REPO/pulls?state=open&limit=100" | jq -r '.[] | .head.ref' | sort -u) + +# Get all closed PRs (last 100) +CLOSED_PRS=$(curl -s -H "$AUTH" "$API/repos/$REPO/pulls?state=closed&limit=100") + +if [ -n "$CLOSED_PRS" ] && [ "$CLOSED_PRS" != "null" ]; then + STALE_BRANCHES=$(echo "$CLOSED_PRS" | jq -r '.[] | select(.merged == false) | .head.ref' | sort -u) + MERGED_BRANCHES=$(echo "$CLOSED_PRS" | jq -r '.[] | select(.merged == true) | .head.ref' | sort -u) + + STALE_COUNT=0 + for branch in $STALE_BRANCHES; do + # Skip main/master/develop + case "$branch" in main|master|develop|HEAD) continue ;; esac + + # SAFETY CHECK: Skip if branch is still used by an open PR + if echo "$OPEN_BRANCHES" | grep -q "^$branch$"; then + log "Skipping branch '$branch' - still has an open PR" + continue + fi + + if [ "$DRY_RUN" = "true" ]; then + log "DRY RUN: Would delete stale branch '$branch' (from closed unmerged PR)" + else + curl -s -X DELETE -H "$AUTH" "$API/repos/$REPO/branches/$branch" > /dev/null 2>&1 || true + log "Deleted stale branch: $branch" + fi + STALE_COUNT=$((STALE_COUNT + 1)) + done + + MERGED_COUNT=0 + for branch in $MERGED_BRANCHES; do + case "$branch" in main|master|develop|HEAD) continue ;; esac + + if echo "$OPEN_BRANCHES" | grep -q "^$branch$"; then + log "Skipping branch '$branch' - still has an open PR" + continue + fi + + if [ "$DRY_RUN" = "true" ]; then + log "DRY RUN: Would delete merged branch '$branch'" + else + curl -s -X DELETE -H "$AUTH" "$API/repos/$REPO/branches/$branch" > /dev/null 2>&1 || true + log "Deleted merged branch: $branch" + fi + MERGED_COUNT=$((MERGED_COUNT + 1)) + done + + log "Stale branch cleanup:" + log " Closed (unmerged) branches: $STALE_COUNT" + log " Merged branches: $MERGED_COUNT" +else + log "Could not fetch closed PRs for branch cleanup" +fi