protected Map getSubmodules()

in git-agent/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterWithMirror.java [434:495]


  protected Map<String, AggregatedSubmodule> getSubmodules(@NotNull File repositoryDir) throws IOException, VcsException, ConfigInvalidException {
    final AgentGitFacade git = myGitFactory.create(repositoryDir);
    final String revision = git.revParse().setRef("HEAD").call();
    if (StringUtil.isEmpty(revision)) return Collections.emptyMap();

    final Config gitModules = readGitModules(repositoryDir);
    if (gitModules == null) return Collections.emptyMap();

    Repository r = null;
    try {
      r = newRepositoryBuilder().setBare().setGitDir(getGitDir(repositoryDir)).build();

      final StoredConfig gitConfig = r.getConfig();
      final Set<String> submodules = gitModules.getSubsections("submodule");
      final Map<String, AggregatedSubmodule> aggregatedSubmodules = new HashMap<String, AggregatedSubmodule>();

      for (String submoduleName : submodules) {
        String url = gitConfig.getString("submodule", submoduleName, "url");
        if (url == null) {
          Loggers.VCS.info(".git/config doesn't contain an url for submodule '" + submoduleName + "', use url from .gitmodules");
          url = gitModules.getString("submodule", submoduleName, "url");
        }

        if (StringUtil.isEmpty(url)) { // shouldn't happen unless .gitmodules is malformed & missing a url
          Loggers.VCS.warn("Could not determine submodule url for '" + submoduleName + "'");
          continue;
        }

        final String submodulePath = gitModules.getString("submodule", submoduleName, "path");
        if (StringUtil.isEmpty(submodulePath)) { // // shouldn't happen unless .gitmodules is malformed & missing a path
          Loggers.VCS.warn("Could not determine submodule path for '" + submoduleName + "'");
          continue;
        }

        final String submoduleRevision = getSubmoduleRevision(git, revision, submodulePath);
        if (StringUtil.isEmpty(submoduleRevision)) { // submodule path specified in .gitmodules may not actually exist
          Loggers.VCS.warn("Could not determine submodule commit for '" + submoduleName + "', at path '" + submodulePath + "'");
          continue;
        }

        // Build a map of submodule url -> (names, paths, commits)
        // The same submodule url can be checked out to multiple paths & at different commits, but we only need one local mirror.
        AggregatedSubmodule aggregatedSubmodule;
        if (aggregatedSubmodules.containsKey(url)) {
          aggregatedSubmodule = aggregatedSubmodules.get(url);
        } else {
          aggregatedSubmodule = new AggregatedSubmodule(url);
        }

        final String branch = gitModules.getString("submodule", submoduleName, "branch");
        aggregatedSubmodule.addSubmodule(new Submodule(submoduleName, submodulePath.replaceAll("/", Matcher.quoteReplacement(File.separator)), submoduleRevision,
                                                       ".".equals(branch) ? myFullBranchName : branch));
        aggregatedSubmodules.put(url, aggregatedSubmodule);
      }

      return aggregatedSubmodules;
    } finally {
      if (r != null) {
        r.close();
      }
    }
  }