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