4 files changed
@@ -2,6 +2,12 @@ | |||
| 2 | 2 | Changelog | |
| 3 | 3 | ========= | |
| 4 | 4 | ||
| 5 | + 2.0.8 - Bugfixes | ||
| 6 | + ================ | ||
| 7 | + | ||
| 8 | + * `DiffIndex.iter_change_type(...)` produces better results when diffing | ||
| 9 | + an index against the working tree. | ||
| 10 | + | ||
| 5 | 11 | 2.0.7 - New Features | |
| 6 | 12 | ==================== | |
| 7 | 13 | ||
@@ -183,7 +183,9 @@ def iter_change_type(self, change_type): | |||
| 183 | 183 | raise ValueError("Invalid change type: %s" % change_type) | |
| 184 | 184 | ||
| 185 | 185 | for diff in self: | |
| 186 | - if change_type == "A" and diff.new_file: | ||
| 186 | + if diff.change_type == change_type: | ||
| 187 | + yield diff | ||
| 188 | + elif change_type == "A" and diff.new_file: | ||
| 187 | 189 | yield diff | |
| 188 | 190 | elif change_type == "D" and diff.deleted_file: | |
| 189 | 191 | yield diff | |
@@ -247,11 +249,12 @@ class Diff(object): | |||
| 247 | 249 | NULL_BIN_SHA = b"\0" * 20 | |
| 248 | 250 | ||
| 249 | 251 | __slots__ = ("a_blob", "b_blob", "a_mode", "b_mode", "a_rawpath", "b_rawpath", | |
| 250 | - "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", "diff") | ||
| 252 | + "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", | ||
| 253 | + "diff", "change_type") | ||
| 251 | 254 | ||
| 252 | 255 | def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode, | |
| 253 | 256 | b_mode, new_file, deleted_file, raw_rename_from, | |
| 254 | - raw_rename_to, diff): | ||
| 257 | + raw_rename_to, diff, change_type): | ||
| 255 | 258 | ||
| 256 | 259 | self.a_mode = a_mode | |
| 257 | 260 | self.b_mode = b_mode | |
@@ -286,6 +289,7 @@ def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode, | |||
| 286 | 289 | self.raw_rename_to = raw_rename_to or None | |
| 287 | 290 | ||
| 288 | 291 | self.diff = diff | |
| 292 | + self.change_type = change_type | ||
| 289 | 293 | ||
| 290 | 294 | def __eq__(self, other): | |
| 291 | 295 | for name in self.__slots__: | |
@@ -435,7 +439,7 @@ def _index_from_patch_format(cls, repo, stream): | |||
| 435 | 439 | new_file, deleted_file, | |
| 436 | 440 | rename_from, | |
| 437 | 441 | rename_to, | |
| 438 | - None)) | ||
| 442 | + None, None)) | ||
| 439 | 443 | ||
| 440 | 444 | previous_header = header | |
| 441 | 445 | # end for each header we parse | |
@@ -483,7 +487,7 @@ def _index_from_raw_format(cls, repo, stream): | |||
| 483 | 487 | # END add/remove handling | |
| 484 | 488 | ||
| 485 | 489 | diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode, | |
| 486 | - new_file, deleted_file, rename_from, rename_to, '') | ||
| 490 | + new_file, deleted_file, rename_from, rename_to, '', change_type) | ||
| 487 | 491 | index.append(diff) | |
| 488 | 492 | # END for each line | |
| 489 | 493 | ||
@@ -0,0 +1 @@ | |||
| 1 | + :100644 100644 739bc65220ad90e9ebfa2d6af1723b97555569a4 0000000000000000000000000000000000000000 M README.md | ||
@@ -104,6 +104,15 @@ def test_diff_with_rename(self): | |||
| 104 | 104 | assert diff.rename_to == 'that' | |
| 105 | 105 | assert len(list(diffs.iter_change_type('R'))) == 1 | |
| 106 | 106 | ||
| 107 | + def test_diff_of_modified_files_not_added_to_the_index(self): | ||
| 108 | + output = StringProcessAdapter(fixture('diff_abbrev-40_full-index_M_raw_no-color')) | ||
| 109 | + diffs = Diff._index_from_raw_format(self.rorepo, output.stdout) | ||
| 110 | + | ||
| 111 | + assert len(diffs) == 1, 'one modification' | ||
| 112 | + assert len(list(diffs.iter_change_type('M'))) == 1, 'one modification' | ||
| 113 | + assert diffs[0].change_type == 'M' | ||
| 114 | + assert diffs[0].b_blob is None | ||
| 115 | + | ||
| 107 | 116 | def test_binary_diff(self): | |
| 108 | 117 | for method, file_name in ((Diff._index_from_patch_format, 'diff_patch_binary'), | |
| 109 | 118 | (Diff._index_from_raw_format, 'diff_raw_binary')): | |
0 commit comments