From 90a6e1c8f793571730f1c77f2dce745813938b66 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 5 Jan 2021 20:34:42 +0800 Subject: [PATCH 1/2] Add '-z' on top of '--raw' to avoid path name mangling Authored based on https://github.com/gitpython-developers/GitPython/issues/1099#issuecomment-754606044 Fixes #1099 --- git/diff.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git/diff.py b/git/diff.py index 0fc30b9eb..17ef15af9 100644 --- a/git/diff.py +++ b/git/diff.py @@ -108,6 +108,7 @@ def diff(self, other=Index, paths=None, create_patch=False, **kwargs): args.append("-p") else: args.append("--raw") + args.append("-z") # in any way, assure we don't see colored output, # fixes https://github.com/gitpython-developers/GitPython/issues/172 @@ -483,7 +484,7 @@ def handle_diff_line(line): if not line.startswith(":"): return - meta, _, path = line[1:].partition('\t') + meta, _, path = line[1:].partition('\x00') old_mode, new_mode, a_blob_id, b_blob_id, _change_type = meta.split(None, 4) # Change type can be R100 # R: status letter From 21e2c4589934d4801c15a482a37322cb704fc55b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 5 Jan 2021 21:53:24 +0800 Subject: [PATCH 2/2] try fixing up test fixtures and implementation --- git/diff.py | 4 ++-- test/test_diff.py | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/git/diff.py b/git/diff.py index 17ef15af9..cd7cc23c4 100644 --- a/git/diff.py +++ b/git/diff.py @@ -511,11 +511,11 @@ def handle_diff_line(line): new_file = True elif change_type == 'C': copied_file = True - a_path, b_path = path.split('\t', 1) + a_path, b_path = path.split('\x00', 1) a_path = a_path.encode(defenc) b_path = b_path.encode(defenc) elif change_type == 'R': - a_path, b_path = path.split('\t', 1) + a_path, b_path = path.split('\x00', 1) a_path = a_path.encode(defenc) b_path = b_path.encode(defenc) rename_from, rename_to = a_path, b_path diff --git a/test/test_diff.py b/test/test_diff.py index 378a58de5..c6c9b67a0 100644 --- a/test/test_diff.py +++ b/test/test_diff.py @@ -26,6 +26,10 @@ import os.path as osp +def to_raw(input): + return input.replace(b'\t', b'\x00') + + @ddt.ddt class TestDiff(TestBase): @@ -112,7 +116,7 @@ def test_diff_with_rename(self): self.assertEqual(diff.raw_rename_to, b'm\xc3\xbcller') assert isinstance(str(diff), str) - output = StringProcessAdapter(fixture('diff_rename_raw')) + output = StringProcessAdapter(to_raw(fixture('diff_rename_raw'))) diffs = Diff._index_from_raw_format(self.rorepo, output) self.assertEqual(len(diffs), 1) diff = diffs[0] @@ -137,7 +141,7 @@ def test_diff_with_copied_file(self): self.assertTrue(diff.b_path, 'test2.txt') assert isinstance(str(diff), str) - output = StringProcessAdapter(fixture('diff_copied_mode_raw')) + output = StringProcessAdapter(to_raw(fixture('diff_copied_mode_raw'))) diffs = Diff._index_from_raw_format(self.rorepo, output) self.assertEqual(len(diffs), 1) diff = diffs[0] @@ -165,7 +169,7 @@ def test_diff_with_change_in_type(self): self.assertIsNotNone(diff.new_file) assert isinstance(str(diff), str) - output = StringProcessAdapter(fixture('diff_change_in_type_raw')) + output = StringProcessAdapter(to_raw(fixture('diff_change_in_type_raw'))) diffs = Diff._index_from_raw_format(self.rorepo, output) self.assertEqual(len(diffs), 1) diff = diffs[0] @@ -175,7 +179,7 @@ def test_diff_with_change_in_type(self): self.assertEqual(len(list(diffs.iter_change_type('T'))), 1) def test_diff_of_modified_files_not_added_to_the_index(self): - output = StringProcessAdapter(fixture('diff_abbrev-40_full-index_M_raw_no-color')) + output = StringProcessAdapter(to_raw(fixture('diff_abbrev-40_full-index_M_raw_no-color'))) diffs = Diff._index_from_raw_format(self.rorepo, output) self.assertEqual(len(diffs), 1, 'one modification')