changeset 460:8eb05f24d883

Merge Faradi-7.0.x
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Fri, 06 Jul 2012 21:26:25 +0400
parents cb5263bf8b25 (current diff) b5e79418bacf (diff)
children b21f3b3a33b1
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.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/ServerPluginConfigBuilder.java
diffstat 6 files changed, 89 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Fri Jul 06 21:26:25 2012 +0400
@@ -628,7 +628,7 @@
     String fromCommit = new ChangeSetRevision(fromVersion).getId();
     String toCommit = new ChangeSetRevision(toVersion).getId();
     try {
-      List<ChangeSet> changesets = createRepo(root).collectChanges()
+      List<ChangeSet> changesets = createRepo(root).collectChanges(root)
               .fromRevision(fromCommit)
               .toRevision(toCommit)
               .call();
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java	Fri Jul 06 21:26:25 2012 +0400
@@ -2,6 +2,8 @@
 
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
 import jetbrains.buildServer.vcs.VcsException;
+import jetbrains.buildServer.vcs.VcsRoot;
+import jetbrains.buildServer.vcs.VcsRootInstance;
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
@@ -40,9 +42,12 @@
   }
 
   @NotNull
-  public CollectChangesCommand collectChanges() throws VcsException {
-    if (myConfig.dontUseRevsets())
+  public CollectChangesCommand collectChanges(@NotNull HgVcsRoot root) throws VcsException {
+    if (myConfig.dontUseRevsets()) {
+      if (shouldUseRevsetsFor(root))
+        return new CollectChangesWithRevsets(this);
       return new CollectChangesNoRevsets(this, myLogNoFilesTemplate);
+    }
 
     HgVersion hgVersion = getHgVersion();
     if (hgVersion.isEqualsOrGreaterThan(REVSET_HG_VERSION)) {
@@ -55,4 +60,11 @@
   private HgVersion getHgVersion() throws VcsException {
     return version().call();
   }
+
+  private boolean shouldUseRevsetsFor(@NotNull VcsRoot root) {
+    if (!(root instanceof VcsRootInstance))
+      return false;
+    long parentId = ((VcsRootInstance) root).getParentId();
+    return myConfig.getRevsetParentRootIds().contains(parentId);
+  }
 }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java	Fri Jul 06 21:26:25 2012 +0400
@@ -1,7 +1,10 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Set;
+
 /**
  * @author dmitry.neverov
  */
@@ -15,4 +18,7 @@
   int getPullTimeout();
 
   public boolean dontUseRevsets();
+
+  @NotNull
+  Set<Long> getRevsetParentRootIds();
 }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java	Fri Jul 06 21:26:25 2012 +0400
@@ -1,17 +1,24 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
+import com.intellij.openapi.diagnostic.Logger;
 import jetbrains.buildServer.serverSide.ServerPaths;
 import jetbrains.buildServer.serverSide.TeamCityProperties;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.intellij.openapi.util.text.StringUtil.isEmpty;
+import static java.util.Collections.emptySet;
 
 /**
  * @author dmitry.neverov
  */
 public class ServerPluginConfigImpl implements ServerPluginConfig {
 
+  private static final Logger LOG = Logger.getInstance(ServerPluginConfigImpl.class.getName());
   private static final String PULL_TIMEOUT_SECONDS = "teamcity.hg.pull.timeout.seconds";
   public static final int DEFAULT_PULL_TIMEOUT_SECONDS = 3600;
 
@@ -43,4 +50,21 @@
     int timeout = TeamCityProperties.getInteger(PULL_TIMEOUT_SECONDS, DEFAULT_PULL_TIMEOUT_SECONDS);
     return timeout > 0 ? timeout : DEFAULT_PULL_TIMEOUT_SECONDS;
   }
+
+  @NotNull
+  public Set<Long> getRevsetParentRootIds() {
+    String parentRootIds = TeamCityProperties.getProperty("teamcity.hg.use.revsets.root.ids", "");
+    if (isEmpty(parentRootIds))
+      return emptySet();
+
+    Set<Long> ids = new HashSet<Long>();
+    for (String parentRootId : parentRootIds.split(",")) {
+      try {
+        ids.add(Long.parseLong(parentRootId));
+      } catch (Exception e) {
+        LOG.warn("Cannot parse rootId \"" + parentRootId + "\", ignore it");
+      }
+    }
+    return ids;
+  }
 }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java	Fri Jul 06 21:26:25 2012 +0400
@@ -31,13 +31,37 @@
 
   @NotNull
   public List<ChangeSet> call(@NotNull final String fromCommit, @NotNull final String toCommit) throws VcsException {
+    List<ChangeSet> revisionIntervalCsets = getRevisionsBetween(fromCommit, toCommit);
+    List<Pair<String, String>> revisionIntervalEdges = getEdges(revisionIntervalCsets);
+    Map<String, ChangeSet> revisionIntervalMap = getChangesetMap(revisionIntervalCsets);
+    DAG<String> revisionIntervalDag = DAGs.createFromEdges(revisionIntervalEdges);
+    DAGIterator<String> iter = revisionIntervalDag.iterator(toCommit);
+    iter.markUninteresting(fromCommit);
+    List<ChangeSet> revisionIntervalReachableChangesets = new ArrayList<ChangeSet>();
+    Set<String> missingParents = new HashSet<String>();
+    while (iter.hasNext()) {
+      String csetId = iter.next();
+      ChangeSet cset = revisionIntervalMap.get(csetId);
+      if (cset != null) {
+        revisionIntervalReachableChangesets.add(cset);
+      } else {
+        missingParents.add(csetId);
+      }
+    }
+
+    if (missingParents.isEmpty()) {
+      Collections.reverse(revisionIntervalReachableChangesets);
+      return revisionIntervalReachableChangesets;
+    }
+
     Pair<List<ChangeSet>, Integer> commitsWithoutFiles = getCommitsWithoutFiles(fromCommit, toCommit);
     List<ChangeSet> csetsWithoutFiles = commitsWithoutFiles.first;
     Integer minRevNum = commitsWithoutFiles.second;
     if (csetsWithoutFiles.isEmpty())
-      return csetsWithoutFiles;
-    List<ChangeSet> commitsWithFiles = getRevisionsBetween(minRevNum, toCommit);
+      return revisionIntervalCsets;
+    List<ChangeSet> commitsWithFiles = getRevisionsBetween(minRevNum, fromCommit);
     Map<String, ChangeSet> csetMap = getChangesetMap(commitsWithFiles);
+    csetMap.putAll(revisionIntervalMap);
     List<ChangeSet> result = new ArrayList<ChangeSet>();
     for (ChangeSet cset : csetsWithoutFiles) {
       ChangeSet csetWithFiles = csetMap.get(cset.getId());
@@ -50,7 +74,7 @@
 
   @NotNull
   private Pair<List<ChangeSet>, Integer> getCommitsWithoutFiles(@NotNull String fromCommit, @NotNull String toCommit) throws VcsException {
-    List<ChangeSet> csets = getRevisionsReachableFrom(toCommit);
+    List<ChangeSet> csets = getAllHistoryUpTo(toCommit);
     Map<String, ChangeSet> csetsMap = getChangesetMap(csets);
     if (csetsMap.containsKey(fromCommit)) {
       DAG<String> dag = DAGs.createFromEdges(getEdges(csets));
@@ -76,6 +100,7 @@
   }
 
 
+  //csetId -> cset
   private Map<String, ChangeSet> getChangesetMap(@NotNull final List<ChangeSet> csets) {
     Map<String, ChangeSet> result = new HashMap<String, ChangeSet>(csets.size());
     for (ChangeSet cset : csets) {
@@ -85,7 +110,7 @@
   }
 
 
-  private List<ChangeSet> getRevisionsReachableFrom(@NotNull final String revision) throws VcsException {
+  private List<ChangeSet> getAllHistoryUpTo(@NotNull final String revision) throws VcsException {
     return myRepo.log()
             .fromRevision(revision)
             .toRevision("0")
@@ -95,6 +120,14 @@
   }
 
 
+  private List<ChangeSet> getRevisionsBetween(@NotNull String fromCommit, @NotNull String toCommit) throws VcsException {
+    return myRepo.log()
+            .fromRevision(toCommit)
+            .toRevision(fromCommit)
+            .showCommitsFromAllBranches()
+            .call();
+  }
+
   private List<ChangeSet> getRevisionsBetween(int fromRevNum, @NotNull String toCommit) throws VcsException {
     return myRepo.log()
             .fromRevision(toCommit)
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Wed Jul 04 21:36:43 2012 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java	Fri Jul 06 21:26:25 2012 +0400
@@ -3,6 +3,8 @@
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * @author dmitry.neverov
@@ -40,6 +42,11 @@
       public boolean dontUseRevsets() {
         return myDontUseRevsets;
       }
+
+      @NotNull
+      public Set<Long> getRevsetParentRootIds() {
+        return new HashSet<Long>();
+      }
     };
   }