Fix error occurring during checkout

Fix NullPointerException occurring when calling
CheckoutCommand with forced == true option when
the branch isn't changed and there is deleted
uncommitted file.

Change-Id: I99bf1fc25e6889f07092320d7bc2772ec5d341b5
Signed-off-by: Nail Samatov <sanail@yandex.ru>
This commit is contained in:
Nail Samatov 2020-05-07 12:03:56 +03:00
parent e69e642ea4
commit f30e48914e
2 changed files with 23 additions and 1 deletions

View File

@ -124,6 +124,28 @@ public void testCheckoutForced() throws Exception {
.setForced(true).call().getObjectId());
}
@Test
public void testCheckoutForced_deleteFileAndRestore() throws Exception {
File testFile = new File(db.getWorkTree(), "Test.txt");
assertTrue(testFile.exists());
assertEquals("test", git.getRepository().getBranch());
FileUtils.delete(testFile);
assertFalse(testFile.exists());
// Switch from "test" to "master".
assertEquals(initialCommit.getId(), git.checkout().setName("master")
.setForced(true).call().getObjectId());
assertTrue(testFile.exists());
assertEquals("master", git.getRepository().getBranch());
FileUtils.delete(testFile);
assertFalse(testFile.exists());
// Stay in current branch.
assertEquals(initialCommit.getId(), git.checkout().setName("master")
.setForced(true).call().getObjectId());
assertTrue(testFile.exists());
}
@Test
public void testCreateBranchOnCheckout() throws Exception {
git.checkout().setCreateBranch(true).setName("test2").call();

View File

@ -1217,7 +1217,7 @@ private void keep(String path, DirCacheEntry e, WorkingTreeIterator f)
if (e != null && !FileMode.TREE.equals(e.getFileMode()))
builder.add(e);
if (force) {
if (f.isModified(e, true, walk.getObjectReader())) {
if (f == null || f.isModified(e, true, walk.getObjectReader())) {
kept.add(path);
checkoutEntry(repo, e, walk.getObjectReader(), false,
new CheckoutMetadata(walk.getEolStreamType(CHECKOUT_OP),