summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Matouillot <a.matouillot@gmail.com>2018-05-15 19:09:21 +0200
committerSebastian Thiel <byronimo@gmail.com>2018-05-19 09:36:38 +0200
commit29aa1b83edf3254f8031cc58188d2da5a83aaf75 (patch)
treedb1d6d04d556e96eaa813de8dd18a82f9462588e
parentc8fd91020739a0d57f1df562a57bf3e50c04c05b (diff)
downloadgitpython-29aa1b83edf3254f8031cc58188d2da5a83aaf75.tar.gz
Add change in type support
-rw-r--r--git/diff.py12
-rw-r--r--git/test/fixtures/diff_change_in_type10
-rw-r--r--git/test/fixtures/diff_change_in_type_raw1
-rw-r--r--git/test/test_diff.py27
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)