in git-server/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/ModificationDataRevWalk.java [250:289]
private RevCommit getPreviousCommitWithFixedSubmodule(@NotNull final RevCommit fromCommit,
@NotNull final String submodulePath,
@Nullable MissingSubmoduleCommitInfo missingSubmoduleCommitInfo)
throws IOException {
if (mySearchDepth == 0)
return null;
try (RevWalk revWalk = new RevWalk(getRepository())) {
final RevCommit fromRev = revWalk.parseCommit(fromCommit.getId());
revWalk.markStart(fromRev);
revWalk.sort(RevSort.TOPO);
RevCommit result = null;
RevCommit prevRev;
revWalk.next();
int depth = 0;
while (result == null && depth < mySearchDepth && (prevRev = revWalk.next()) != null) {
depth++;
try (TreeWalk prevTreeWalk = new TreeWalk(getRepository())) {
prevTreeWalk.setFilter(TreeFilter.ALL);
prevTreeWalk.setRecursive(true);
getContext().addTree(getGitRoot(), prevTreeWalk, getRepository(), prevRev, missingSubmoduleCommitInfo, true, false, null);
while (prevTreeWalk.next()) {
String path = prevTreeWalk.getPathString();
if (path.startsWith(submodulePath + "/")) {
final SubmoduleAwareTreeIterator iter = prevTreeWalk.getTree(0, SubmoduleAwareTreeIterator.class);
if (iter != null) {
final SubmoduleAwareTreeIterator parentIter = iter.getParent();
if (!iter.isSubmoduleError() && parentIter != null && parentIter.isOnSubmodule()) {
result = prevRev;
break;
}
}
}
}
}
}
return result;
}
}