changeset 674:61da07eceaa1

add more tests for fetchModificationInfo, simplified code
author eugene.petrenko@gmail.com
date Fri, 15 Nov 2013 13:28:45 +0100
parents 2d566ca0fa65
children 1d417eb6ea28
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilder.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilderTest.java
diffstat 2 files changed, 69 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilder.java	Mon Nov 11 17:39:56 2013 +0100
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilder.java	Fri Nov 15 13:28:45 2013 +0100
@@ -4,12 +4,7 @@
 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;
+import java.util.*;
 
 public class MercurialModificationInfoBuilder implements ModificationInfoBuilder, MercurialServerExtension {
 
@@ -35,25 +30,21 @@
                                                       @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));
+
+    final List<ModificationData> changes = new ArrayList<ModificationData>();
+    for (Map.Entry<String, String> e : state.getBranchRevisions().entrySet()) {
+      final String commitId = e.getValue();
+      final RepositoryStateData oneStateData = RepositoryStateData.createVersionState(e.getKey(), commitId);
+
+      final List<String> parents = myVcs.createRepo(hgRoot).parents().ofRevision(commitId).call();
+      if (parents.isEmpty()) continue;
+
+      final OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, parents, oneStateData);
+      changes.addAll(myVcs.getCollectChangesPolicy().collectChanges(ctx, root, parents, commitId, 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-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilderTest.java	Mon Nov 11 17:39:56 2013 +0100
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialModificationInfoBuilderTest.java	Fri Nov 15 13:28:45 2013 +0100
@@ -4,19 +4,18 @@
 import jetbrains.buildServer.vcs.ModificationData;
 import jetbrains.buildServer.vcs.RepositoryStateData;
 import jetbrains.buildServer.vcs.VcsRoot;
+import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import java.io.File;
+import java.util.Arrays;
 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;
 
 @RequiredHgVersion(min = "1.7.0")
@@ -47,8 +46,60 @@
     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")));
+
+    for (ModificationData change : changes) {
+      if (change.getVersion().equals("505c5b9d01e6")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("78e67807f916"));
+      } else if (change.getVersion().equals("9ec402c74298")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("96b78d73081d"));
+      } else {
+        Assert.fail("Unexpected revision: " + change.getVersion());
+      }
+    }
+
     assertEquals(2, changes.size());
   }
+
+
+  public void should_return_commits_for_every_revision_in_state_parent_child(HgVersion _) throws Exception {
+    VcsRoot root = vcsRoot().withUrl(myRemoteRepository.getAbsolutePath()).build();
+    RepositoryStateData state = RepositoryStateData.createVersionState("default",
+            map("default", "505c5b9d01e6", "personal-branch", "9ec402c74298", "x", "96b78d73081d"));
+    List<ModificationData> changes = myModInfoBuilder.fetchModificationInfo(root, state, CheckoutRules.DEFAULT);
+
+    for (ModificationData change : changes) {
+      if (change.getVersion().equals("505c5b9d01e6")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("78e67807f916"));
+      } else if (change.getVersion().equals("9ec402c74298")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("96b78d73081d"));
+      } else if (change.getVersion().equals("96b78d73081d")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("dec47d2d49bf"));
+      } else {
+        Assert.fail("Unexpected revision: " + change.getVersion());
+      }
+    }
+
+    assertEquals(3, changes.size());
+  }
+
+  public void should_return_commits_for_every_revision_in_state_parent_gap_child(HgVersion _) throws Exception {
+    VcsRoot root = vcsRoot().withUrl(myRemoteRepository.getAbsolutePath()).build();
+    RepositoryStateData state = RepositoryStateData.createVersionState("default",
+            map("default", "505c5b9d01e6", "personal-branch", "9ec402c74298", "x", "dec47d2d49bf"));
+    List<ModificationData> changes = myModInfoBuilder.fetchModificationInfo(root, state, CheckoutRules.DEFAULT);
+
+    for (ModificationData change : changes) {
+      if (change.getVersion().equals("505c5b9d01e6")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("78e67807f916"));
+      } else if (change.getVersion().equals("9ec402c74298")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("96b78d73081d"));
+      } else if (change.getVersion().equals("dec47d2d49bf")) {
+        Assert.assertEquals(change.getParentRevisions(), Arrays.asList("1e620196c4b6"));
+      } else {
+        Assert.fail("Unexpected revision: " + change.getVersion());
+      }
+    }
+
+    assertEquals(3, changes.size());
+  }
 }