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
+9 -5
View File
@@ -1760,9 +1760,15 @@ def _diff_anchorable_lines(patch: str) -> tuple[frozenset[int], frozenset[int]]:
old_line = int(m.group(1))
new_line = int(m.group(2))
continue
if raw.startswith("+++") or raw.startswith("---") or raw.startswith("\\"):
if raw.startswith("\\"):
continue
if new_line is None or old_line is None:
# `+++`/`---` are file headers only before the first hunk. Inside a
# hunk a diff line's *content* may start with `++` (added) or `--`
# (removed), and those lines must advance the counters.
in_hunk = new_line is not None and old_line is not None
if raw.startswith(("+++", "---")) and not in_hunk:
continue
if not in_hunk:
continue
if raw.startswith("+"):
right.add(new_line)
@@ -1778,9 +1784,7 @@ def _diff_anchorable_lines(patch: str) -> tuple[frozenset[int], frozenset[int]]:
return frozenset(right), frozenset(left)
def _filter_anchorable_comments(
staged: list[Any], files: list[PullRequestFileInfo]
) -> tuple[list[Any], list[Any]]:
def _filter_anchorable_comments(staged: list[Any], files: list[PullRequestFileInfo]) -> tuple[list[Any], list[Any]]:
"""Partition staged comments into (anchorable, dropped) by diff hunk membership."""
by_path = {f.path: f for f in files}
cache: dict[str, tuple[frozenset[int], frozenset[int]]] = {}