diff --git a/scripts/pr b/scripts/pr index 77a0b8fcd93..49055ceac22 100755 --- a/scripts/pr +++ b/scripts/pr @@ -20,6 +20,7 @@ Usage: scripts/pr review-init scripts/pr review-checkout-main scripts/pr review-checkout-pr + scripts/pr review-claim scripts/pr review-guard scripts/pr review-artifacts-init scripts/pr review-validate-artifacts @@ -396,6 +397,60 @@ REVIEW_MODE_SET_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ) EOF_ENV } +review_claim() { + local pr="$1" + local root + root=$(repo_root) + cd "$root" + mkdir -p .local + + local reviewer="" + local max_attempts=3 + local attempt + + for attempt in $(seq 1 "$max_attempts"); do + local user_log + user_log=".local/review-claim-user-attempt-$attempt.log" + + if reviewer=$(gh api user --jq .login 2>"$user_log"); then + printf "%s\n" "$reviewer" >"$user_log" + break + fi + + echo "Claim reviewer lookup failed (attempt $attempt/$max_attempts)." + print_relevant_log_excerpt "$user_log" + + if [ "$attempt" -lt "$max_attempts" ]; then + sleep 2 + fi + done + + if [ -z "$reviewer" ]; then + echo "Failed to resolve reviewer login after $max_attempts attempts." + return 1 + fi + + for attempt in $(seq 1 "$max_attempts"); do + local claim_log + claim_log=".local/review-claim-assignee-attempt-$attempt.log" + + if gh pr edit "$pr" --add-assignee "$reviewer" >"$claim_log" 2>&1; then + echo "review claim succeeded: @$reviewer assigned to PR #$pr" + return 0 + fi + + echo "Claim assignee update failed (attempt $attempt/$max_attempts)." + print_relevant_log_excerpt "$claim_log" + + if [ "$attempt" -lt "$max_attempts" ]; then + sleep 2 + fi + done + + echo "Failed to assign @$reviewer to PR #$pr after $max_attempts attempts." + return 1 +} + review_checkout_main() { local pr="$1" enter_worktree "$pr" false @@ -1766,6 +1821,9 @@ main() { review-checkout-pr) review_checkout_pr "$pr" ;; + review-claim) + review_claim "$pr" + ;; review-guard) review_guard "$pr" ;;