From e6f86d3a7c8294b24e080c633cbf5a66c258cb60 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 11 Dec 2008 18:46:13 -0800 Subject: [PATCH] Set empty patches with no Git metadata to PatchType.BINARY 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 Signed-off-by: Robin Rosenberg --- .../tst/org/spearce/jgit/patch/FileHeaderTest.java | 18 ++++++++++++++++++ .../tst/org/spearce/jgit/patch/PatchTest.java | 2 ++ .../src/org/spearce/jgit/patch/FileHeader.java | 5 +++++ org.spearce.jgit/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 d8696a91..4c2140a7 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 class FileHeaderTest extends TestCase { assertEquals(-1, fh.parseGitFileName(0)); assertNotNull(fh.getHunks()); assertTrue(fh.getHunks().isEmpty()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_NoLF() { @@ -68,6 +69,7 @@ public class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { assertTrue(fh.parseGitFileName(0) > 0); assertNull(fh.getOldName()); assertNull(fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); } public void testParseGitFileName_FooSpBar() { @@ -83,6 +86,7 @@ public class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { assertEquals("a", fh.getOldName()); assertEquals("a", fh.getNewName()); + assertFalse(fh.hasMetaDataChanges()); assertNull(fh.getOldMode()); assertNull(fh.getNewMode()); @@ -330,6 +346,7 @@ public class FileHeaderTest extends TestCase { 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 class FileHeaderTest extends TestCase { 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 833bf5dd..bf37063a 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 @@ public class PatchTest extends TestCase { "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 ddf52a31..67035ab7 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 class FileHeader { 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 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 06902cb8..ec40920f 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 @@ public class Patch { // 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 @@ public class Patch { // 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; } -- 2.11.4.GIT