From 1182aeea008d177b51a09c311f4fe845780198fa Mon Sep 17 00:00:00 2001 From: alireza78a Date: Wed, 11 Mar 2026 21:51:25 +0330 Subject: [PATCH 1/2] fix(patch): use regex to detect line-number prefix to avoid corrupting pipe chars --- tools/patch_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/patch_parser.py b/tools/patch_parser.py index 716036f3..bef196e5 100644 --- a/tools/patch_parser.py +++ b/tools/patch_parser.py @@ -359,7 +359,7 @@ def _apply_update(op: PatchOperation, file_ops: Any) -> Tuple[bool, str]: # Parse content (remove line numbers) current_lines = [] for line in read_result.content.split('\n'): - if '|' in line: + if re.match(r'^\s*\d+\|', line): # Line format: " 123|content" parts = line.split('|', 1) if len(parts) == 2: From 96c250e53844599d73952a5a1c9a8958bd582f15 Mon Sep 17 00:00:00 2001 From: teknium1 Date: Sat, 14 Mar 2026 03:54:46 -0700 Subject: [PATCH 2/2] test: cover pipe characters in v4a patch apply Add a regression test for apply_v4a_operations when read content contains a literal pipe character outside a line-number prefix. --- tests/tools/test_patch_parser.py | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/tools/test_patch_parser.py b/tests/tools/test_patch_parser.py index 752c7340..77baab8d 100644 --- a/tests/tools/test_patch_parser.py +++ b/tests/tools/test_patch_parser.py @@ -1,7 +1,10 @@ """Tests for the V4A patch format parser.""" +from types import SimpleNamespace + from tools.patch_parser import ( OperationType, + apply_v4a_operations, parse_v4a_patch, ) @@ -137,3 +140,48 @@ class TestParseInvalidPatch: assert ops[0].operation == OperationType.ADD assert ops[1].operation == OperationType.DELETE assert ops[2].operation == OperationType.UPDATE + + +class TestApplyUpdate: + def test_preserves_non_prefix_pipe_characters_in_unmodified_lines(self): + patch = """\ +*** Begin Patch +*** Update File: sample.py +@@ result @@ + result = 1 +- return result ++ return result + 1 +*** End Patch""" + operations, err = parse_v4a_patch(patch) + assert err is None + + class FakeFileOps: + def __init__(self): + self.written = None + + def read_file(self, path, offset=1, limit=500): + return SimpleNamespace( + content=( + 'def run():\n' + ' cmd = "echo a | sed s/a/b/"\n' + ' result = 1\n' + ' return result' + ), + error=None, + ) + + def write_file(self, path, content): + self.written = content + return SimpleNamespace(error=None) + + file_ops = FakeFileOps() + + result = apply_v4a_operations(operations, file_ops) + + assert result.success is True + assert file_ops.written == ( + 'def run():\n' + ' cmd = "echo a | sed s/a/b/"\n' + ' result = 1\n' + ' return result + 1' + )