If a patch has no Git specific metadata and it has no hunks then it is very likely a binary patch with a "Binary files ... differ" warning message in a different language, or the message has been mangled by an editor. We should consider such patches to be the same as a binary patch, as there is nothing here to perform an action on. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- .../tst/org/spearce/jgit/patch/FileHeaderTest.java | 18 ++++++++++++++++++ .../tst/org/spearce/jgit/patch/PatchTest.java | 2 ++ .../src/org/spearce/jgit/patch/FileHeader.java | 5 +++++ .../src/org/spearce/jgit/patch/Patch.java | 18 ++++++++++++++---- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/patch/FileHeaderTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/patch/FileHeaderTest.java index d8696a9..4c2140a 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/patch/FileHeaderTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/patch/FileHeaderTest.java @@ -48,6 +48,7 @@ public void testParseGitFileName_Empty() { assertEquals(-1, fh.parseGitFileName(0)); assertNotNull(fh.getHunks()); assertTrue(fh.getHunks().isEmpty()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_NoLF() { @@ -68,6 +69,7 @@ public void testParseGitFileName_Foo() { assertEquals(gitLine(name).length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_FailFooBar() { @@ -75,6 +77,7 @@ public void testParseGitFileName_FailFooBar() { assertTrue(fh.parseGitFileName(0) > 0); assertNull(fh.getOldName()); assertNull(fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_FooSpBar() { @@ -83,6 +86,7 @@ public void testParseGitFileName_FooSpBar() { assertEquals(gitLine(name).length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_DqFooTabBar() { @@ -92,6 +96,7 @@ public void testParseGitFileName_DqFooTabBar() { assertEquals(dqGitLine(dqName).length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_DqFooSpLfNulBar() { @@ -101,6 +106,7 @@ public void testParseGitFileName_DqFooSpLfNulBar() { assertEquals(dqGitLine(dqName).length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_SrcFooC() { @@ -109,6 +115,7 @@ public void testParseGitFileName_SrcFooC() { assertEquals(gitLine(name).length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_SrcFooCNonStandardPrefix() { @@ -118,6 +125,7 @@ public void testParseGitFileName_SrcFooCNonStandardPrefix() { assertEquals(header.length(), fh.parseGitFileName(0)); assertEquals(name, fh.getOldName()); assertSame(fh.getOldName(), fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseUnicodeName_NewFile() { @@ -135,6 +143,7 @@ public void testParseUnicodeName_NewFile() { assertSame(FileHeader.ChangeType.ADD, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertNull(fh.getOldMode()); assertSame(FileMode.REGULAR_FILE, fh.getNewMode()); @@ -159,6 +168,7 @@ public void testParseUnicodeName_DeleteFile() { assertSame(FileHeader.ChangeType.DELETE, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertSame(FileMode.REGULAR_FILE, fh.getOldMode()); assertNull(fh.getNewMode()); @@ -177,6 +187,7 @@ public void testParseModeChange() { assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertNull(fh.getOldId()); assertNull(fh.getNewId()); @@ -204,6 +215,7 @@ public void testParseRename100_NewStyle() { assertSame(FileHeader.ChangeType.RENAME, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertNull(fh.getOldId()); assertNull(fh.getNewId()); @@ -232,6 +244,7 @@ public void testParseRename100_OldStyle() { assertSame(FileHeader.ChangeType.RENAME, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertNull(fh.getOldId()); assertNull(fh.getNewId()); @@ -260,6 +273,7 @@ public void testParseCopy100() { assertSame(FileHeader.ChangeType.COPY, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertTrue(fh.hasMetaDataChanges()); assertNull(fh.getOldId()); assertNull(fh.getNewId()); @@ -282,6 +296,7 @@ public void testParseFullIndexLine_WithMode() { assertSame(FileMode.REGULAR_FILE, fh.getOldMode()); assertSame(FileMode.REGULAR_FILE, fh.getNewMode()); + assertFalse(fh.hasMetaDataChanges()); assertNotNull(fh.getOldId()); assertNotNull(fh.getNewId()); @@ -302,6 +317,7 @@ public void testParseFullIndexLine_NoMode() { assertEquals("a", fh.getOldName()); assertEquals("a", fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); assertNull(fh.getOldMode()); assertNull(fh.getNewMode()); @@ -330,6 +346,7 @@ public void testParseAbbrIndexLine_WithMode() { assertSame(FileMode.REGULAR_FILE, fh.getOldMode()); assertSame(FileMode.REGULAR_FILE, fh.getNewMode()); + assertFalse(fh.hasMetaDataChanges()); assertNotNull(fh.getOldId()); assertNotNull(fh.getNewId()); @@ -358,6 +375,7 @@ public void testParseAbbrIndexLine_NoMode() { assertNull(fh.getOldMode()); assertNull(fh.getNewMode()); + assertFalse(fh.hasMetaDataChanges()); assertNotNull(fh.getOldId()); assertNotNull(fh.getNewId()); diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/patch/PatchTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/patch/PatchTest.java index 833bf5d..bf37063 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/patch/PatchTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/patch/PatchTest.java @@ -156,12 +156,14 @@ assertTrue(fh.getNewName().startsWith( "org.spearce.egit.ui/icons/toolbar/")); assertSame(FileHeader.PatchType.BINARY, fh.getPatchType()); assertTrue(fh.getHunks().isEmpty()); + assertTrue(fh.hasMetaDataChanges()); } final FileHeader fh = p.getFiles().get(4); assertEquals("org.spearce.egit.ui/plugin.xml", fh.getNewName()); assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType()); assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType()); + assertFalse(fh.hasMetaDataChanges()); assertEquals("ee8a5a0", fh.getNewId().name()); assertEquals(1, fh.getHunks().size()); assertEquals(272, fh.getHunks().get(0).getOldStartLine()); diff --git a/org.spearce.jgit/src/org/spearce/jgit/patch/FileHeader.java b/org.spearce.jgit/src/org/spearce/jgit/patch/FileHeader.java index 4bb6b7e..bf8d23a 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/patch/FileHeader.java +++ b/org.spearce.jgit/src/org/spearce/jgit/patch/FileHeader.java @@ -250,6 +250,11 @@ public PatchType getPatchType() { return patchType; } + /** @return true if this patch modifies metadata about a file */ + public boolean hasMetaDataChanges() { + return changeType != ChangeType.MODIFY || newMode != oldMode; + } + /** @return hunks altering this file; in order of appearance in patch */ public List<HunkHeader> getHunks() { if (hunks == null) diff --git a/org.spearce.jgit/src/org/spearce/jgit/patch/Patch.java b/org.spearce.jgit/src/org/spearce/jgit/patch/Patch.java index 6e9ae77..c940a00 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/patch/Patch.java +++ b/org.spearce.jgit/src/org/spearce/jgit/patch/Patch.java @@ -245,13 +245,13 @@ private int parseHunks(final FileHeader fh, final byte[] buf, int c) { // with this position so it can be parsed again later. // if (match(buf, c, DIFF_GIT) >= 0) - return c; + break; if (match(buf, c, DIFF_CC) >= 0) - return c; + break; if (match(buf, c, OLD_NAME) >= 0) - return c; + break; if (match(buf, c, NEW_NAME) >= 0) - return c; + break; if (match(buf, c, HUNK_HDR) >= 0) { final HunkHeader h = new HunkHeader(fh, c); @@ -281,6 +281,16 @@ private int parseHunks(final FileHeader fh, final byte[] buf, int c) { // c = eol; } + + if (fh.getHunks().isEmpty() + && fh.getPatchType() == FileHeader.PatchType.UNIFIED + && !fh.hasMetaDataChanges()) { + // Hmm, an empty patch? If there is no metadata here we + // really have a binary patch that we didn't notice above. + // + fh.patchType = FileHeader.PatchType.BINARY; + } + return c; } -- 1.6.1.rc2.306.ge5d5e -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html