fix(robomp): thread commit_id/head_sha/patch through proxy backend

Follow-up fix round for 71d608aae6 (validate PR review comment
anchors against the diff before submitting). The validation path
broke in several places the original commit did not cover:

- GitHubBackend.submit_review gained no commit_id parameter, so
  submitting through GitHubProxyClient raised a production
  TypeError on a path the validation code depended on.
- PullRequestInfo lacked head_sha, so the Forgejo commit_id
  fallback raised AttributeError; it is now parsed in
  _pr_from_payload and carried through the proxy round-trip.
- _pr_file_from dropped the file patch, silently no-oping anchor
  validation for anything routed through the proxy; the patch is
  now forwarded.
- The hunk parser treated any +++/--- line as a file header,
  desyncing line counters when added/removed content began with
  those prefixes; file headers are now recognized only before
  the first hunk.
- Reworded the comment to "Forgejo only" to match the actual
  backend behavior.

Adds tests for forgejo commit_id fetch, fallback double-failure,
empty-patch fail-open, LEFT-side anchoring, proxy commit_id
validation, and file-creation hunk boundaries.
This commit is contained in:
djdembeck
2026-08-18 16:25:52 -05:00
parent 71d608aae6
commit e599d58f21
8 changed files with 419 additions and 37 deletions
+3 -1
View File
@@ -69,6 +69,7 @@ class PullRequestInfo:
head_repo: str = ""
title: str = ""
body: str = ""
head_sha: str = ""
@dataclass(slots=True, frozen=True)
@@ -592,7 +593,7 @@ class GitHubClient:
def _review_comments_payload(self, comments: list[Mapping[str, Any]]) -> list[dict[str, Any]]:
"""Adapt canonical host-tool comment shape to the wire schema for this platform.
GitHub keeps line/side/start_line/start_side; Forgejo/Gitea only reads
GitHub keeps line/side/start_line/start_side; Forgejo only reads
path/body/new_position (+old_position), so github-only keys are dropped
and `line` is mapped to `new_position` for RIGHT-side comments or
`old_position` for LEFT-side (removed-line) comments.
@@ -798,6 +799,7 @@ def _pr_from_payload(repo: str, data: Mapping[str, Any]) -> PullRequestInfo:
head_repo=str(head_repo.get("full_name") or "") if isinstance(head_repo, Mapping) else "",
title=str(data.get("title") or ""),
body=str(data.get("body") or ""),
head_sha=str(head.get("sha") or "") if isinstance(head, Mapping) else "",
)