From fbc62aad0942e5eac2f9a2875aa8d1de5208dd07 Mon Sep 17 00:00:00 2001 From: Joao Machado <13315199+machadoit@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:56:05 +0000 Subject: [PATCH] Fixes #182 by parsing diffs with 'Binary files' --- .../difflib/unifieddiff/UnifiedDiffFile.java | 45 +++++++++++++++++++ .../unifieddiff/UnifiedDiffReader.java | 37 +++++++++++++-- .../unifieddiff/UnifiedDiffReaderTest.java | 41 +++++++++++++++++ .../problem_diff_issue182_add.diff | 4 ++ .../problem_diff_issue182_delete.diff | 4 ++ .../problem_diff_issue182_edit.diff | 3 ++ .../problem_diff_issue182_mode.diff | 3 ++ 7 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_add.diff create mode 100644 java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_delete.diff create mode 100644 java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_edit.diff create mode 100644 java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_mode.diff diff --git a/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffFile.java b/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffFile.java index 099f4142..3a9723c6 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffFile.java +++ b/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffFile.java @@ -33,7 +33,12 @@ public final class UnifiedDiffFile { private String toTimestamp; private String index; private String newFileMode; + private String oldMode; + private String newMode; private String deletedFileMode; + private String binaryAdded; + private String binaryDeleted; + private String binaryEdited; private Patch patch = new Patch<>(); private boolean noNewLineAtTheEndOfTheFile = false; private Integer similarityIndex; @@ -138,6 +143,46 @@ public void setDeletedFileMode(String deletedFileMode) { this.deletedFileMode = deletedFileMode; } + public String getOldMode() { + return oldMode; + } + + public void setOldMode(String oldMode) { + this.oldMode = oldMode; + } + + public String getNewMode() { + return newMode; + } + + public void setNewMode(String newMode) { + this.newMode = newMode; + } + + public String getBinaryAdded() { + return binaryAdded; + } + + public void setBinaryAdded(String binaryAdded) { + this.binaryAdded = binaryAdded; + } + + public String getBinaryDeleted() { + return binaryDeleted; + } + + public void setBinaryDeleted(String binaryDeleted) { + this.binaryDeleted = binaryDeleted; + } + + public String getBinaryEdited() { + return binaryEdited; + } + + public void setBinaryEdited(String binaryEdited) { + this.binaryEdited = binaryEdited; + } + public boolean isNoNewLineAtTheEndOfTheFile() { return noNewLineAtTheEndOfTheFile; } diff --git a/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java b/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java index 0ac22ce8..7306904c 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java +++ b/java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java @@ -55,7 +55,11 @@ public final class UnifiedDiffReader { private final UnifiedDiffLine NEW_FILE_MODE = new UnifiedDiffLine(true, "^new\\sfile\\smode\\s(\\d+)", this::processNewFileMode); private final UnifiedDiffLine DELETED_FILE_MODE = new UnifiedDiffLine(true, "^deleted\\sfile\\smode\\s(\\d+)", this::processDeletedFileMode); - + private final UnifiedDiffLine OLD_MODE = new UnifiedDiffLine(true, "^old\\smode\\s(\\d+)", this::processOldMode); + private final UnifiedDiffLine NEW_MODE = new UnifiedDiffLine(true, "^new\\smode\\s(\\d+)", this::processNewMode); + private final UnifiedDiffLine BINARY_ADDED = new UnifiedDiffLine(true, "^Binary\\sfiles\\s/dev/null\\sand\\sb/(.+)\\sdiffer", this::processBinaryAdded); + private final UnifiedDiffLine BINARY_DELETED = new UnifiedDiffLine(true, "^Binary\\sfiles\\sa/(.+)\\sand\\s/dev/null\\sdiffer", this::processBinaryDeleted); + private final UnifiedDiffLine BINARY_EDITED = new UnifiedDiffLine(true, "^Binary\\sfiles\\sa/(.+)\\sand\\sb/(.+)\\sdiffer", this::processBinaryEdited); private final UnifiedDiffLine CHUNK = new UnifiedDiffLine(false, UNIFIED_DIFF_CHUNK_REGEXP, this::processChunk); private final UnifiedDiffLine LINE_NORMAL = new UnifiedDiffLine("^\\s", this::processNormalLine); private final UnifiedDiffLine LINE_DEL = new UnifiedDiffLine("^-", this::processDelLine); @@ -99,8 +103,10 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException { if (validLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX, FROM_FILE, TO_FILE, RENAME_FROM, RENAME_TO, - NEW_FILE_MODE, DELETED_FILE_MODE, - CHUNK)) { + NEW_FILE_MODE, DELETED_FILE_MODE, + OLD_MODE, NEW_MODE, + BINARY_ADDED, BINARY_DELETED, + BINARY_EDITED, CHUNK)) { break; } else { headerTxt += line + "\n"; @@ -116,7 +122,10 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException { if (!processLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX, FROM_FILE, TO_FILE, RENAME_FROM, RENAME_TO, - NEW_FILE_MODE, DELETED_FILE_MODE)) { + NEW_FILE_MODE, DELETED_FILE_MODE, + OLD_MODE, NEW_MODE, + BINARY_ADDED , BINARY_DELETED, + BINARY_EDITED)) { throw new UnifiedDiffParserException("expected file start line not found"); } line = READER.readLine(); @@ -346,6 +355,26 @@ private void processDeletedFileMode(MatchResult match, String line) { actualFile.setDeletedFileMode(match.group(1)); } + private void processOldMode(MatchResult match, String line) { + actualFile.setOldMode(match.group(1)); + } + + private void processNewMode(MatchResult match, String line) { + actualFile.setNewMode(match.group(1)); + } + + private void processBinaryAdded(MatchResult match, String line) { + actualFile.setBinaryAdded(match.group(1)); + } + + private void processBinaryDeleted(MatchResult match, String line) { + actualFile.setBinaryDeleted(match.group(1)); + } + + private void processBinaryEdited(MatchResult match, String line) { + actualFile.setBinaryEdited(match.group(1)); + } + private String extractFileName(String _line) { Matcher matcher = TIMESTAMP_REGEXP.matcher(_line); String line = _line; diff --git a/java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java b/java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java index dcf32182..1c0552a2 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java @@ -394,4 +394,45 @@ public void testParseIssue141() throws IOException { assertThat(file1.getFromFile()).isEqualTo("a.txt"); assertThat(file1.getToFile()).isEqualTo("a1.txt"); } + + @Test + public void testParseIssue182_add() throws IOException { + UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff( + UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_add.diff")); + + UnifiedDiffFile file1 = diff.getFiles().get(0); + + assertThat(file1.getBinaryAdded()).isEqualTo("some-image.png"); + } + + @Test + public void testParseIssue182_delete() throws IOException { + UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff( + UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_delete.diff")); + + UnifiedDiffFile file1 = diff.getFiles().get(0); + + assertThat(file1.getBinaryDeleted()).isEqualTo("some-image.png"); + } + + @Test + public void testParseIssue182_edit() throws IOException { + UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff( + UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_edit.diff")); + + UnifiedDiffFile file1 = diff.getFiles().get(0); + + assertThat(file1.getBinaryEdited()).isEqualTo("some-image.png"); + } + + @Test + public void testParseIssue182_mode() throws IOException { + UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff( + UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue182_mode.diff")); + + UnifiedDiffFile file1 = diff.getFiles().get(0); + + assertThat(file1.getOldMode()).isEqualTo("100644"); + assertThat(file1.getNewMode()).isEqualTo("100755"); + } } diff --git a/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_add.diff b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_add.diff new file mode 100644 index 00000000..0c165456 --- /dev/null +++ b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_add.diff @@ -0,0 +1,4 @@ +diff --git a/some-image.png b/some-image.png +new file mode 100644 +index 0000000..bc3b5b4 +Binary files /dev/null and b/some-image.png differ \ No newline at end of file diff --git a/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_delete.diff b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_delete.diff new file mode 100644 index 00000000..6543eed7 --- /dev/null +++ b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_delete.diff @@ -0,0 +1,4 @@ +diff --git a/some-image.png b/some-image.png +deleted file mode 100644 +index 0e68078..0000000 +Binary files a/some-image.png and /dev/null differ \ No newline at end of file diff --git a/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_edit.diff b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_edit.diff new file mode 100644 index 00000000..7df4fc60 --- /dev/null +++ b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_edit.diff @@ -0,0 +1,3 @@ +diff --git a/some-image.png b/some-image.png +index bc3b5b4..0e68078 100644 +Binary files a/some-image.png and b/some-image.png differ \ No newline at end of file diff --git a/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_mode.diff b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_mode.diff new file mode 100644 index 00000000..8f0e6e7d --- /dev/null +++ b/java-diff-utils/src/test/resources/com/github/difflib/unifieddiff/problem_diff_issue182_mode.diff @@ -0,0 +1,3 @@ +diff --git a/some-image.png b/some-image.png +old mode 100644 +new mode 100755 \ No newline at end of file