changeset 457:33b9aab523af Faradi-7.0.x

Optimize changes calculation When revsets are not used first try to calculate changes in revisions interval. Build whole history graph only when some parent is not included in interval.
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 05 Jul 2012 20:52:02 +0400
parents f9bf9ec48347
children 1725588ec4f6
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java
diffstat 1 files changed, 35 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java	Thu Jul 05 19:07:01 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java	Thu Jul 05 20:52:02 2012 +0400
@@ -31,13 +31,35 @@
 
   @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())
+      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 +72,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 +98,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 +108,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 +118,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)