Answer where asked, wait on a merge, and let the driver title PRs
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 2m17s
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 2m17s
From the new loop's first live run (sandbox #255, PR #256): - A question asked on the PR is answered on the PR (an inline one quoted with its file and line, since the API can't reply in its thread), with a pointer in the item's Matrix thread; one asked in Matrix stays there. - wait_for_review: when a review needs no change, or only the operator's merge is left, the item waits on the merge instead of on an answer. - finish_milestone takes the PR's title from the driver. The e2e test's merge waits out Gitea's brief 'try again later' after a push. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
This commit is contained in:
1 parent
bf416cad09
commit
651551aab4
6 files changed
+198
-13
No files matched your search
@@ -23,7 +23,7 @@ from e2e_support import base_branch, operator_gitea, task
|
||||
|
||||
from nisse_dev.config import AgentConfig
|
||||
from nisse_dev.execution import SSHHost
|
||||
from nisse_dev.gitea import GiteaError
|
||||
from nisse_dev.gitea import GiteaClient, GiteaError
|
||||
from nisse_dev.loop.build import RunningLoop, build_loop_agent
|
||||
from nisse_dev.loop.items import ANSWER, GO_AHEAD, MERGE, WAITING, loop_of
|
||||
from nisse_dev.transport import InMemoryTransport
|
||||
@@ -93,6 +93,22 @@ def is_artifact(path: str) -> bool:
|
||||
)
|
||||
|
||||
|
||||
def merge(gitea: GiteaClient, repo: str, pr: int, wait_s: float = 60) -> None:
|
||||
"""Merge, waiting out Gitea's "Please try again later": it answers that
|
||||
while it is still checking a freshly pushed PR can merge."""
|
||||
deadline = time.monotonic() + wait_s
|
||||
while True:
|
||||
try:
|
||||
gitea._request(
|
||||
"POST", f"/repos/{repo}/pulls/{pr}/merge", json={"Do": "merge"}
|
||||
)
|
||||
return
|
||||
except GiteaError as exc:
|
||||
if "try again later" not in str(exc) or time.monotonic() > deadline:
|
||||
raise
|
||||
time.sleep(3)
|
||||
|
||||
|
||||
class Operator:
|
||||
def __init__(self, agent: RunningLoop, transport: InMemoryTransport) -> None:
|
||||
self.agent = agent
|
||||
@@ -191,9 +207,7 @@ def test_the_slice_end_to_end(
|
||||
f"/repos/{repo}/pulls/{pr}/reviews",
|
||||
json={"event": "APPROVED", "body": "looks good"},
|
||||
)
|
||||
as_operator._request(
|
||||
"POST", f"/repos/{repo}/pulls/{pr}/merge", json={"Do": "merge"}
|
||||
)
|
||||
merge(as_operator, repo, pr)
|
||||
operator.tick()
|
||||
deadline = time.monotonic() + DEADLINE_S
|
||||
nudges = 0
|
||||
|
||||
Reference in new issue
Block a user