diff options
author | Aurélien Matouillot <a.matouillot@gmail.com> | 2018-05-15 19:09:21 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2018-05-19 09:36:38 +0200 |
commit | 29aa1b83edf3254f8031cc58188d2da5a83aaf75 (patch) | |
tree | db1d6d04d556e96eaa813de8dd18a82f9462588e | |
parent | c8fd91020739a0d57f1df562a57bf3e50c04c05b (diff) | |
download | gitpython-29aa1b83edf3254f8031cc58188d2da5a83aaf75.tar.gz |
Add change in type support
-rw-r--r-- | git/diff.py | 12 | ||||
-rw-r--r-- | git/test/fixtures/diff_change_in_type | 10 | ||||
-rw-r--r-- | git/test/fixtures/diff_change_in_type_raw | 1 | ||||
-rw-r--r-- | git/test/test_diff.py | 27 |
4 files changed, 47 insertions, 3 deletions
diff --git a/git/diff.py b/git/diff.py index 9a3f6b1f..c7300127 100644 --- a/git/diff.py +++ b/git/diff.py @@ -165,8 +165,9 @@ class DiffIndex(list): # A = Added # D = Deleted # R = Renamed - # M = modified - change_type = ("A", "D", "R", "M") + # M = Modified + # T = Changed in the type + change_type = ("A", "D", "R", "M", "T") def iter_change_type(self, change_type): """ @@ -179,7 +180,9 @@ class DiffIndex(list): * 'A' for added paths * 'D' for deleted paths * 'R' for renamed paths - * 'M' for paths with modified data""" + * 'M' for paths with modified data + * 'T' for changed in the type paths + """ if change_type not in self.change_type: raise ValueError("Invalid change type: %s" % change_type) @@ -499,6 +502,9 @@ class Diff(object): a_path = a_path.encode(defenc) b_path = b_path.encode(defenc) rename_from, rename_to = a_path, b_path + elif change_type == 'T': + # Nothing to do + pass # END add/remove handling diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode, diff --git a/git/test/fixtures/diff_change_in_type b/git/test/fixtures/diff_change_in_type new file mode 100644 index 00000000..e0ca7389 --- /dev/null +++ b/git/test/fixtures/diff_change_in_type @@ -0,0 +1,10 @@ +diff --git a/this b/this +deleted file mode 100644 +index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 +diff --git a/this b/this +new file mode 120000 +index 0000000000000000000000000000000000000000..42061c01a1c70097d1e4579f29a5adf40abdec95 +--- /dev/null ++++ b/this +@@ -0,0 +1 @@ ++that diff --git a/git/test/fixtures/diff_change_in_type_raw b/git/test/fixtures/diff_change_in_type_raw new file mode 100644 index 00000000..0793e1bb --- /dev/null +++ b/git/test/fixtures/diff_change_in_type_raw @@ -0,0 +1 @@ +:100644 120000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 42061c01a1c70097d1e4579f29a5adf40abdec95 T this diff --git a/git/test/test_diff.py b/git/test/test_diff.py index ced313af..e47b9331 100644 --- a/git/test/test_diff.py +++ b/git/test/test_diff.py @@ -112,6 +112,33 @@ class TestDiff(TestBase): self.assertEqual(diff.score, 100) self.assertEqual(len(list(diffs.iter_change_type('R'))), 1) + def test_diff_with_change_in_type(self): + output = StringProcessAdapter(fixture('diff_change_in_type')) + diffs = Diff._index_from_patch_format(self.rorepo, output) + self._assert_diff_format(diffs) + assert_equal(2, len(diffs)) + + diff = diffs[0] + self.assertIsNotNone(diff.deleted_file) + assert_equal(diff.a_path, 'this') + assert_equal(diff.b_path, 'this') + assert isinstance(str(diff), str) + + diff = diffs[1] + assert_equal(diff.a_path, None) + assert_equal(diff.b_path, 'this') + self.assertIsNotNone(diff.new_file) + assert isinstance(str(diff), str) + + output = StringProcessAdapter(fixture('diff_change_in_type_raw')) + diffs = Diff._index_from_raw_format(self.rorepo, output) + self.assertEqual(len(diffs), 1) + diff = diffs[0] + self.assertEqual(diff.rename_from, None) + self.assertEqual(diff.rename_to, None) + self.assertEqual(diff.change_type, 'T') + 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')) diffs = Diff._index_from_raw_format(self.rorepo, output) |