From 395d2360582e2c11c9d4418f925860b5484d7a98 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 20 Jul 2010 07:52:35 -0700 Subject: [PATCH] Fix NPE in RenameDetector If we have two adds of the same object but no deletes the detector threw an NPE because the entry that came back from the deleted map was null (no matching objects). In this case we need to put the adds all back onto the list of left over additions since they did not match a delete. Change-Id: Ie68fbe7426b4dc0cb571a08911c7adbffff755d5 Signed-off-by: Shawn O. Pearce CC: Jeffrey Schumacher" --- .../eclipse/jgit/diff/RenameDetectorTest.java | 19 +++++++++++++++++++ .../org/eclipse/jgit/diff/RenameDetector.java | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java index c32c78668..bfc51b68f 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java @@ -83,6 +83,25 @@ public class RenameDetectorTest extends RepositoryTestCase { assertRename(b, a, 100, entries.get(0)); } + public void testExactRename_DifferentObjects() throws Exception { + ObjectId foo = blob("foo"); + ObjectId bar = blob("bar"); + + DiffEntry a = DiffEntry.add(PATH_A, foo); + DiffEntry h = DiffEntry.add(PATH_H, foo); + DiffEntry q = DiffEntry.delete(PATH_Q, bar); + + rd.add(a); + rd.add(h); + rd.add(q); + + List entries = rd.compute(); + assertEquals(3, entries.size()); + assertSame(a, entries.get(0)); + assertSame(h, entries.get(1)); + assertSame(q, entries.get(2)); + } + public void testExactRename_OneRenameOneModify() throws Exception { ObjectId foo = blob("foo"); ObjectId bar = blob("bar"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java index bc2394053..cf5615a1c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java @@ -383,7 +383,7 @@ public class RenameDetector { } else { left.addAll(adds); } - } else { + } else if (o != null) { // We have many adds to many deletes: score all the adds against // all the deletes by path name, take the best matches, pair // them as renames, then call the rest copies @@ -432,6 +432,8 @@ public class RenameDetector { adds.set(addIdx, null); // Claim the destination was matched. pm.update(1); } + } else { + left.addAll(adds); } } added = left;