Mercurial > hg > mercurial
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>