changeset 442:6c43663744d9 Faradi-7.0.x

getCurrentVersion do pull only when remote repository is updated * * * Add option that control if we should always pull in getCurrentVersion * * * Turn off by default
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 18 Jun 2012 22:04:51 +0400
parents 4a76645fe087
children 6fb828bf0d87
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.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 mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java
diffstat 7 files changed, 116 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java	Mon Jun 18 22:04:51 2012 +0400
@@ -34,6 +34,7 @@
   private Integer myRevisionNumber;
   private AuthSettings myAuthSettings;
   private String myRepositoryUrl;
+  private String myBranchName;
 
   public IdentifyCommand(@NotNull String hgPath, @NotNull File workingDir, @NotNull AuthSettings authSettings) {
     super(hgPath, workingDir, authSettings);
@@ -59,6 +60,11 @@
     return this;
   }
 
+  public IdentifyCommand branch(@NotNull String branchName) {
+    myBranchName = branchName;
+    return this;
+  }
+
   public IdentifyCommand withAuthSettings(@NotNull AuthSettings authSettings) {
     myAuthSettings = authSettings;
     return this;
@@ -83,6 +89,9 @@
     } else if (myRevisionNumber != null) {
       cli.addParameter("--rev");
       cli.addParameter(myRevisionNumber.toString());
+    } else if (myBranchName != null) {
+      cli.addParameter("--rev");
+      cli.addParameter(myBranchName);
     }
     CommandResult res = runCommand(cli, with().failureWhenStderrNotEmpty());
     String output = res.getStdout().trim();
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Jun 18 22:04:51 2012 +0400
@@ -213,8 +213,22 @@
   @NotNull
   public String getCurrentVersion(@NotNull final VcsRoot root) throws VcsException {
     Settings settings = createSettings(root);
+    if (myConfig.checkRemoteRepositoryUpdateBeforePull()) {
+      HgRepo repo = createRepo(settings);
+      if (repo.isValidRepository()) {
+        String remoteCsetId = repo.id()
+                .repository(settings.getRepository())
+                .withAuthSettings(settings.getAuthSettings())
+                .branch(settings.getBranchName())
+                .call();
+        Map<String, ChangeSet> localBranches = repo.branches().call();
+        ChangeSet localCset = localBranches.get(settings.getBranchName());
+        if (localCset != null && localCset.getId().equals(remoteCsetId))
+          return localCset.getFullVersion();
+      }
+    }
     syncRepository(settings);
-    HgRepo repo = createRepo(settings);
+    HgRepo repo = createRepo(settings);//create new repo because repository cache dir can be changed (when repository became unrelated)
     Map<String, ChangeSet> result = repo.branches().call();
     if (!result.containsKey(settings.getBranchName())) {
       throw new VcsException("Unable to find current version for the branch: " + settings.getBranchName());
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java	Mon Jun 18 22:04:51 2012 +0400
@@ -14,7 +14,7 @@
 /**
  * @author dmitry.neverov
  */
-public final class RepoFactory {
+public class RepoFactory {
 
   private final ServerPluginConfig myConfig;
   private File myLogTemplate;
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Mon Jun 18 22:04:51 2012 +0400
@@ -15,4 +15,6 @@
   int getPullTimeout();
 
   public boolean dontUseRevsets();
+
+  public boolean checkRemoteRepositoryUpdateBeforePull();
 }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Mon Jun 18 22:04:51 2012 +0400
@@ -43,4 +43,8 @@
     int timeout = TeamCityProperties.getInteger(PULL_TIMEOUT_SECONDS, DEFAULT_PULL_TIMEOUT_SECONDS);
     return timeout > 0 ? timeout : DEFAULT_PULL_TIMEOUT_SECONDS;
   }
+
+  public boolean checkRemoteRepositoryUpdateBeforePull() {
+    return TeamCityProperties.getBoolean("teamcity.hg.check.repository.updated.before.pull");
+  }
 }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Mon Jun 18 22:04:51 2012 +0400
@@ -31,9 +31,11 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static com.intellij.openapi.util.io.FileUtil.copyDir;
 import static com.intellij.openapi.util.io.FileUtil.moveDirWithContent;
+import static jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerPluginConfigBuilder.serverPluginConfig;
 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder.vcsRoot;
 
 @Test
@@ -533,6 +535,76 @@
   }
 
 
+  public void getCurrentVersion_should_pull_only_when_remote_repository_is_updated() throws IOException, VcsException {
+    ServerPluginConfig config = serverPluginConfig().
+            cachesDir(myTempFiles.createTempDir())
+            .checkRemoteRepositoryUpdatedBeforePull()
+            .build();
+
+    CustomRepoFactory repoFactory = new CustomRepoFactory(config);
+    MercurialVcsSupport vcs = Util.createMercurialServerSupport(new Mockery(), config, repoFactory);
+    VcsRootImpl root = createVcsRoot(simpleRepo());
+
+    vcs.getCurrentVersion(root);
+
+    AtomicInteger fetchCount = repoFactory.getFetchCount();
+    assertEquals(fetchCount.get(), 1);
+
+    vcs.getCurrentVersion(root);
+
+    fetchCount = repoFactory.getFetchCount();
+    assertEquals(fetchCount.get(), 1);
+  }
+
+
+  private class CustomRepoFactory extends RepoFactory {
+    private final ServerPluginConfig myConfig;
+    private final AtomicInteger myFetchCount;
+
+    private CustomRepoFactory(@NotNull ServerPluginConfig config) throws IOException {
+      super(config);
+      myConfig = config;
+      myFetchCount = new AtomicInteger(0);
+    }
+
+    @NotNull
+    @Override
+    public ServerHgRepo create(@NotNull File workingDir, @NotNull String hgPath, @NotNull AuthSettings authSettings) throws VcsException {
+      return new PullCountingHgRepo(myConfig, workingDir, hgPath, authSettings, myFetchCount);
+    }
+
+    AtomicInteger getFetchCount() {
+      return myFetchCount;
+    }
+  }
+
+  private class PullCountingHgRepo extends ServerHgRepo {
+
+    private final AtomicInteger myPullCount;
+
+    private PullCountingHgRepo(@NotNull ServerPluginConfig config,
+                               @NotNull File workingDir,
+                               @NotNull String hgPath,
+                               @NotNull AuthSettings authSettings,
+                               @NotNull AtomicInteger pullCount) {
+      super(config, workingDir, hgPath, authSettings);
+      myPullCount = pullCount;
+    }
+
+    @Override
+    public PullCommand pull() {
+      myPullCount.incrementAndGet();
+      return super.pull();
+    }
+
+    @Override
+    public CloneCommand doClone() {
+      myPullCount.incrementAndGet();
+      return super.doClone();
+    }
+  }
+
+
   private void assertFiles(final List<String> expectedFiles, final ModificationData modificationData) {
     Set<String> actualFiles = new HashSet<String>();
     for (VcsChange vc: modificationData.getChanges()) {
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Tue May 15 10:21:05 2012 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Mon Jun 18 22:04:51 2012 +0400
@@ -13,6 +13,7 @@
   private String myHgPath;
   private File myCachesDir;
   private boolean myDontUseRevsets = false;
+  private boolean myCheckRemoteRepositoryUpdatedBeforePull = false;
 
   @NotNull
   public ServerPluginConfig build() {
@@ -40,9 +41,16 @@
       public boolean dontUseRevsets() {
         return myDontUseRevsets;
       }
+
+      public boolean checkRemoteRepositoryUpdateBeforePull() {
+        return myCheckRemoteRepositoryUpdatedBeforePull;
+      }
     };
   }
 
+  public static ServerPluginConfigBuilder serverPluginConfig() {
+    return new ServerPluginConfigBuilder();
+  }
 
   public ServerPluginConfigBuilder userPullProtocol(boolean doUse) {
     myUsePullProtocol = doUse;
@@ -63,4 +71,9 @@
     myDontUseRevsets = true;
     return this;
   }
+
+  public ServerPluginConfigBuilder checkRemoteRepositoryUpdatedBeforePull() {
+    myCheckRemoteRepositoryUpdatedBeforePull = true;
+    return this;
+  }
 }