From 401d0e87a4a51c7d7e678dc5477339a8a3f8b372 Mon Sep 17 00:00:00 2001 From: Slim B Date: Fri, 13 Feb 2026 21:08:23 +0300 Subject: [PATCH] Show [migrated] marker and summary in migrate-pr Interactive picker now marks already-migrated PRs. All modes (--all, explicit numbers, interactive) track and display success/fail/skip counts at the end. Co-Authored-By: Claude Opus 4.6 --- bin/josh-sync | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/bin/josh-sync b/bin/josh-sync index c3a99a1..f3dbd3b 100755 --- a/bin/josh-sync +++ b/bin/josh-sync @@ -735,6 +735,26 @@ cmd_migrate_pr() { log "INFO" "Archived repo: ${archived_api}" + # Load already-migrated PR numbers for skip detection and display + local migrated_numbers + migrated_numbers=$(echo "$onboard_state" | jq -r '[.migrated_prs // [] | .[].old_number] | map(tostring) | .[]') + + # Counters for summary + local migrated=0 failed=0 skipped=0 + + # Helper: attempt migration of one PR with counting + _try_migrate() { + local num="$1" + if echo "$migrated_numbers" | grep -qx "$num"; then + log "INFO" "PR #${num} already migrated — skipping" + skipped=$((skipped + 1)) + elif migrate_one_pr "$num"; then + migrated=$((migrated + 1)) + else + failed=$((failed + 1)) + fi + } + if [ "$all" = true ]; then # Migrate all open PRs from archived repo local prs @@ -744,14 +764,14 @@ cmd_migrate_pr() { count=$(echo "$prs" | jq 'length') log "INFO" "Found ${count} open PR(s) on archived repo" - echo "$prs" | jq -r '.[] | .number' | while read -r num; do - migrate_one_pr "$num" || true - done + while read -r num; do + _try_migrate "$num" + done < <(echo "$prs" | jq -r '.[] | .number') elif [ ${#pr_numbers[@]} -gt 0 ]; then # Migrate specific PR numbers for num in "${pr_numbers[@]}"; do - migrate_one_pr "$num" || true + _try_migrate "$num" done else @@ -767,26 +787,33 @@ cmd_migrate_pr() { return fi + # Display PRs with [migrated] marker for already-processed ones echo "" >&2 echo "Open PRs on archived repo:" >&2 - echo "$prs" | jq -r '.[] | " #\(.number): \(.title) (\(.base.ref) <- \(.head.ref))"' >&2 + while IFS=$'\t' read -r num title base_ref head_ref; do + if echo "$migrated_numbers" | grep -qx "$num"; then + echo " #${num}: ${title} (${base_ref} <- ${head_ref}) [migrated]" >&2 + else + echo " #${num}: ${title} (${base_ref} <- ${head_ref})" >&2 + fi + done < <(echo "$prs" | jq -r '.[] | "\(.number)\t\(.title)\t\(.base.ref)\t\(.head.ref)"') echo "" >&2 echo "Enter PR numbers to migrate (space-separated), or 'all':" >&2 local selection read -r selection if [ "$selection" = "all" ]; then - echo "$prs" | jq -r '.[] | .number' | while read -r num; do - migrate_one_pr "$num" || true - done + while read -r num; do + _try_migrate "$num" + done < <(echo "$prs" | jq -r '.[] | .number') else for num in $selection; do - migrate_one_pr "$num" || true + _try_migrate "$num" done fi fi - log "INFO" "PR migration complete" + log "INFO" "Migration complete: ${migrated} migrated, ${failed} failed, ${skipped} skipped" } # ─── Main ───────────────────────────────────────────────────────────