changeset 870:6df89e185a3c

TW-19916 ability to specify custom mercurial config for VCS root
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Wed, 24 Sep 2014 19:40:10 +0200
parents d89e84bd4b60
children 8b0a27214abf
files mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialIncludeRuleUpdater.java mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SharingMercurialUpdater.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Constants.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java mercurial-server/resources/buildServerResources/mercurialSettings.jsp mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java
diffstat 7 files changed, 100 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- 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");
     }
   }
 
--- 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);
--- 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";
 }
--- 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();
   }
--- 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,
--- 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 @@
 }
 </script>
 <c:set var="subreposGloballyDisabled" value="<%= !TeamCityProperties.getBooleanOrTrue(Constants.GLOBAL_DETECT_SUBREPO_CHANGES) %>"/>
+<c:set var="showHgConfig" value="<%= TeamCityProperties.getBoolean(Constants.SUPPORT_HG_CONFIG) %>"/>
 <table class="runnerFormTable">
 
   <l:settingsGroup title="General Settings">
@@ -84,6 +85,13 @@
       <span class="error" id="error_hgCommandPath"></span>
     </td>
   </tr>
+  <tr class="advancedSetting">
+    <th><label for="customHgConfig">Mercurial config:</label></th>
+    <td>
+      <props:multilineProperty name="customHgConfig" className="longField" linkTitle="Edit mercurial config" expanded="${true}" rows="3" cols="60"/>
+      <span class="error" id="error_customHgConfig"></span>
+    </td>
+  </tr>
   </l:settingsGroup>
   <l:settingsGroup title="Authorization Settings">
   <tr>
--- 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<String, String> repositoryProperties = new HashMap<String, String>();
     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;
   }