private RevCommit getPreviousCommitWithFixedSubmodule()

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;
      }
    }