# HG changeset patch # User Dmitry Neverov # Date 1469184081 -7200 # Node ID 6a16b17fcada924e6d4331d8a4db14aa5b0f5ee7 # Parent ef995b1ed5ecb0bfc001647b1e0fd8ab031f3aac# Parent a0bb066bda0e2b0a7e22b578294b9373c45d3f30 Merge branch Indore-10.0.x diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CollectChangesContext.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CollectChangesContext.java Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CollectChangesContext.java Fri Jul 22 12:41:21 2016 +0200 @@ -37,6 +37,7 @@ public class CollectChangesContext extends OperationContext { + private final ServerPluginConfig myConfig; private final Set myUninterestingRevisions; private final Map> myDags = new HashMap>(); private Set mySyncedDirs = new HashSet(); @@ -46,25 +47,29 @@ private boolean myIncludeFromRevisions = false;//by default don't include them, they should be included only for subrepos private TLongObjectHashMap myStringPool = new TLongObjectHashMap(); - public CollectChangesContext(@NotNull MercurialVcsSupport vcs, + public CollectChangesContext(@NotNull ServerPluginConfig config, + @NotNull MercurialVcsSupport vcs, @NotNull RepoFactory repoFactory, @NotNull MercurialProgress progress, @NotNull RepositoryStateData fromState) { - this(vcs, repoFactory, progress, new HashSet(fromState.getBranchRevisions().values())); + this(config, vcs, repoFactory, progress, new HashSet(fromState.getBranchRevisions().values())); } - public CollectChangesContext(@NotNull MercurialVcsSupport vcs, + public CollectChangesContext(@NotNull ServerPluginConfig config, + @NotNull MercurialVcsSupport vcs, @NotNull RepoFactory repoFactory, @NotNull MercurialProgress progress, @NotNull String fromVersion) { - this(vcs, repoFactory, progress, setOf(fromVersion)); + this(config, vcs, repoFactory, progress, setOf(fromVersion)); } - public CollectChangesContext(@NotNull MercurialVcsSupport vcs, + public CollectChangesContext(@NotNull ServerPluginConfig config, + @NotNull MercurialVcsSupport vcs, @NotNull RepoFactory repoFactory, @NotNull MercurialProgress progress, @NotNull Collection fromVersions) { super(vcs, repoFactory, progress); + myConfig = config; myUninterestingRevisions = new HashSet(fromVersions); } @@ -198,7 +203,7 @@ syncRepository(root); ServerHgRepo repo = createRepo(root, myVcs.getWorkingDir(root)); - if (!repo.supportRevsets()) + if (!repo.supportRevsets() || !myConfig.computeFromRevisions()) return singleton(fromRevision); Set fromRevisions = new HashSet(); @@ -251,8 +256,10 @@ private final static class FindIntervalVisitor extends BFSVisitorAdapter { private final DAG myDag; - private final Collection myUninterestingRevisions; - private final Set myVisitedUninterestingRevisions = new HashSet(); + private final Collection myUninterestingRevisions;//from state revisions + private final Set myAllUninteresting = new HashSet();//myUninterestingRevisions + all revisions reachable from them + private boolean myUninterestingInitialized = false;//become true when myAllUninteresting is computed + private final Set myCoveredUninteresting = new HashSet();//all revisions reachable from computed endpoints private final Set myEndpoints = new HashSet(); private FindIntervalVisitor(@NotNull DAG dag, @NotNull Collection uninteresting) { @@ -264,23 +271,27 @@ public boolean discover(@NotNull String revision) { markUninteresting(); if (!isInteresting(revision)) { - addEndpoint(revision); + if (!myCoveredUninteresting.contains(revision)) { + addEndpoint(revision); + myDag.breadthFirstSearch(revision, new MarkUninterestingRevisions(myCoveredUninteresting)); + } return false; } return true; } private void markUninteresting() { - if (!myVisitedUninterestingRevisions.isEmpty()) + if (myUninterestingInitialized) return; for (String rev : myUninterestingRevisions) { if (myDag.containsNode(rev)) - myDag.breadthFirstSearch(rev, new MarkUninterestingRevisions()); + myDag.breadthFirstSearch(rev, new MarkUninterestingRevisions(myAllUninteresting)); } + myUninterestingInitialized = true; } private boolean isInteresting(@NotNull String revision) { - return !myVisitedUninterestingRevisions.contains(revision); + return !myAllUninteresting.contains(revision); } private void addEndpoint(@NotNull String revision) { @@ -293,11 +304,17 @@ } private class MarkUninterestingRevisions extends BFSVisitorAdapter { + private final Set myAccumulator; + + public MarkUninterestingRevisions(@NotNull Set accumulator) { + myAccumulator = accumulator; + } + @Override public boolean discover(@NotNull String node) { - if (myVisitedUninterestingRevisions.contains(node)) + if (myAccumulator.contains(node)) return false; - myVisitedUninterestingRevisions.add(node); + myAccumulator.add(node); return true; } } diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java Fri Jul 22 12:41:21 2016 +0200 @@ -105,7 +105,7 @@ @NotNull CheckoutRules rules) throws VcsException { List changes = new ArrayList(); HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root); - CollectChangesContext ctx = new CollectChangesContext(myVcs, myRepoFactory, createMercurialProgess(), fromState); + CollectChangesContext ctx = new CollectChangesContext(myConfig, myVcs, myRepoFactory, createMercurialProgess(), fromState); for (Map.Entry entry : toState.getBranchRevisions().entrySet()) { String branch = entry.getKey(); String toRevision = entry.getValue(); @@ -136,7 +136,7 @@ @Nullable String toRootRevision, @NotNull CheckoutRules checkoutRules) throws VcsException { HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(toRoot); - CollectChangesContext context = new CollectChangesContext(myVcs, myRepoFactory, createMercurialProgess(), fromRootRevision); + CollectChangesContext context = new CollectChangesContext(myConfig, myVcs, myRepoFactory, createMercurialProgess(), fromRootRevision); context.syncRepository(hgRoot); String toRevision = toRootRevision; if (toRevision == null) { @@ -156,7 +156,7 @@ @NotNull CheckoutRules checkoutRules) throws VcsException { if (currentVersion == null) return emptyList(); - CollectChangesContext ctx = new CollectChangesContext(myVcs, myRepoFactory, createMercurialProgess(), fromVersion); + CollectChangesContext ctx = new CollectChangesContext(myConfig, myVcs, myRepoFactory, createMercurialProgess(), fromVersion); return collectChanges(ctx, root, fromVersion, currentVersion, checkoutRules); } diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Fri Jul 22 12:41:21 2016 +0200 @@ -59,4 +59,6 @@ public String getMergeTool(); public boolean runWithProfile(@NotNull HgVcsRoot root); + + boolean computeFromRevisions(); } diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Fri Jul 22 12:41:21 2016 +0200 @@ -129,4 +129,8 @@ String urls = TeamCityProperties.getProperty("teamcity.hg.runCommandsWithProfile"); return urls.contains(root.getRepository()); } + + public boolean computeFromRevisions() { + return TeamCityProperties.getBooleanOrTrue("teamcity.hg.computeFromRevisions"); + } } diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CollectChangesContextTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CollectChangesContextTest.java Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,94 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package jetbrains.buildServer.buildTriggers.vcs.mercurial; + +import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot; +import jetbrains.buildServer.util.TestFor; +import jetbrains.buildServer.vcs.RepositoryStateData; +import jetbrains.buildServer.vcs.impl.VcsRootImpl; +import org.jetbrains.annotations.NotNull; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Collection; + +import static jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialSupportBuilder.mercurialSupport; +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 junit.framework.Assert.assertTrue; + + +@RequiredHgVersion(min = "1.7.0") +@Test(dataProviderClass = HgVersionConstraint.class, dataProvider = "installedHgVersion") +public class CollectChangesContextTest extends BaseMercurialTestCase { + + private ServerPluginConfig myConfig; + private MercurialVcsSupport myVcs; + private MercurialSupportBuilder myVcsBuilder; + + @BeforeMethod + public void setUp() throws Exception { + super.setUp(); + myConfig = serverPluginConfig() + .cachesDir(myTempFiles.createTempDir()) + .hgPath(Util.getHgPath()) + .build(); + myVcsBuilder = mercurialSupport().withConfig(myConfig); + myVcs = myVcsBuilder.build(); + } + + + @TestFor(issues = "TW-46340") + public void test_many_from_revisions(@NotNull HgVersion _) throws Exception { + //default + // | branch1 + // V | + // V + // 100 + // /| + //99 | + // | | + //..... total 100 merges from default into branch1 like this + // | 5 + // |/| + // 4 | + // | 3 + // |/| + // 2 | + // |/ + // 1 + // | + // 0 + // + // we collect changes from {default:99} to {default:99, branch1: 100} + // when we compute from revisions for branch1 99 is enough (it will filter out all commits in the default branch) + File remoteRepository = myTempFiles.createTempDir(); + Util.copyRepository(new File("mercurial-tests/testData/manyFromRevisions"), remoteRepository); + VcsRootImpl root = vcsRoot().withUrl(remoteRepository.getAbsolutePath()).build(); + HgVcsRoot hgRoot = myVcsBuilder.getHgRootFactory().createHgRoot(root); + + RepositoryStateData fromState = RepositoryStateData.createVersionState("default", map("default", "d847416dd2eb")); + RepositoryStateData toState = RepositoryStateData.createVersionState("default", map("default", "d847416dd2eb", "branch1", "8c990164b769")); + CollectChangesContext context = new CollectChangesContext(myConfig, myVcs, myVcsBuilder.getHgRepoFactory(), MercurialProgress.NO_OP, fromState); + Collection fromRevisions = context.getFromRevisionsForBranch(hgRoot, "d847416dd2eb", "8c990164b769", toState); + assertTrue(fromRevisions.size() == 1); + assertTrue(fromRevisions.contains("d847416dd2eb")); + } + +} diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java --- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Fri Jul 22 12:41:21 2016 +0200 @@ -111,6 +111,10 @@ public boolean runWithProfile(@NotNull HgVcsRoot root) { return false; } + + public boolean computeFromRevisions() { + return true; + } }; } diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/src/testng.xml --- a/mercurial-tests/src/testng.xml Wed Jun 22 21:33:59 2016 +0200 +++ b/mercurial-tests/src/testng.xml Fri Jul 22 12:41:21 2016 +0200 @@ -56,6 +56,7 @@ + diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/00changelog.i Binary file mercurial-tests/testData/manyFromRevisions/hg/00changelog.i has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/branch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/branch Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,1 @@ +default diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/branchheads.cache --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/branchheads.cache Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,3 @@ +8c990164b769e02a7b0536b7c6a3b0073620cd8f 200 +d847416dd2eb6f5cdce1f7c85075c07f4595f589 default +8c990164b769e02a7b0536b7c6a3b0073620cd8f branch1 diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/cache/branch2-base --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/cache/branch2-base Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,3 @@ +8c990164b769e02a7b0536b7c6a3b0073620cd8f 200 +8c990164b769e02a7b0536b7c6a3b0073620cd8f o branch1 +d847416dd2eb6f5cdce1f7c85075c07f4595f589 o default diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/cache/rbc-names-v1 Binary file mercurial-tests/testData/manyFromRevisions/hg/cache/rbc-names-v1 has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/cache/rbc-revs-v1 Binary file mercurial-tests/testData/manyFromRevisions/hg/cache/rbc-revs-v1 has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/cache/tags2-visible --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/cache/tags2-visible Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,1 @@ +200 8c990164b769e02a7b0536b7c6a3b0073620cd8f diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/dirstate Binary file mercurial-tests/testData/manyFromRevisions/hg/dirstate has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/hgrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/hgrc Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,2 @@ +[paths] +default = /Users/nd/p/test/fromRevisionsTest diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/requires --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/requires Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,4 @@ +dotencode +fncache +revlogv1 +store diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/store/00changelog.i Binary file mercurial-tests/testData/manyFromRevisions/hg/store/00changelog.i has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/store/00manifest.i Binary file mercurial-tests/testData/manyFromRevisions/hg/store/00manifest.i has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/store/data/a.i Binary file mercurial-tests/testData/manyFromRevisions/hg/store/data/a.i has changed diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/store/fncache --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/store/fncache Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,1 @@ +data/a.i diff -r ef995b1ed5ec -r 6a16b17fcada mercurial-tests/testData/manyFromRevisions/hg/tags.cache --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-tests/testData/manyFromRevisions/hg/tags.cache Fri Jul 22 12:41:21 2016 +0200 @@ -0,0 +1,2 @@ +200 8c990164b769e02a7b0536b7c6a3b0073620cd8f +