diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2016-07-23 16:38:59 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2016-07-23 16:45:40 +0200 |
commit | 4006c4347788a078051dffd6b197bb0f19d50b86 (patch) | |
tree | f3891d8874ac9e20f0800c4d5f995579d2a8ccb4 /git | |
parent | 1ec4389bc3d1653af301e93fe0a6b25a31da9f3d (diff) | |
download | gitpython-4006c4347788a078051dffd6b197bb0f19d50b86.tar.gz |
fix(diff): use explicit change-type if possible
That way, we do not have to figure the change type out by
examining the diff object.
It's implemented in a way that should yield more desireable results
as we keep the change-type that git is providing us with.
Fixes #493
Diffstat (limited to 'git')
-rw-r--r-- | git/diff.py | 14 | ||||
-rw-r--r-- | git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color | 1 | ||||
-rw-r--r-- | git/test/test_diff.py | 9 |
3 files changed, 19 insertions, 5 deletions
diff --git a/git/diff.py b/git/diff.py index 06193920..fb8faaf6 100644 --- a/git/diff.py +++ b/git/diff.py @@ -183,7 +183,9 @@ class DiffIndex(list): raise ValueError("Invalid change type: %s" % change_type) for diff in self: - if change_type == "A" and diff.new_file: + if diff.change_type == change_type: + yield diff + elif change_type == "A" and diff.new_file: yield diff elif change_type == "D" and diff.deleted_file: yield diff @@ -247,11 +249,12 @@ class Diff(object): NULL_BIN_SHA = b"\0" * 20 __slots__ = ("a_blob", "b_blob", "a_mode", "b_mode", "a_rawpath", "b_rawpath", - "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", "diff") + "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", + "diff", "change_type") def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode, b_mode, new_file, deleted_file, raw_rename_from, - raw_rename_to, diff): + raw_rename_to, diff, change_type): self.a_mode = a_mode self.b_mode = b_mode @@ -286,6 +289,7 @@ class Diff(object): self.raw_rename_to = raw_rename_to or None self.diff = diff + self.change_type = change_type def __eq__(self, other): for name in self.__slots__: @@ -435,7 +439,7 @@ class Diff(object): new_file, deleted_file, rename_from, rename_to, - None)) + None, None)) previous_header = header # end for each header we parse @@ -483,7 +487,7 @@ class Diff(object): # END add/remove handling diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode, - new_file, deleted_file, rename_from, rename_to, '') + new_file, deleted_file, rename_from, rename_to, '', change_type) index.append(diff) # END for each line diff --git a/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color new file mode 100644 index 00000000..dad85c68 --- /dev/null +++ b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color @@ -0,0 +1 @@ +:100644 100644 739bc65220ad90e9ebfa2d6af1723b97555569a4 0000000000000000000000000000000000000000 M README.md diff --git a/git/test/test_diff.py b/git/test/test_diff.py index ba0d2d13..9fdb26a2 100644 --- a/git/test/test_diff.py +++ b/git/test/test_diff.py @@ -104,6 +104,15 @@ class TestDiff(TestBase): assert diff.rename_to == 'that' assert len(list(diffs.iter_change_type('R'))) == 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.stdout) + + assert len(diffs) == 1, 'one modification' + assert len(list(diffs.iter_change_type('M'))) == 1, 'one modification' + assert diffs[0].change_type == 'M' + assert diffs[0].b_blob is None + def test_binary_diff(self): for method, file_name in ((Diff._index_from_patch_format, 'diff_patch_binary'), (Diff._index_from_raw_format, 'diff_raw_binary')): |