Skip to content

Commit db392ae

Browse files
committed
Fix bug where colons in paths raise a ValueError on diff() calls.
This commit introduces a potential fix for #1490 and #1483, in which an `invalid literal for int() with base 10: 'n'` exception was raised within a diff operation. Within `_handle_diff_line()`, we split the output of `git diff-tree` on colons (`:` characters), under the assumption that there are no colons within the paths of the files being diffed. On POSIX systems this is not a valid assumption. The fix is to split on `\x00:`, since a null character always precedes the colons we actually need to split on. A test already existed for this case (`test_diff_file_with_colon()`), but it was marked as skipped. * Split on `\x00:` instead of `:` in `_handle_diff_line()`. * Unskip `test_diff_file_with_colon()`.
1 parent bec6157 commit db392ae

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

‎git/diff.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,10 @@ def _index_from_patch_format(cls, repo: "Repo", proc: Union["Popen", "Git.AutoIn
570570
def _handle_diff_line(lines_bytes: bytes, repo: "Repo", index: DiffIndex) -> None:
571571
lines = lines_bytes.decode(defenc)
572572

573-
for line in lines.split(":")[1:]:
573+
# Discard everything before the first colon, and the colon itself.
574+
_, _, lines = lines.partition(":")
575+
576+
for line in lines.split("\x00:"):
574577
meta, _, path = line.partition("\x00")
575578
path = path.rstrip("\x00")
576579
a_blob_id: Optional[str]

‎test/test_diff.py

-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ def test_diff_index_raw_format(self):
236236
res[0].b_path,
237237
)
238238

239-
@unittest.skip("This currently fails and would need someone to improve diff parsing")
240239
def test_diff_file_with_colon(self):
241240
output = fixture("diff_file_with_colon")
242241
res = []

0 commit comments

Comments
 (0)