mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-17 11:07:11 +08:00
fix(edit): preserve file indentation when oldText is unindented
The fuzzy fallback anchored every line with a leading [ \t]* that greedily consumed the file's indentation into the matched region, so a no-indent oldText dropped the edited line's indentation. Fold leading whitespace into the match only when oldText was itself indented on the first line, mirroring exact-substring semantics. Add a regression test.
This commit is contained in:
@@ -80,6 +80,24 @@ class TestEditFuzzyPreservesWhitespace(unittest.TestCase):
|
||||
"def foo():\n x = 9\n y = 8\n return x + y\n",
|
||||
)
|
||||
|
||||
def test_fuzzy_match_with_unindented_oldtext_preserves_file_indent(self):
|
||||
# oldText has NO leading indentation (and loose spacing around '='), so
|
||||
# the exact match fails and the fuzzy path runs against an indented file
|
||||
# line. The file's indentation must be preserved -- kept OUTSIDE the
|
||||
# replaced region -- instead of being swallowed into the match and
|
||||
# dropped (which would break the file's indentation). newText is
|
||||
# likewise unindented, mirroring exact-substring replacement.
|
||||
result = self.tool.execute({
|
||||
"path": self.path,
|
||||
"oldText": "x = 1",
|
||||
"newText": "x = 100",
|
||||
})
|
||||
self.assertEqual(result.status, "success", result.result)
|
||||
self.assertEqual(
|
||||
self._read(),
|
||||
"def foo():\n x = 100\n y = 2\n return x + y\n",
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user