in git-agent/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterImpl.java [413:476]
private void addSubmoduleUsernames(@NotNull File repositoryDir, @NotNull Config gitModules)
throws IOException, VcsException {
if (!myPluginConfig.isUseMainRepoUserForSubmodules())
return;
Loggers.VCS.info("Update submodules credentials");
AuthSettings auth = myRoot.getAuthSettings();
final String userName = auth.getUserName();
if (userName == null) {
Loggers.VCS.info("Username is not specified in the main VCS root settings, skip updating submodule credentials");
return;
}
Repository r = null;
try {
r = newRepositoryBuilder().setBare().setGitDir(getGitDir(repositoryDir)).build();
StoredConfig gitConfig = r.getConfig();
Set<String> submodules = gitModules.getSubsections("submodule");
if (submodules.isEmpty()) {
Loggers.VCS.info("No submodule sections found in " + new File(repositoryDir, ".gitmodules").getCanonicalPath()
+ ", skip updating credentials");
return;
}
File modulesDir = getModulesDir(r.getDirectory());
for (String submoduleName : submodules) {
//The 'git submodule sync' command executed before resolves relative submodule urls
//from .gitmodules and writes them into .git/config. We should use resolved urls in
//order to add parent repository username to submodules with relative urls.
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");
}
Loggers.VCS.info("Update credentials for submodule with url " + url);
if (url == null || !isRequireAuth(url)) {
Loggers.VCS.info("Url " + url + " does not require authentication, skip updating credentials");
continue;
}
try {
URIish uri = new URIish(url);
String updatedUrl = uri.setUser(userName).toASCIIString();
gitConfig.setString("submodule", submoduleName, "url", updatedUrl);
String submodulePath = gitModules.getString("submodule", submoduleName, "path");
if (submodulePath != null && myPluginConfig.isUpdateSubmoduleOriginUrl()) {
File submoduleDir = new File(modulesDir, submodulePath);
if (submoduleDir.isDirectory() && new File(submoduleDir, Constants.CONFIG).isFile())
updateOriginUrl(submoduleDir, updatedUrl);
}
Loggers.VCS.debug("Submodule url " + url + " changed to " + updatedUrl);
} catch (URISyntaxException e) {
Loggers.VCS.warn("Error while parsing an url " + url + ", skip updating submodule credentials", e);
} catch (Exception e) {
Loggers.VCS.warn("Error while updating the '" + submoduleName + "' submodule url", e);
}
}
gitConfig.save();
} finally {
if (r != null) {
r.close();
}
}
}