changeset 656:32d2a04206c8

Implement ModificationInfoBuilder
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 30 Sep 2013 21:40:02 +0400
parents 5a40adf2ca9e
children b5844a6612cb
files mercurial-server/src/META-INF/build-server-plugin-mercurial.xml mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilder.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilderTest.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialSupportBuilder.java mercurial-tests/src/testng.xml
diffstat 7 files changed, 138 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Mon Sep 30 15:11:25 2013 +0200
+++ b/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml	Mon Sep 30 21:40:02 2013 +0400
@@ -14,4 +14,5 @@
   <bean id="mergeSupport" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialMergeSupport"/>
 
   <bean class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialCommitsInfoBuilderSupport"/>
+  <bean class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialModificationInfoBuilder"/>
 </beans>
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java	Mon Sep 30 15:11:25 2013 +0200
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java	Mon Sep 30 21:40:02 2013 +0400
@@ -150,11 +150,11 @@
   }
 
 
-  private List<ModificationData> collectChanges(@NotNull OperationContext ctx,
-                                                @NotNull VcsRoot root,
-                                                @NotNull Collection<String> fromVersion,
-                                                @Nullable String currentVersion,
-                                                @NotNull CheckoutRules checkoutRules) throws VcsException {
+  public List<ModificationData> collectChanges(@NotNull OperationContext ctx,
+                                               @NotNull VcsRoot root,
+                                               @NotNull Collection<String> fromVersion,
+                                               @Nullable String currentVersion,
+                                               @NotNull CheckoutRules checkoutRules) throws VcsException {
     HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
     ctx.syncRepository(hgRoot);
     List<ModificationData> result = new ArrayList<ModificationData>();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilder.java	Mon Sep 30 21:40:02 2013 +0400
@@ -0,0 +1,59 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
+import jetbrains.buildServer.vcs.*;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static java.util.Collections.emptyList;
+
+public class MercurialModificationInfoBuilder implements ModificationInfoBuilder, MercurialServerExtension {
+
+  private final MercurialVcsSupport myVcs;
+  private final HgVcsRootFactory myHgVcsRootFactory;
+  private final RepoFactory myRepoFactory;
+  private final HgPathProvider myHgPathProvider;
+
+  public MercurialModificationInfoBuilder(@NotNull MercurialVcsSupport vcs,
+                                          @NotNull HgVcsRootFactory hgVcsRootFactory,
+                                          @NotNull RepoFactory repoFactory,
+                                          @NotNull HgPathProvider hgPathProvider) {
+    myVcs = vcs;
+    myHgVcsRootFactory = hgVcsRootFactory;
+    myRepoFactory = repoFactory;
+    myHgPathProvider = hgPathProvider;
+    myVcs.addExtension(this);
+  }
+
+  @NotNull
+  public List<ModificationData> fetchModificationInfo(@NotNull VcsRoot root,
+                                                      @NotNull RepositoryStateData state,
+                                                      @NotNull CheckoutRules checkoutRules) throws VcsException {
+    HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
+    myVcs.syncRepository(hgRoot);
+    Set<String> prevRevisions = getPrevRevisions(hgRoot, state);
+    if (prevRevisions.isEmpty())
+      return emptyList();
+    OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, prevRevisions, state);
+    List<ModificationData> changes = new ArrayList<ModificationData>();
+    for (String revision : state.getBranchRevisions().values()) {
+      changes.addAll(myVcs.getCollectChangesPolicy().collectChanges(ctx, root, prevRevisions, revision, checkoutRules));
+    }
+    return changes;
+  }
+
+
+  @NotNull
+  private Set<String> getPrevRevisions(@NotNull HgVcsRoot root, @NotNull RepositoryStateData state) throws VcsException {
+    Set<String> prevRevisions = new HashSet<String>();
+    HgRepo repo  = myVcs.createRepo(root);
+    for (String revision : state.getBranchRevisions().values()) {
+      prevRevisions.addAll(repo.parents().ofRevision(revision).call());
+    }
+    return prevRevisions;
+  }
+}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java	Mon Sep 30 15:11:25 2013 +0200
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/OperationContext.java	Mon Sep 30 21:40:02 2013 +0400
@@ -17,13 +17,14 @@
 import java.util.*;
 
 import static java.util.Collections.singleton;
+import static jetbrains.buildServer.util.CollectionsUtil.setOf;
 
 public class OperationContext {
 
   private final MercurialVcsSupport myVcs;
   private final RepoFactory myRepoFactory;
   private final HgPathProvider myHgPathProvider;
-  private final RepositoryStateData myFromState;
+  private final Set<String> myUninterestingRevisions;
   private final RepositoryStateData myToState;
   private final Map<VcsRootKey, DAG<String>> myDags = new HashMap<VcsRootKey, DAG<String>>();
   private Set<File> mySyncedDirs = new HashSet<File>();
@@ -39,11 +40,7 @@
                           @NotNull HgPathProvider hgPathProvider,
                           @NotNull RepositoryStateData fromState,
                           @NotNull RepositoryStateData toState) {
-    myVcs = vcs;
-    myRepoFactory = repoFactory;
-    myHgPathProvider = hgPathProvider;
-    myFromState = fromState;
-    myToState = toState;
+    this(vcs, repoFactory, hgPathProvider, new HashSet<String>(fromState.getBranchRevisions().values()), toState);
   }
 
   public OperationContext(@NotNull MercurialVcsSupport vcs,
@@ -51,7 +48,19 @@
                           @NotNull HgPathProvider hgPathProvider,
                           @NotNull String fromVersion,
                           @NotNull String toVersion) {
-    this(vcs, repoFactory, hgPathProvider, RepositoryStateData.createSingleVersionState(fromVersion), RepositoryStateData.createSingleVersionState(toVersion));
+    this(vcs, repoFactory, hgPathProvider, setOf(fromVersion), RepositoryStateData.createSingleVersionState(toVersion));
+  }
+
+  public OperationContext(@NotNull MercurialVcsSupport vcs,
+                          @NotNull RepoFactory repoFactory,
+                          @NotNull HgPathProvider hgPathProvider,
+                          @NotNull Collection<String> fromVersions,
+                          @NotNull RepositoryStateData toState) {
+    myVcs = vcs;
+    myRepoFactory = repoFactory;
+    myHgPathProvider = hgPathProvider;
+    myToState = toState;
+    myUninterestingRevisions = new HashSet<String>(fromVersions);
   }
 
   public void syncRepository(@NotNull final HgVcsRoot root) throws VcsException {
@@ -197,7 +206,7 @@
         myDags.put(rootKey, dag);
       }
       if (dag.containsNode(toRevision)) {
-        FindIntervalVisitor visitor = new FindIntervalVisitor(dag, myFromState.getBranchRevisions().values());
+        FindIntervalVisitor visitor = new FindIntervalVisitor(dag, myUninterestingRevisions);
         dag.breadthFirstSearch(toRevision, visitor);
         fromRevisions.addAll(visitor.getEndpoints());
       } else {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilderTest.java	Mon Sep 30 21:40:02 2013 +0400
@@ -0,0 +1,53 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import jetbrains.buildServer.vcs.CheckoutRules;
+import jetbrains.buildServer.vcs.ModificationData;
+import jetbrains.buildServer.vcs.RepositoryStateData;
+import jetbrains.buildServer.vcs.VcsRoot;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialSupportBuilder.mercurialSupport;
+import static jetbrains.buildServer.buildTriggers.vcs.mercurial.ModificationDataMatcher.modificationData;
+import static jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerPluginConfigBuilder.serverPluginConfig;
+import static jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder.vcsRoot;
+import static jetbrains.buildServer.util.Util.map;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.testng.AssertJUnit.assertEquals;
+
+@Test
+public class MercurialModificationInfoBuilderTest extends BaseMercurialTestCase {
+
+  private File myRemoteRepository;
+  private MercurialModificationInfoBuilder myModInfoBuilder;
+
+  @BeforeMethod
+  public void setUp() throws Exception {
+    super.setUp();
+    ServerPluginConfig config = serverPluginConfig()
+            .cachesDir(myTempFiles.createTempDir())
+            .hgPath(Util.getHgPath())
+            .build();
+
+    myRemoteRepository = myTempFiles.createTempDir();
+    Util.copyRepository(new File("mercurial-tests/testData/rep2"), myRemoteRepository);
+    MercurialSupportBuilder hgBuilder = mercurialSupport().withConfig(config);
+    MercurialVcsSupport vcs = hgBuilder.build();
+    myModInfoBuilder = new MercurialModificationInfoBuilder(vcs, hgBuilder.getHgRootFactory(), hgBuilder.getHgRepoFactory(), hgBuilder.getHgPathProvider());
+  }
+
+
+  public void should_return_commits_for_every_revision_in_state() throws Exception {
+    VcsRoot root = vcsRoot().withUrl(myRemoteRepository.getAbsolutePath()).build();
+    RepositoryStateData state = RepositoryStateData.createVersionState("default",
+            map("default", "505c5b9d01e6", "personal-branch", "9ec402c74298"));
+    List<ModificationData> changes = myModInfoBuilder.fetchModificationInfo(root, state, CheckoutRules.DEFAULT);
+    assertThat(changes, hasItem(modificationData().withVersion("505c5b9d01e6")));
+    assertThat(changes, hasItem(modificationData().withVersion("9ec402c74298")));
+    assertEquals(2, changes.size());
+  }
+}
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialSupportBuilder.java	Mon Sep 30 15:11:25 2013 +0200
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialSupportBuilder.java	Mon Sep 30 21:40:02 2013 +0400
@@ -63,7 +63,7 @@
     return myHgRootFactory;
   }
 
-  public HgRepoFactory getHgRepoFactory() {
+  public RepoFactory getHgRepoFactory() {
     return myRepoFactory;
   }
 
--- a/mercurial-tests/src/testng.xml	Mon Sep 30 15:11:25 2013 +0200
+++ b/mercurial-tests/src/testng.xml	Mon Sep 30 21:40:02 2013 +0400
@@ -34,6 +34,8 @@
       <class name="jetbrains.buildServer.buildTriggers.vcs.mercurial.SubRepoTest"/>
       <class name="jetbrains.buildServer.buildTriggers.vcs.mercurial.MergeSupportTest"/>
       <class name="jetbrains.buildServer.buildTriggers.vcs.mercurial.TagsTest"/>
+      <class name="jetbrains.buildServer.buildTriggers.vcs.mercurial.CommitsInfoBuilderSupportTest"/>
+      <class name="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialModificationInfoBuilderTest"/>
     </classes>
   </test>
 </suite>