From e261963acd463237b79117d9066735523f7f6094 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 23 Jun 2023 07:44:46 -0700 Subject: [PATCH] fix for issue #25 --- aider/utils.py | 2 +- tests/test_utils.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/aider/utils.py b/aider/utils.py index c1053bec1..c85fa0a5b 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -67,7 +67,7 @@ def replace_part_with_missing_leading_whitespace(whole, part, replace): # If all lines in the part start with whitespace, then honor it. # But GPT often outdents the part and replace blocks completely, # thereby discarding the actual leading whitespace in the file. - if all((len(pline) > 0 and pline[0].isspace()) for pline in part_lines): + if all((not pline or pline[0].isspace()) for pline in part_lines): return for i in range(len(whole_lines) - len(part_lines) + 1): diff --git a/tests/test_utils.py b/tests/test_utils.py index b3660f622..0e57ad615 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -200,7 +200,6 @@ These changes replace the `subprocess.run` patches with `subprocess.check_output self.assertEqual(edit_blocks[0][0], "tests/test_repomap.py") self.assertEqual(edit_blocks[1][0], "tests/test_repomap.py") - def test_replace_part_with_missing_leading_whitespace(self): whole = " line1\n line2\n line3\n" part = "line1\nline2" @@ -210,5 +209,20 @@ These changes replace the `subprocess.run` patches with `subprocess.check_output result = utils.replace_part_with_missing_leading_whitespace(whole, part, replace) self.assertEqual(result, expected_output) + def test_replace_part_with_missing_leading_whitespace_including_blank_lines(self): + """ + The part has leading whitespace on all lines, so should be ignored. + But it has a *blank* line with no whitespace at all, which was causing a + bug per issue #25. Test case to repro and confirm fix. + """ + whole = " line1\n line2\n line3\n" + part = "\n line1\n line2" + replace = "new_line1\nnew_line2" + expected_output = None + + result = utils.replace_part_with_missing_leading_whitespace(whole, part, replace) + self.assertEqual(result, expected_output) + + if __name__ == "__main__": unittest.main()