Observed the error when trying to force checkout from a branch that had no changes on it. When the 'keep()' method from 'DirCacheCheckout' method was called the 'DirCacheEntry e' was null and was passed like this to the 'checkoutEntry()' method where the 'getObjectId()' is being called on the 'e' object Change-Id: If3a9b9e60064459d187c7db04eb4471a72c6cecetags/v5.11.0.202102031030-m2
@@ -13,6 +13,7 @@ | |||
package org.eclipse.jgit.lib; | |||
import static java.nio.charset.StandardCharsets.UTF_8; | |||
import static org.eclipse.jgit.dircache.DirCacheCheckout.checkoutEntry; | |||
import static org.junit.Assert.assertArrayEquals; | |||
import static org.junit.Assert.assertEquals; | |||
import static org.junit.Assert.assertFalse; | |||
@@ -47,6 +48,7 @@ import org.eclipse.jgit.errors.CorruptObjectException; | |||
import org.eclipse.jgit.errors.NoWorkTreeException; | |||
import org.eclipse.jgit.events.ChangeRecorder; | |||
import org.eclipse.jgit.events.ListenerHandle; | |||
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; | |||
import org.eclipse.jgit.junit.RepositoryTestCase; | |||
import org.eclipse.jgit.junit.TestRepository; | |||
import org.eclipse.jgit.junit.TestRepository.BranchBuilder; | |||
@@ -2146,4 +2148,11 @@ public class DirCacheCheckoutTest extends RepositoryTestCase { | |||
assertEquals("WorkDir has not the right size.", i.size(), nrFiles); | |||
} | |||
} | |||
@Test | |||
public void shouldReturnAndNotThrowNPEWhenCheckoutEntryIsCalledWithNullEntry() throws Exception{ | |||
checkoutEntry(new InMemoryRepository(null), null, null, true, new CheckoutMetadata(null, null)); | |||
} | |||
} |
@@ -1214,9 +1214,10 @@ public class DirCacheCheckout { | |||
private void keep(String path, DirCacheEntry e, WorkingTreeIterator f) | |||
throws IOException { | |||
if (e != null && !FileMode.TREE.equals(e.getFileMode())) | |||
if (e != null && !FileMode.TREE.equals(e.getFileMode())) { | |||
builder.add(e); | |||
if (force) { | |||
} | |||
if (e != null && force) { | |||
if (f == null || f.isModified(e, true, walk.getObjectReader())) { | |||
kept.add(path); | |||
checkoutEntry(repo, e, walk.getObjectReader(), false, | |||
@@ -1447,6 +1448,9 @@ public class DirCacheCheckout { | |||
public static void checkoutEntry(Repository repo, DirCacheEntry entry, | |||
ObjectReader or, boolean deleteRecursive, | |||
CheckoutMetadata checkoutMetadata) throws IOException { | |||
if (entry == null) { | |||
return; | |||
} | |||
if (checkoutMetadata == null) | |||
checkoutMetadata = CheckoutMetadata.EMPTY; | |||
ObjectLoader ol = or.open(entry.getObjectId()); |