# HG changeset patch # User Dmitry Neverov # Date 1411580410 -7200 # Node ID 6df89e185a3ca1103a8a8b612ee674c1e0cd908a # Parent d89e84bd4b60d491917921b9d9630a10a6fe2d59 TW-19916 ability to specify custom mercurial config for VCS root diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialIncludeRuleUpdater.java --- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialIncludeRuleUpdater.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialIncludeRuleUpdater.java Wed Sep 24 19:40:10 2014 +0200 @@ -114,27 +114,21 @@ HgRepo mirrorRepo = myRepoFactory.createRepo(myRoot, mirrorDir); if (!mirrorRepo.isValidRepository()) { delete(mirrorDir); - myLogger.message("Clone repository " + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl) + " into local mirror " + mirrorRepo.path()); - mirrorRepo.doClone().fromRepository(repositoryUrl) - .withTraceback(myUseTraceback) - .setUpdateWorkingDir(false) - .setUsePullProtocol(false) - .useUncompressedTransfer(myRoot.isUncompressedTransfer()) - .call(); - myLogger.message("Clone successfully finished"); + mirrorRepo.init().call(); + } + mirrorRepo.setDefaultPath(myRoot.getRepository()); + mirrorRepo.setTeamCityConfig(myRoot.getCustomHgConfig()); + myLogger.message("Update local mirror of " + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl) + " at " + mirrorDir); + if (mirrorRepo.containsRevision(revision)) { + myLogger.message("Local mirror is already up-to-date"); } else { - myLogger.message("Update local mirror of " + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl) + " at " + mirrorDir); - if (mirrorRepo.containsRevision(revision)) { - myLogger.message("Local mirror is already up-to-date"); - } else { - myLogger.message("Start pulling changes from " + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl)); - mirrorRepo.pull().fromRepository(repositoryUrl) - .withTraceback(myUseTraceback) - .withProfile(myProfile) - .withTimeout(myPullTimeout) - .call(); - myLogger.message("Local mirror changes successfully pulled"); - } + myLogger.message("Start pulling changes from " + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl)); + mirrorRepo.pull().fromRepository(repositoryUrl) + .withTraceback(myUseTraceback) + .withProfile(myProfile) + .withTimeout(myPullTimeout) + .call(); + myLogger.message("Local mirror changes successfully pulled"); } } @@ -144,35 +138,24 @@ HgRepo repo = myRepoFactory.createRepo(myRoot, workingDir); myLogger.message("Update repository " + workingDir.getAbsolutePath()); disableSharing(workingDir); - if (repo.isEmpty()) {//can do clone only in empty dir - myLogger.message("Start cloning from " + (myUseLocalMirrors ? "local mirror " : "") + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl)); - repo.doClone().fromRepository(repositoryUrl) - .withTraceback(myUseTraceback) - .setUsePullProtocol(false) - .setUpdateWorkingDir(false) - .useUncompressedTransfer(!myUseLocalMirrors && myRoot.isUncompressedTransfer()) - .call(); - repo.setDefaultPath(myRoot.getRepository()); - myLogger.message("Repository successfully cloned"); + if (!repo.isValidRepository()) + repo.init().call(); + repo.setDefaultPath(myRoot.getRepository()); + repo.setTeamCityConfig(myRoot.getCustomHgConfig()); + if (repo.containsRevision(myToVersion)) { + myLogger.message("Repository already contains revision " + myToVersion); } else { - if (!repo.isValidRepository()) - repo.init().call(); - repo.setDefaultPath(myRoot.getRepository()); - if (repo.containsRevision(myToVersion)) { - myLogger.message("Repository already contains revision " + myToVersion); - } else { - myLogger.message("Start pulling changes from " + (myUseLocalMirrors ? "local mirror " : "") + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl)); - try { - repo.pull().fromRepository(repositoryUrl) - .withTraceback(myUseTraceback) - .withProfile(myProfile) - .withTimeout(myPullTimeout) - .call(); - } catch (UnrelatedRepositoryException e) { - throw new UnrelatedRepositoryException(myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl), workingDir); - } - myLogger.message("Changes successfully pulled"); + myLogger.message("Start pulling changes from " + (myUseLocalMirrors ? "local mirror " : "") + myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl)); + try { + repo.pull().fromRepository(repositoryUrl) + .withTraceback(myUseTraceback) + .withProfile(myProfile) + .withTimeout(myPullTimeout) + .call(); + } catch (UnrelatedRepositoryException e) { + throw new UnrelatedRepositoryException(myAuthSettings.getRepositoryUrlWithHiddenPassword(repositoryUrl), workingDir); } + myLogger.message("Changes successfully pulled"); } } @@ -249,24 +232,17 @@ if (!subrepository.isValidRepository() || !subrepository.containsRevision(subrepoRevision)) { updateLocalMirror(subrepoUrl, subrepoRevision); File mirrorDir = myMirrorManager.getMirrorDir(subrepoUrl); - if (subrepository.isValidRepository()) { - myLogger.message("Pull from local mirror"); - subrepository.pull().fromRepository(mirrorDir) - .withTraceback(myUseTraceback) - .withProfile(myProfile) - .withTimeout(myPullTimeout) - .call(); - myLogger.message("done"); - } else { - myLogger.message("Clone subrepo from local mirror"); - subrepository.doClone().fromRepository(mirrorDir) - .withTraceback(myUseTraceback) - .setUpdateWorkingDir(false) - .setUsePullProtocol(false) - .call(); - subrepository.setDefaultPath(subrepoUrl); - myLogger.message("done"); - } + if (!subrepository.isValidRepository()) + subrepository.init().call(); + subrepository.setDefaultPath(subrepoUrl); + subrepository.setTeamCityConfig(myRoot.getCustomHgConfig()); + myLogger.message("Pull from local mirror"); + subrepository.pull().fromRepository(mirrorDir) + .withTraceback(myUseTraceback) + .withProfile(myProfile) + .withTimeout(myPullTimeout) + .call(); + myLogger.message("done"); } } diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SharingMercurialUpdater.java --- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SharingMercurialUpdater.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SharingMercurialUpdater.java Wed Sep 24 19:40:10 2014 +0200 @@ -42,6 +42,7 @@ if (repo.isEmpty() || !repo.isValidRepository()) repo.init().call(); repo.setDefaultPath(myRoot.getRepository()); + repo.setTeamCityConfig(myRoot.getCustomHgConfig()); File mirrorHg = getMirrorHg(myRoot.getRepository()); String sharedPath = readSharedPath(workingDir); @@ -58,6 +59,7 @@ if (subrepository.isEmpty() || !subrepository.isValidRepository()) subrepository.init().call(); subrepository.setDefaultPath(subrepoUrl); + subrepository.setTeamCityConfig(myRoot.getCustomHgConfig()); if (!subrepository.containsRevision(subrepoRevision)) { updateLocalMirror(subrepoUrl, subrepoRevision); diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Constants.java --- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Constants.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Constants.java Wed Sep 24 19:40:10 2014 +0200 @@ -37,4 +37,7 @@ String PURGE_POLICY = "purgePolicy"; String GLOBAL_DETECT_SUBREPO_CHANGES = "teamcity.hg.detectSubrepoChanges"; String IGNORE_MISSING_DEFAULT_BRANCH = "IGNORE_MISSING_DEFAULT_BRANCH"; + String SUPPORT_HG_CONFIG = "teamcity.hg.supportHgConfig"; + String CUSTOM_HG_CONFIG_PROP = "customHgConfig"; + String TEAMCITY_HG_CONFIG_FILE_NAME = "teamcity"; } diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java --- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java Wed Sep 24 19:40:10 2014 +0200 @@ -236,13 +236,22 @@ public void setDefaultPath(@NotNull String defaultPath) throws VcsException { try { File hgrc = new File(new File(myWorkingDir, ".hg"), "hgrc"); - String content = "[paths]\ndefault = " + defaultPath; + String content = "%include " + Constants.TEAMCITY_HG_CONFIG_FILE_NAME + "\n\n[paths]\ndefault = " + defaultPath; FileUtil.writeFileAndReportErrors(hgrc, content); } catch (IOException e) { throw new VcsException(e); } } + public void setTeamCityConfig(@NotNull String configContent) throws VcsException { + try { + File teamcityConfig = new File(new File(myWorkingDir, ".hg"), Constants.TEAMCITY_HG_CONFIG_FILE_NAME); + FileUtil.writeFileAndReportErrors(teamcityConfig, configContent); + } catch (IOException e) { + throw new VcsException(e); + } + } + public boolean hasSubreposAtRevision(@NotNull String revision) { return !getSubrepositories(new ChangeSet(revision)).isEmpty(); } diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java --- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java Wed Sep 24 19:40:10 2014 +0200 @@ -48,6 +48,7 @@ private final boolean myUseArchiveForPatch; private final PurgePolicy myPurgePolicy; private final boolean myIgnoreMissingDefaultBranch; + private final String myCustomHgConfig; public HgVcsRoot(@NotNull final VcsRoot vcsRoot) { this(vcsRoot.getProperties()); @@ -68,6 +69,7 @@ myUseArchiveForPatch = Boolean.parseBoolean(getProperty(Constants.USE_ARCHIVE_FOR_PATCH)); myPurgePolicy = readPurgePolicy(vcsRootProperties); myIgnoreMissingDefaultBranch = Boolean.valueOf(getProperty(Constants.IGNORE_MISSING_DEFAULT_BRANCH, "false")); + myCustomHgConfig = getProperty(Constants.CUSTOM_HG_CONFIG_PROP, ""); } @NotNull @@ -206,6 +208,11 @@ return myIgnoreMissingDefaultBranch; } + @NotNull + public String getCustomHgConfig() { + return myCustomHgConfig; + } + public static enum PurgePolicy { DONT_RUN, PURGE_UNKNOWN, diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-server/resources/buildServerResources/mercurialSettings.jsp --- a/mercurial-server/resources/buildServerResources/mercurialSettings.jsp Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-server/resources/buildServerResources/mercurialSettings.jsp Wed Sep 24 19:40:10 2014 +0200 @@ -27,6 +27,7 @@ } + @@ -84,6 +85,13 @@ + + + + diff -r d89e84bd4b60 -r 6df89e185a3c mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Mon Sep 22 10:11:51 2014 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Sep 24 19:40:10 2014 +0200 @@ -15,7 +15,6 @@ */ package jetbrains.buildServer.buildTriggers.vcs.mercurial; -import com.intellij.openapi.util.text.StringUtil; import jetbrains.buildServer.Used; import jetbrains.buildServer.buildTriggers.vcs.AbstractVcsPropertiesProcessor; import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*; @@ -41,6 +40,7 @@ import java.io.*; import java.util.*; +import static com.intellij.openapi.util.text.StringUtil.isEmpty; import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir; /** @@ -474,7 +474,7 @@ if (!filter.accept(new File(fileName))) continue; final String mappedFile = checkoutRules.map(fileName); - if (!StringUtil.isEmpty(mappedFile)) { + if (!isEmpty(mappedFile)) { builder.createBinaryFile(new File(mappedFile), null, is, entry.getSize()); } } @@ -528,25 +528,21 @@ lockWorkDir(workingDir); HgRepo repo = createRepo(root); try { - if (repo.isValidRepository()) { - if (repo.containsRevision(cset)) - return; - try { - repo.pull().fromRepository(root.getRepository()) - .withTimeout(myConfig.getPullTimeout()) - .withProfile(myConfig.runWithProfile(root)) - .call(); - } catch (UnrelatedRepositoryException e) { - Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again"); - myMirrorManager.forgetDir(workingDir); - syncRepository(root, cset); - } - } else { - repo.doClone().fromRepository(root.getRepository()) - .useUncompressedTransfer(root.isUncompressedTransfer()) - .setUpdateWorkingDir(false) + if (!repo.isValidRepository()) + repo.init().call(); + if (repo.containsRevision(cset)) + return; + repo.setDefaultPath(root.getRepository()); + repo.setTeamCityConfig(root.getCustomHgConfig()); + try { + repo.pull().fromRepository(root.getRepository()) + .withTimeout(myConfig.getPullTimeout()) + .withProfile(myConfig.runWithProfile(root)) .call(); - repo.setDefaultPath(root.getRepository()); + } catch (UnrelatedRepositoryException e) { + Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again"); + myMirrorManager.forgetDir(workingDir); + syncRepository(root, cset); } } finally { unlockWorkDir(workingDir); @@ -593,21 +589,16 @@ lockWorkDir(workingDir); HgRepo repo = createRepo(root); try { - if (repo.isValidRepository()) { - resetBookmarks(repo); - repo.pull().fromRepository(root.getRepository()) - .withTimeout(myConfig.getPullTimeout()) - .withProgressConsumer(settings.getProgressConsumer()) - .withProfile(myConfig.runWithProfile(root)) - .call(); - } else { - repo.doClone().fromRepository(root.getRepository()) - .setUpdateWorkingDir(false) - .useUncompressedTransfer(root.isUncompressedTransfer()) - .withProgressConsumer(settings.getProgressConsumer()) - .call(); - repo.setDefaultPath(root.getRepository()); - } + if (!repo.isValidRepository()) + repo.init().call(); + repo.setDefaultPath(root.getRepository()); + repo.setTeamCityConfig(root.getCustomHgConfig()); + resetBookmarks(repo); + repo.pull().fromRepository(root.getRepository()) + .withTimeout(myConfig.getPullTimeout()) + .withProgressConsumer(settings.getProgressConsumer()) + .withProfile(myConfig.runWithProfile(root)) + .call(); return settings.getCmd().call(); } finally { unlockWorkDir(workingDir); @@ -801,6 +792,9 @@ Map repositoryProperties = new HashMap(); repositoryProperties.put(Constants.REPOSITORY_PROP, rootProperties.get(Constants.REPOSITORY_PROP)); repositoryProperties.put(Constants.INCLUDE_SUBREPOS_IN_PATCH, rootProperties.get(Constants.INCLUDE_SUBREPOS_IN_PATCH)); + String customHgConfig = rootProperties.get(Constants.CUSTOM_HG_CONFIG_PROP); + if (!isEmpty(customHgConfig)) + repositoryProperties.put(Constants.CUSTOM_HG_CONFIG_PROP, customHgConfig); return repositoryProperties; }
+ + +