Skip to content

Commit 54324fb

Browse files
authored
Fixes #182 by parsing diffs with 'Binary files' (#183)
1 parent 8df690f commit 54324fb

File tree

7 files changed

+133
-4
lines changed

7 files changed

+133
-4
lines changed

java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffFile.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ public final class UnifiedDiffFile {
3333
private String toTimestamp;
3434
private String index;
3535
private String newFileMode;
36+
private String oldMode;
37+
private String newMode;
3638
private String deletedFileMode;
39+
private String binaryAdded;
40+
private String binaryDeleted;
41+
private String binaryEdited;
3742
private Patch<String> patch = new Patch<>();
3843
private boolean noNewLineAtTheEndOfTheFile = false;
3944
private Integer similarityIndex;
@@ -138,6 +143,46 @@ public void setDeletedFileMode(String deletedFileMode) {
138143
this.deletedFileMode = deletedFileMode;
139144
}
140145

146+
public String getOldMode() {
147+
return oldMode;
148+
}
149+
150+
public void setOldMode(String oldMode) {
151+
this.oldMode = oldMode;
152+
}
153+
154+
public String getNewMode() {
155+
return newMode;
156+
}
157+
158+
public void setNewMode(String newMode) {
159+
this.newMode = newMode;
160+
}
161+
162+
public String getBinaryAdded() {
163+
return binaryAdded;
164+
}
165+
166+
public void setBinaryAdded(String binaryAdded) {
167+
this.binaryAdded = binaryAdded;
168+
}
169+
170+
public String getBinaryDeleted() {
171+
return binaryDeleted;
172+
}
173+
174+
public void setBinaryDeleted(String binaryDeleted) {
175+
this.binaryDeleted = binaryDeleted;
176+
}
177+
178+
public String getBinaryEdited() {
179+
return binaryEdited;
180+
}
181+
182+
public void setBinaryEdited(String binaryEdited) {
183+
this.binaryEdited = binaryEdited;
184+
}
185+
141186
public boolean isNoNewLineAtTheEndOfTheFile() {
142187
return noNewLineAtTheEndOfTheFile;
143188
}

java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ public final class UnifiedDiffReader {
5555
private final UnifiedDiffLine NEW_FILE_MODE = new UnifiedDiffLine(true, "^new\\sfile\\smode\\s(\\d+)", this::processNewFileMode);
5656

5757
private final UnifiedDiffLine DELETED_FILE_MODE = new UnifiedDiffLine(true, "^deleted\\sfile\\smode\\s(\\d+)", this::processDeletedFileMode);
58-
58+
private final UnifiedDiffLine OLD_MODE = new UnifiedDiffLine(true, "^old\\smode\\s(\\d+)", this::processOldMode);
59+
private final UnifiedDiffLine NEW_MODE = new UnifiedDiffLine(true, "^new\\smode\\s(\\d+)", this::processNewMode);
60+
private final UnifiedDiffLine BINARY_ADDED = new UnifiedDiffLine(true, "^Binary\\sfiles\\s/dev/null\\sand\\sb/(.+)\\sdiffer", this::processBinaryAdded);
61+
private final UnifiedDiffLine BINARY_DELETED = new UnifiedDiffLine(true, "^Binary\\sfiles\\sa/(.+)\\sand\\s/dev/null\\sdiffer", this::processBinaryDeleted);
62+
private final UnifiedDiffLine BINARY_EDITED = new UnifiedDiffLine(true, "^Binary\\sfiles\\sa/(.+)\\sand\\sb/(.+)\\sdiffer", this::processBinaryEdited);
5963
private final UnifiedDiffLine CHUNK = new UnifiedDiffLine(false, UNIFIED_DIFF_CHUNK_REGEXP, this::processChunk);
6064
private final UnifiedDiffLine LINE_NORMAL = new UnifiedDiffLine("^\\s", this::processNormalLine);
6165
private final UnifiedDiffLine LINE_DEL = new UnifiedDiffLine("^-", this::processDelLine);
@@ -99,8 +103,10 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException {
99103
if (validLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX,
100104
FROM_FILE, TO_FILE,
101105
RENAME_FROM, RENAME_TO,
102-
NEW_FILE_MODE, DELETED_FILE_MODE,
103-
CHUNK)) {
106+
NEW_FILE_MODE, DELETED_FILE_MODE,
107+
OLD_MODE, NEW_MODE,
108+
BINARY_ADDED, BINARY_DELETED,
109+
BINARY_EDITED, CHUNK)) {
104110
break;
105111
} else {
106112
headerTxt += line + "\n";
@@ -116,7 +122,10 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException {
116122
if (!processLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX,
117123
FROM_FILE, TO_FILE,
118124
RENAME_FROM, RENAME_TO,
119-
NEW_FILE_MODE, DELETED_FILE_MODE)) {
125+
NEW_FILE_MODE, DELETED_FILE_MODE,
126+
OLD_MODE, NEW_MODE,
127+
BINARY_ADDED , BINARY_DELETED,
128+
BINARY_EDITED)) {
120129
throw new UnifiedDiffParserException("expected file start line not found");
121130
}
122131
line = READER.readLine();
@@ -346,6 +355,26 @@ private void processDeletedFileMode(MatchResult match, String line) {
346355
actualFile.setDeletedFileMode(match.group(1));
347356
}
348357

358+
private void processOldMode(MatchResult match, String line) {
359+
actualFile.setOldMode(match.group(1));
360+
}
361+
362+
private void processNewMode(MatchResult match, String line) {
363+
actualFile.setNewMode(match.group(1));
364+
}
365+
366+
private void processBinaryAdded(MatchResult match, String line) {
367+
actualFile.setBinaryAdded(match.group(1));
368+
}
369+
370+
private void processBinaryDeleted(MatchResult match, String line) {
371+
actualFile.setBinaryDeleted(match.group(1));
372+
}
373+
374+
private void processBinaryEdited(MatchResult match, String line) {
375+
actualFile.setBinaryEdited(match.group(1));
376+
}
377+
349378
private String extractFileName(String _line) {
350379
Matcher matcher = TIMESTAMP_REGEXP.matcher(_line);
351380
String line = _line;

java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,4 +394,45 @@ public void testParseIssue141() throws IOException {
394394
assertThat(file1.getFromFile()).isEqualTo("a.txt");
395395
assertThat(file1.getToFile()).isEqualTo("a1.txt");
396396
}
397+
398+
@Test
399+
public void testParseIssue182_add() throws IOException {
400+
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
401+
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_add.diff"));
402+
403+
UnifiedDiffFile file1 = diff.getFiles().get(0);
404+
405+
assertThat(file1.getBinaryAdded()).isEqualTo("some-image.png");
406+
}
407+
408+
@Test
409+
public void testParseIssue182_delete() throws IOException {
410+
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
411+
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_delete.diff"));
412+
413+
UnifiedDiffFile file1 = diff.getFiles().get(0);
414+
415+
assertThat(file1.getBinaryDeleted()).isEqualTo("some-image.png");
416+
}
417+
418+
@Test
419+
public void testParseIssue182_edit() throws IOException {
420+
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
421+
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_edit.diff"));
422+
423+
UnifiedDiffFile file1 = diff.getFiles().get(0);
424+
425+
assertThat(file1.getBinaryEdited()).isEqualTo("some-image.png");
426+
}
427+
428+
@Test
429+
public void testParseIssue182_mode() throws IOException {
430+
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
431+
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_mode.diff"));
432+
433+
UnifiedDiffFile file1 = diff.getFiles().get(0);
434+
435+
assertThat(file1.getOldMode()).isEqualTo("100644");
436+
assertThat(file1.getNewMode()).isEqualTo("100755");
437+
}
397438
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
diff --git a/some-image.png b/some-image.png
2+
new file mode 100644
3+
index 0000000..bc3b5b4
4+
Binary files /dev/null and b/some-image.png differ
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
diff --git a/some-image.png b/some-image.png
2+
deleted file mode 100644
3+
index 0e68078..0000000
4+
Binary files a/some-image.png and /dev/null differ
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
diff --git a/some-image.png b/some-image.png
2+
index bc3b5b4..0e68078 100644
3+
Binary files a/some-image.png and b/some-image.png differ
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
diff --git a/some-image.png b/some-image.png
2+
old mode 100644
3+
new mode 100755

0 commit comments

Comments
 (0)