Merge "IndexDiff: close SubmoduleWalk and use already loaded DirCache"
This commit is contained in:
commit
101b8ea58f
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue