Fix possible NPE in IndexDiff when not all submodules are cloned
The latest changes to IndexDiff just assumed that all configured submodules are allways cloned. If a configured submodule did not exist an exception was thrown. This is fixed by this commit. Bug: 450567 Change-Id: Iabe3b196d998c19483082e5720038ebddaeb1890
This commit is contained in:
parent
714f677ca5
commit
9597c41ea9
|
@ -56,11 +56,15 @@
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.api.Git;
|
||||||
|
import org.eclipse.jgit.api.Status;
|
||||||
|
import org.eclipse.jgit.api.errors.GitAPIException;
|
||||||
import org.eclipse.jgit.dircache.DirCache;
|
import org.eclipse.jgit.dircache.DirCache;
|
||||||
import org.eclipse.jgit.dircache.DirCacheEditor;
|
import org.eclipse.jgit.dircache.DirCacheEditor;
|
||||||
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
|
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
|
||||||
import org.eclipse.jgit.dircache.DirCacheEntry;
|
import org.eclipse.jgit.dircache.DirCacheEntry;
|
||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||||
|
import org.eclipse.jgit.errors.NoWorkTreeException;
|
||||||
import org.eclipse.jgit.junit.RepositoryTestCase;
|
import org.eclipse.jgit.junit.RepositoryTestCase;
|
||||||
import org.eclipse.jgit.junit.TestRepository;
|
import org.eclipse.jgit.junit.TestRepository;
|
||||||
import org.eclipse.jgit.lib.Config;
|
import org.eclipse.jgit.lib.Config;
|
||||||
|
@ -98,7 +102,7 @@ public void repositoryWithNoSubmodules() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void repositoryWithRootLevelSubmodule() throws IOException,
|
public void repositoryWithRootLevelSubmodule() throws IOException,
|
||||||
ConfigInvalidException {
|
ConfigInvalidException, NoWorkTreeException, GitAPIException {
|
||||||
final ObjectId id = ObjectId
|
final ObjectId id = ObjectId
|
||||||
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
|
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
|
||||||
final String path = "sub";
|
final String path = "sub";
|
||||||
|
@ -124,6 +128,8 @@ public void apply(DirCacheEntry ent) {
|
||||||
assertNull(gen.getModulesUpdate());
|
assertNull(gen.getModulesUpdate());
|
||||||
assertNull(gen.getModulesUrl());
|
assertNull(gen.getModulesUrl());
|
||||||
assertNull(gen.getRepository());
|
assertNull(gen.getRepository());
|
||||||
|
Status status = Git.wrap(db).status().call();
|
||||||
|
assertTrue(!status.isClean());
|
||||||
assertFalse(gen.next());
|
assertFalse(gen.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -532,27 +532,29 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
|
||||||
throw e1;
|
throw e1;
|
||||||
}
|
}
|
||||||
Repository subRepo = smw.getRepository();
|
Repository subRepo = smw.getRepository();
|
||||||
ObjectId subHead = subRepo.resolve("HEAD"); //$NON-NLS-1$
|
if (subRepo != null) {
|
||||||
if (subHead != null && !subHead.equals(smw.getObjectId()))
|
ObjectId subHead = subRepo.resolve("HEAD"); //$NON-NLS-1$
|
||||||
modified.add(smw.getPath());
|
if (subHead != null && !subHead.equals(smw.getObjectId()))
|
||||||
else if (ignoreSubmoduleMode != IgnoreSubmoduleMode.DIRTY) {
|
|
||||||
IndexDiff smid = submoduleIndexDiffs.get(smw.getPath());
|
|
||||||
if (smid == null) {
|
|
||||||
smid = new IndexDiff(subRepo, smw.getObjectId(),
|
|
||||||
wTreeIt.getWorkingTreeIterator(subRepo));
|
|
||||||
submoduleIndexDiffs.put(smw.getPath(), smid);
|
|
||||||
}
|
|
||||||
if (smid.diff()) {
|
|
||||||
if (ignoreSubmoduleMode == IgnoreSubmoduleMode.UNTRACKED
|
|
||||||
&& smid.getAdded().isEmpty()
|
|
||||||
&& smid.getChanged().isEmpty()
|
|
||||||
&& smid.getConflicting().isEmpty()
|
|
||||||
&& smid.getMissing().isEmpty()
|
|
||||||
&& smid.getModified().isEmpty()
|
|
||||||
&& smid.getRemoved().isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
modified.add(smw.getPath());
|
modified.add(smw.getPath());
|
||||||
|
else if (ignoreSubmoduleMode != IgnoreSubmoduleMode.DIRTY) {
|
||||||
|
IndexDiff smid = submoduleIndexDiffs.get(smw.getPath());
|
||||||
|
if (smid == null) {
|
||||||
|
smid = new IndexDiff(subRepo, smw.getObjectId(),
|
||||||
|
wTreeIt.getWorkingTreeIterator(subRepo));
|
||||||
|
submoduleIndexDiffs.put(smw.getPath(), smid);
|
||||||
|
}
|
||||||
|
if (smid.diff()) {
|
||||||
|
if (ignoreSubmoduleMode == IgnoreSubmoduleMode.UNTRACKED
|
||||||
|
&& smid.getAdded().isEmpty()
|
||||||
|
&& smid.getChanged().isEmpty()
|
||||||
|
&& smid.getConflicting().isEmpty()
|
||||||
|
&& smid.getMissing().isEmpty()
|
||||||
|
&& smid.getModified().isEmpty()
|
||||||
|
&& smid.getRemoved().isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
modified.add(smw.getPath());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue