changeset 550:2fbe8c7fa710

Don't collect same subrepo changes twice
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 25 Feb 2013 16:33:20 +0400
parents 80a45e45918c
children 4a18bdd61aa6
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java
diffstat 2 files changed, 31 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Feb 25 12:22:27 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Feb 25 16:33:20 2013 +0400
@@ -663,7 +663,10 @@
       if (configChange.getPreviousSubrepoRevisions().isEmpty())
         continue;
       VcsRootImpl subrepo = new VcsRootImpl(m.getVcsRootObject().getId(), configChange.getSubrepoRootParams());
+      if (ctx.isProcessedSubrepoChanges(subrepo, configChange.getPreviousSubrepoRevisions(), configChange.getCurrentSubrepoRevision()))
+        continue;
       subrepoChanges.addAll(collectChanges(ctx, subrepo, configChange.getPreviousSubrepoRevisions(), configChange.getCurrentSubrepoRevision(), CheckoutRules.DEFAULT));
+      ctx.markProcessedSubrepoChanges(subrepo, configChange.getPreviousSubrepoRevisions(), configChange.getCurrentSubrepoRevision());
     }
     return subrepoChanges;
   }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java	Mon Feb 25 12:22:27 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java	Mon Feb 25 16:33:20 2013 +0400
@@ -1,20 +1,20 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
+import com.intellij.openapi.util.Pair;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
 import jetbrains.buildServer.vcs.VcsException;
+import jetbrains.buildServer.vcs.VcsRoot;
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class OperationContext {
 
   private final MercurialVcsSupport myVcs;
   private Set<File> mySyncedDirs = new HashSet<File>();
   private Map<String, HgVersion> myHgVersions = new HashMap<String, HgVersion>();
+  private Map<String, Set<SubrepoChangesInterval>> myProcessedSubrepoChanges = new HashMap<String, Set<SubrepoChangesInterval>>();
 
   public OperationContext(@NotNull MercurialVcsSupport vcs) {
     myVcs = vcs;
@@ -39,4 +39,28 @@
     myHgVersions.put(hgPath, version);
     return version;
   }
+
+  public void markProcessedSubrepoChanges(@NotNull VcsRoot subrepo, @NotNull List<String> previousSubrepoRevisions, @NotNull String currentSubrepoRevision) {
+    String subrepoUrl = subrepo.getProperty(Constants.REPOSITORY_PROP);
+    Set<SubrepoChangesInterval> processedSubrepoChanges = myProcessedSubrepoChanges.get(subrepoUrl);
+    if (processedSubrepoChanges == null) {
+      processedSubrepoChanges = new HashSet<SubrepoChangesInterval>();
+      myProcessedSubrepoChanges.put(subrepoUrl, processedSubrepoChanges);
+    }
+    processedSubrepoChanges.add(new SubrepoChangesInterval(previousSubrepoRevisions, currentSubrepoRevision));
+  }
+
+  public boolean isProcessedSubrepoChanges(@NotNull VcsRoot subrepo, @NotNull List<String> previousSubrepoRevisions, @NotNull String currentSubrepoRevision) {
+    String subrepoUrl = subrepo.getProperty(Constants.REPOSITORY_PROP);
+    Set<SubrepoChangesInterval> processedSubrepoChanges = myProcessedSubrepoChanges.get(subrepoUrl);
+    if (processedSubrepoChanges == null)
+      return false;
+    return processedSubrepoChanges.contains(new SubrepoChangesInterval(previousSubrepoRevisions, currentSubrepoRevision));
+  }
+
+  private final static class SubrepoChangesInterval extends Pair<List<String>, String> {
+    private SubrepoChangesInterval(@NotNull List<String> prevRevisions, @NotNull String currentRevision) {
+      super(prevRevisions, currentRevision);
+    }
+  }
 }