Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion scripts/ci/pr_review_merge_scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1356,7 +1356,8 @@ def dismiss_stale_opencode_change_requests(repo: str, pr: dict[str, Any], *, dry
f"expected {expected_head}, observed {live_head or '<missing>'}"
)

for review_id in review_ids:
def dismiss_one(review_id: str) -> None:
"""Dismiss a single stale review."""
message = (
"Superseded automated OpenCode change request from a previous head; "
f"exact current head {expected_head} has a later OpenCode approval."
Expand All @@ -1372,6 +1373,14 @@ def dismiss_stale_opencode_change_requests(repo: str, pr: dict[str, Any], *, dry
f"message={message}",
]
)

if len(review_ids) <= 1:
for review_id in review_ids:
dismiss_one(review_id)
else:
max_workers = min(REST_MERGEABLE_STATE_WORKERS, len(review_ids))
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
list(executor.map(dismiss_one, review_ids))
return len(review_ids)


Expand Down
13 changes: 10 additions & 3 deletions tests/test_pr_review_merge_scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2604,9 +2604,16 @@ def test_dismiss_stale_opencode_change_requests_is_current_head_guarded(monkeypa
monkeypatch.setenv("GH_TOKEN", "workflow-token")
assert sched.dismiss_stale_opencode_change_requests("owner/repo", pr, dry_run=False) == 2
assert calls[0] == ["gh", "api", "repos/owner/repo/pulls/1", "--jq", ".head.sha"]
assert calls[1][:5] == ["gh", "api", "-X", "PUT", "repos/owner/repo/pulls/1/reviews/201/dismissals"]
assert calls[2][:5] == ["gh", "api", "-X", "PUT", "repos/owner/repo/pulls/1/reviews/202/dismissals"]
assert all(call[-2] == "-f" and call[-1].startswith("message=") for call in calls[1:])
# Due to parallel execution, calls[1] and calls[2] may be in either order.
dismissal_endpoints = {calls[1][4], calls[2][4]}
assert dismissal_endpoints == {
"repos/owner/repo/pulls/1/reviews/201/dismissals",
"repos/owner/repo/pulls/1/reviews/202/dismissals"
}
for call in calls[1:]:
assert call[:4] == ["gh", "api", "-X", "PUT"]
assert call[-2] == "-f"
assert call[-1].startswith("message=")

calls.clear()
monkeypatch.setattr(sched, "run_github_read", lambda args, stdin=None: calls.append(args) or ("d" * 40))
Expand Down
Loading