Merge "IndexDiff: close SubmoduleWalk and use already loaded DirCache"

This commit is contained in:
Christian Halstrick 2019-10-15 17:06:12 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit 101b8ea58f
1 changed files with 58 additions and 54 deletions

View File

@ -536,63 +536,67 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
if (ignoreSubmoduleMode != IgnoreSubmoduleMode.ALL) {
IgnoreSubmoduleMode localIgnoreSubmoduleMode = ignoreSubmoduleMode;
SubmoduleWalk smw = SubmoduleWalk.forIndex(repository);
while (smw.next()) {
try {
if (localIgnoreSubmoduleMode == null)
localIgnoreSubmoduleMode = smw.getModulesIgnore();
if (IgnoreSubmoduleMode.ALL
.equals(localIgnoreSubmoduleMode))
continue;
} catch (ConfigInvalidException e) {
throw new IOException(MessageFormat.format(
JGitText.get().invalidIgnoreParamSubmodule,
smw.getPath()), e);
}
try (Repository subRepo = smw.getRepository()) {
String subRepoPath = smw.getPath();
if (subRepo != null) {
ObjectId subHead = subRepo.resolve("HEAD"); //$NON-NLS-1$
if (subHead != null
&& !subHead.equals(smw.getObjectId())) {
modified.add(subRepoPath);
recordFileMode(subRepoPath, FileMode.GITLINK);
} 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(subRepoPath, 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;
}
try (SubmoduleWalk smw = new SubmoduleWalk(repository)) {
smw.setTree(new DirCacheIterator(dirCache));
while (smw.next()) {
try {
if (localIgnoreSubmoduleMode == null)
localIgnoreSubmoduleMode = smw.getModulesIgnore();
if (IgnoreSubmoduleMode.ALL
.equals(localIgnoreSubmoduleMode))
continue;
} catch (ConfigInvalidException e) {
throw new IOException(MessageFormat.format(
JGitText.get().invalidIgnoreParamSubmodule,
smw.getPath()), e);
}
try (Repository subRepo = smw.getRepository()) {
String subRepoPath = smw.getPath();
if (subRepo != null) {
ObjectId subHead = subRepo.resolve("HEAD"); //$NON-NLS-1$
if (subHead != null
&& !subHead.equals(smw.getObjectId())) {
modified.add(subRepoPath);
recordFileMode(subRepoPath, FileMode.GITLINK);
} 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(subRepoPath, 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(subRepoPath);
recordFileMode(subRepoPath,
FileMode.GITLINK);
}
}
}
} else if (missingSubmodules.remove(subRepoPath)) {
// If the directory is there and empty but the submodule
// repository in .git/modules doesn't exist yet it isn't
// "missing".
File gitDir = new File(
new File(repository.getDirectory(),
Constants.MODULES),
subRepoPath);
if (!gitDir.isDirectory()) {
File dir = SubmoduleWalk.getSubmoduleDirectory(
repository, subRepoPath);
if (dir.isDirectory() && !hasFiles(dir)) {
missing.remove(subRepoPath);
} else if (missingSubmodules.remove(subRepoPath)) {
// If the directory is there and empty but the
// submodule repository in .git/modules doesn't
// exist yet it isn't "missing".
File gitDir = new File(
new File(repository.getDirectory(),
Constants.MODULES),
subRepoPath);
if (!gitDir.isDirectory()) {
File dir = SubmoduleWalk.getSubmoduleDirectory(
repository, subRepoPath);
if (dir.isDirectory() && !hasFiles(dir)) {
missing.remove(subRepoPath);
}
}
}
}