|
|
|
@ -536,63 +536,67 @@ public class IndexDiff {
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|