Merge pull request #1286 from NousResearch/hermes/hermes-315847fd
fix(patch): avoid corrupting pipe chars in v4a patch apply
This commit is contained in:
commit
cac238c2a3
2 changed files with 49 additions and 1 deletions
|
|
@ -1,7 +1,10 @@
|
||||||
"""Tests for the V4A patch format parser."""
|
"""Tests for the V4A patch format parser."""
|
||||||
|
|
||||||
|
from types import SimpleNamespace
|
||||||
|
|
||||||
from tools.patch_parser import (
|
from tools.patch_parser import (
|
||||||
OperationType,
|
OperationType,
|
||||||
|
apply_v4a_operations,
|
||||||
parse_v4a_patch,
|
parse_v4a_patch,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -137,3 +140,48 @@ class TestParseInvalidPatch:
|
||||||
assert ops[0].operation == OperationType.ADD
|
assert ops[0].operation == OperationType.ADD
|
||||||
assert ops[1].operation == OperationType.DELETE
|
assert ops[1].operation == OperationType.DELETE
|
||||||
assert ops[2].operation == OperationType.UPDATE
|
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'
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -359,7 +359,7 @@ def _apply_update(op: PatchOperation, file_ops: Any) -> Tuple[bool, str]:
|
||||||
# Parse content (remove line numbers)
|
# Parse content (remove line numbers)
|
||||||
current_lines = []
|
current_lines = []
|
||||||
for line in read_result.content.split('\n'):
|
for line in read_result.content.split('\n'):
|
||||||
if '|' in line:
|
if re.match(r'^\s*\d+\|', line):
|
||||||
# Line format: " 123|content"
|
# Line format: " 123|content"
|
||||||
parts = line.split('|', 1)
|
parts = line.split('|', 1)
|
||||||
if len(parts) == 2:
|
if len(parts) == 2:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue