changeset 329:ef091b782acc Eluru-6.5.x

Add ability to specify timeout for pull operation (teamcity.hg.pull.timeout.seconds)
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Fri, 28 Oct 2011 17:55:04 +0300
parents 568ce42b1e9d
children d0edd172943f
files mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentPluginConfig.java mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentPluginConfigImpl.java mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfig.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java mercurial-server/src/META-INF/build-server-plugin-mercurial.xml mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfig.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfigImpl.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java
diffstat 13 files changed, 121 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentPluginConfig.java	Fri Oct 28 17:55:04 2011 +0300
@@ -0,0 +1,10 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+/**
+ * @author dmitry.neverov
+ */
+public interface AgentPluginConfig extends PluginConfig {
+
+  boolean isUseLocalMirrors();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentPluginConfigImpl.java	Fri Oct 28 17:55:04 2011 +0300
@@ -0,0 +1,46 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.agent.AgentRunningBuild;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author dmitry.neverov
+ */
+public class AgentPluginConfigImpl implements AgentPluginConfig {
+
+  private static final String PULL_TIMEOUT_SECONDS = "teamcity.hg.pull.timeout.seconds";
+  private final int DEFAULT_PULL_TIMEOUT_SECONDS = 3600;
+
+  private final AgentRunningBuild myBuild;
+
+  public AgentPluginConfigImpl(@NotNull AgentRunningBuild build) {
+    myBuild = build;
+  }
+
+  public boolean isUseLocalMirrors() {
+    return "true".equals(myBuild.getSharedConfigParameters().get("teamcity.hg.use.local.mirrors"));
+  }
+
+  public int getPullTimeout() {
+    Integer timeout = parseTimeout(myBuild.getSharedConfigParameters().get(PULL_TIMEOUT_SECONDS));
+    if (timeout != null)
+      return timeout;
+    return DEFAULT_PULL_TIMEOUT_SECONDS;
+  }
+
+  @Nullable
+  public Integer parseTimeout(@Nullable String timeoutStr) {
+    if (timeoutStr == null)
+      return null;
+    try {
+      int timeout = Integer.parseInt(timeoutStr);
+      if (timeout > 0)
+        return timeout;
+      else
+        return null;
+    } catch (NumberFormatException e) {
+      return null;
+    }
+  }
+}
--- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java	Fri Oct 28 17:55:04 2011 +0300
@@ -45,17 +45,17 @@
   }
 
   public IncludeRuleUpdater getUpdater(@NotNull final VcsRoot vcsRoot, @NotNull final CheckoutRules checkoutRules, @NotNull final String toVersion, @NotNull final File checkoutDirectory, @NotNull final AgentRunningBuild build, boolean cleanCheckoutRequested) throws VcsException {
+    final AgentPluginConfig config = new AgentPluginConfigImpl(build);
     final BuildProgressLogger logger = build.getBuildLogger();
-    final boolean useLocalMirrors = isUseLocalMirrors(build);
     return new IncludeRuleUpdater() {
       public void process(@NotNull final IncludeRule includeRule, @NotNull final File workingDir) throws VcsException {
         try {
           checkRuleIsValid(includeRule);
           Settings settings = new Settings(vcsRoot);
-          if (useLocalMirrors) {
-            updateLocalMirror(vcsRoot, logger);
+          if (config.isUseLocalMirrors()) {
+            updateLocalMirror(vcsRoot, logger, config);
           }
-          updateRepository(workingDir, settings, logger, useLocalMirrors);
+          updateRepository(workingDir, settings, logger, config);
           updateWorkingDir(settings, workingDir, toVersion, logger);
         } catch (Exception e) {
           if (e instanceof VcsException)
@@ -82,11 +82,6 @@
     return this;
   }
 
-  private boolean isUseLocalMirrors(AgentRunningBuild build) {
-    String value = build.getSharedConfigParameters().get("teamcity.hg.use.local.mirrors");
-    return "true".equals(value);
-  }
-
   private void initRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException {
     try {
       String defaultPullUrl = getDefaultPullUrl(settings, useLocalMirrors);
@@ -98,15 +93,15 @@
     }
   }
 
-  private void updateRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException, IOException {
+  private void updateRepository(File workingDir, Settings settings, BuildProgressLogger logger, AgentPluginConfig config) throws VcsException, IOException {
     if (!Settings.isValidRepository(workingDir)) {
-      initRepository(workingDir, settings, logger, useLocalMirrors);
+      initRepository(workingDir, settings, logger, config.isUseLocalMirrors());
     } else {
-      ensureUseRightRepository(workingDir, settings, logger, useLocalMirrors);
+      ensureUseRightRepository(workingDir, settings, logger, config.isUseLocalMirrors());
     }
-    String defaultPullUrl = getDefaultPullUrl(settings, useLocalMirrors);
+    String defaultPullUrl = getDefaultPullUrl(settings, config.isUseLocalMirrors());
     logger.message("Start pulling changes from " + removePrivateData(defaultPullUrl, Collections.singleton(settings.getPassword())));
-    new PullCommand(settings, workingDir).execute();
+    new PullCommand(settings, workingDir).execute(config.getPullTimeout());
     logger.message("Changes successfully pulled");
   }
 
@@ -123,7 +118,7 @@
     }
   }
 
-  private void updateLocalMirror(VcsRoot root, BuildProgressLogger logger) throws VcsException, IOException {
+  private void updateLocalMirror(VcsRoot root, BuildProgressLogger logger, AgentPluginConfig config) throws VcsException, IOException {
     Settings settings = new Settings(root);
     File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl());
     logger.message("Update local mirror at " + mirrorDir);
@@ -132,7 +127,7 @@
     }
     final String defaultPullUrl = getDefaultPullUrl(settings, true);
     logger.message("Start pulling changes from " + removePrivateData(defaultPullUrl, Collections.singleton(settings.getPassword())));
-    new PullCommand(settings, mirrorDir).execute();
+    new PullCommand(settings, mirrorDir).execute(config.getPullTimeout());
     logger.message("Local mirror changes successfully pulled");
   }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfig.java	Fri Oct 28 17:55:04 2011 +0300
@@ -0,0 +1,10 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+/**
+ * @author dmitry.neverov
+ */
+public interface PluginConfig {
+
+  int getPullTimeout();
+
+}
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java	Fri Oct 28 17:55:04 2011 +0300
@@ -28,7 +28,7 @@
 import java.util.Set;
 
 public class CommandUtil {
-  private static final int DEFAULT_COMMAND_TIMEOUT_SEC = 3600;
+  public static final int DEFAULT_COMMAND_TIMEOUT_SEC = 3600;
 
   public static void checkCommandFailed(@NotNull String cmdName, @NotNull ExecResult res) throws VcsException {
     if (res.getExitCode() != 0 || res.getException() != null) {
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java	Fri Oct 28 17:55:04 2011 +0300
@@ -31,10 +31,10 @@
     super(settings, workingDir);
   }
 
-  public void execute() throws VcsException {
+  public void execute(int timeout) throws VcsException {
     GeneralCommandLine cli = createCommandLine();
     cli.addParameter("pull");
     cli.addParameter(getSettings().getRepositoryUrl());
-    runCommand(cli);
+    runCommand(cli, timeout);
   }
 }
--- a/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Fri Oct 28 17:55:04 2011 +0300
@@ -3,5 +3,5 @@
 
 <beans default-autowire="constructor">
   <bean id="mercurialServer" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialVcsSupport" />
-  <bean id="config" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.PluginConfigImpl" />
+  <bean id="config" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerPluginConfigImpl" />
 </beans>
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Fri Oct 28 17:55:04 2011 +0300
@@ -60,14 +60,14 @@
   private VcsManager myVcsManager;
   private File myDefaultWorkFolderParent;
   private MirrorManager myMirrorManager;
-  private final PluginConfig myConfig;
+  private final ServerPluginConfig myConfig;
   private File myLogTemplate;
 
   public MercurialVcsSupport(@NotNull final VcsManager vcsManager,
                              @NotNull final ServerPaths paths,
                              @NotNull final SBuildServer server,
                              @NotNull final EventDispatcher<BuildServerListener> dispatcher,
-                             @NotNull final PluginConfig config) throws IOException {
+                             @NotNull final ServerPluginConfig config) throws IOException {
     myLogTemplate = createLogTemplate(paths.getPluginDataDirectory());
     myVcsManager = vcsManager;
     myDefaultWorkFolderParent = new File(paths.getCachesDir(), "mercurial");
@@ -420,7 +420,7 @@
       if (Settings.isValidRepository(workingDir)) {
         if (!isChangeSetExist(settings, workingDir, cset)) {
           PullCommand pull = new PullCommand(settings, workingDir);
-          pull.execute();
+          pull.execute(myConfig.getPullTimeout());
         }
       } else {
         CloneCommand cl = new CloneCommand(settings, workingDir);
@@ -438,7 +438,7 @@
     try {
       if (Settings.isValidRepository(workingDir)) {
         PullCommand pull = new PullCommand(settings, workingDir);
-        pull.execute();
+        pull.execute(myConfig.getPullTimeout());
       } else {
         CloneCommand cl = new CloneCommand(settings, workingDir);
         cl.setUpdateWorkingDir(false);
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfig.java	Thu Sep 15 12:25:37 2011 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-package jetbrains.buildServer.buildTriggers.vcs.mercurial;
-
-/**
- * @author dmitry.neverov
- */
-public interface PluginConfig {
-
-  public boolean isUsePullProtocol();
-
-}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/PluginConfigImpl.java	Thu Sep 15 12:25:37 2011 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package jetbrains.buildServer.buildTriggers.vcs.mercurial;
-
-import jetbrains.buildServer.serverSide.TeamCityProperties;
-
-/**
- * @author dmitry.neverov
- */
-public class PluginConfigImpl implements PluginConfig {
-
-  public boolean isUsePullProtocol() {
-    return TeamCityProperties.getBooleanOrTrue("teamcity.hg.use.pull.protocol");
-  }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Fri Oct 28 17:55:04 2011 +0300
@@ -0,0 +1,10 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+/**
+ * @author dmitry.neverov
+ */
+public interface ServerPluginConfig extends PluginConfig {
+
+  public boolean isUsePullProtocol();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Fri Oct 28 17:55:04 2011 +0300
@@ -0,0 +1,21 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.serverSide.TeamCityProperties;
+
+/**
+ * @author dmitry.neverov
+ */
+public class ServerPluginConfigImpl implements ServerPluginConfig {
+
+  private static final String PULL_TIMEOUT_SECONDS = "teamcity.hg.pull.timeout.seconds";
+  private final int DEFAULT_PULL_TIMEOUT_SECONDS = 3600;
+
+  public boolean isUsePullProtocol() {
+    return TeamCityProperties.getBooleanOrTrue("teamcity.hg.use.pull.protocol");
+  }
+
+  public int getPullTimeout() {
+    int timeout = TeamCityProperties.getInteger(PULL_TIMEOUT_SECONDS, DEFAULT_PULL_TIMEOUT_SECONDS);
+    return timeout > 0 ? timeout : DEFAULT_PULL_TIMEOUT_SECONDS;
+  }
+}
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Thu Sep 15 12:25:37 2011 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Fri Oct 28 17:55:04 2011 +0300
@@ -485,11 +485,14 @@
     assertTrue(myVcs.getCollectChangesPolicy() instanceof CollectChangesByCheckoutRules);
   }
 
-  private PluginConfig createPluginConfig() {
-    return new PluginConfig() {
+  private ServerPluginConfig createPluginConfig() {
+    return new ServerPluginConfig() {
       public boolean isUsePullProtocol() {
         return true;
       }
+      public int getPullTimeout() {
+        return CommandUtil.DEFAULT_COMMAND_TIMEOUT_SEC;
+      }
     };
   }
 }