From 92189b2df42e3eb9ba651b7f9d989ab556f49396 Mon Sep 17 00:00:00 2001 From: Robin Stocker Date: Fri, 10 May 2013 18:16:36 +0200 Subject: [PATCH] Fix DiffFormatter NPEs for DiffEntry without content change DiffEntry.getOldId() returns null for a diff without an index line (e.g. only mode changed, rename without content change). Bug: 407743 Change-Id: I42eac87421f2a53c985af260a253338f578492bc --- .../eclipse/jgit/diff/DiffFormatterTest.java | 31 ++++++++++++++++++- .../org/eclipse/jgit/diff/DiffFormatter.java | 7 ++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffFormatterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffFormatterTest.java index 820c0c6d7..00e5f0674 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffFormatterTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/DiffFormatterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010, Google Inc. + * Copyright (C) 2010, 2013 Google Inc. * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -256,6 +256,35 @@ public class DiffFormatterTest extends RepositoryTestCase { assertEquals(0, hh.toEditList().size()); } + @Test + public void testCreateFileHeaderWithoutIndexLine() throws Exception { + DiffEntry m = DiffEntry.modify(PATH_A); + m.oldMode = FileMode.REGULAR_FILE; + m.newMode = FileMode.EXECUTABLE_FILE; + + FileHeader fh = df.toFileHeader(m); + String expected = DIFF + "a/src/a b/src/a\n" + // + "old mode 100644\n" + // + "new mode 100755\n"; + assertEquals(expected, fh.getScriptText()); + } + + @Test + public void testCreateFileHeaderForRenameWithoutContentChange() throws Exception { + DiffEntry a = DiffEntry.delete(PATH_A, ObjectId.zeroId()); + DiffEntry b = DiffEntry.add(PATH_B, ObjectId.zeroId()); + DiffEntry m = DiffEntry.pair(ChangeType.RENAME, a, b, 100); + m.oldId = null; + m.newId = null; + + FileHeader fh = df.toFileHeader(m); + String expected = DIFF + "a/src/a b/src/b\n" + // + "similarity index 100%\n" + // + "rename from src/a\n" + // + "rename to src/b\n"; + assertEquals(expected, fh.getScriptText()); + } + @Test public void testDiff() throws Exception { write(new File(db.getDirectory().getParent(), "test.txt"), "test"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java index 11848e2c9..f660d6bbd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java @@ -912,6 +912,11 @@ public class DiffFormatter { editList = new EditList(); type = PatchType.UNIFIED; + } else if (ent.getOldId() == null || ent.getNewId() == null) { + // Content not changed (e.g. only mode, pure rename) + editList = new EditList(); + type = PatchType.UNIFIED; + } else { assertHaveRepository(); @@ -1106,7 +1111,7 @@ public class DiffFormatter { o.write('\n'); } - if (!ent.getOldId().equals(ent.getNewId())) { + if (ent.getOldId() != null && !ent.getOldId().equals(ent.getNewId())) { formatIndexLine(o, ent); } }