Mercurial > hg > mercurial
changeset 460:8eb05f24d883
Merge Faradi-7.0.x
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Fri, 06 Jul 2012 21:26:25 +0400 |
parents | cb5263bf8b25 (current diff) b5e79418bacf (diff) |
children | b21f3b3a33b1 |
files | mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/HgVcsRoot.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java |
diffstat | 6 files changed, 89 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Fri Jul 06 21:26:25 2012 +0400 @@ -628,7 +628,7 @@ String fromCommit = new ChangeSetRevision(fromVersion).getId(); String toCommit = new ChangeSetRevision(toVersion).getId(); try { - List<ChangeSet> changesets = createRepo(root).collectChanges() + List<ChangeSet> changesets = createRepo(root).collectChanges(root) .fromRevision(fromCommit) .toRevision(toCommit) .call();
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java Fri Jul 06 21:26:25 2012 +0400 @@ -2,6 +2,8 @@ import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*; import jetbrains.buildServer.vcs.VcsException; +import jetbrains.buildServer.vcs.VcsRoot; +import jetbrains.buildServer.vcs.VcsRootInstance; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -40,9 +42,12 @@ } @NotNull - public CollectChangesCommand collectChanges() throws VcsException { - if (myConfig.dontUseRevsets()) + public CollectChangesCommand collectChanges(@NotNull HgVcsRoot root) throws VcsException { + if (myConfig.dontUseRevsets()) { + if (shouldUseRevsetsFor(root)) + return new CollectChangesWithRevsets(this); return new CollectChangesNoRevsets(this, myLogNoFilesTemplate); + } HgVersion hgVersion = getHgVersion(); if (hgVersion.isEqualsOrGreaterThan(REVSET_HG_VERSION)) { @@ -55,4 +60,11 @@ private HgVersion getHgVersion() throws VcsException { return version().call(); } + + private boolean shouldUseRevsetsFor(@NotNull VcsRoot root) { + if (!(root instanceof VcsRootInstance)) + return false; + long parentId = ((VcsRootInstance) root).getParentId(); + return myConfig.getRevsetParentRootIds().contains(parentId); + } }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Fri Jul 06 21:26:25 2012 +0400 @@ -1,7 +1,10 @@ package jetbrains.buildServer.buildTriggers.vcs.mercurial; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + /** * @author dmitry.neverov */ @@ -15,4 +18,7 @@ int getPullTimeout(); public boolean dontUseRevsets(); + + @NotNull + Set<Long> getRevsetParentRootIds(); }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Fri Jul 06 21:26:25 2012 +0400 @@ -1,17 +1,24 @@ package jetbrains.buildServer.buildTriggers.vcs.mercurial; +import com.intellij.openapi.diagnostic.Logger; import jetbrains.buildServer.serverSide.ServerPaths; import jetbrains.buildServer.serverSide.TeamCityProperties; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import static com.intellij.openapi.util.text.StringUtil.isEmpty; +import static java.util.Collections.emptySet; /** * @author dmitry.neverov */ public class ServerPluginConfigImpl implements ServerPluginConfig { + private static final Logger LOG = Logger.getInstance(ServerPluginConfigImpl.class.getName()); private static final String PULL_TIMEOUT_SECONDS = "teamcity.hg.pull.timeout.seconds"; public static final int DEFAULT_PULL_TIMEOUT_SECONDS = 3600; @@ -43,4 +50,21 @@ int timeout = TeamCityProperties.getInteger(PULL_TIMEOUT_SECONDS, DEFAULT_PULL_TIMEOUT_SECONDS); return timeout > 0 ? timeout : DEFAULT_PULL_TIMEOUT_SECONDS; } + + @NotNull + public Set<Long> getRevsetParentRootIds() { + String parentRootIds = TeamCityProperties.getProperty("teamcity.hg.use.revsets.root.ids", ""); + if (isEmpty(parentRootIds)) + return emptySet(); + + Set<Long> ids = new HashSet<Long>(); + for (String parentRootId : parentRootIds.split(",")) { + try { + ids.add(Long.parseLong(parentRootId)); + } catch (Exception e) { + LOG.warn("Cannot parse rootId \"" + parentRootId + "\", ignore it"); + } + } + return ids; + } }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Fri Jul 06 21:26:25 2012 +0400 @@ -31,13 +31,37 @@ @NotNull public List<ChangeSet> call(@NotNull final String fromCommit, @NotNull final String toCommit) throws VcsException { + List<ChangeSet> revisionIntervalCsets = getRevisionsBetween(fromCommit, toCommit); + List<Pair<String, String>> revisionIntervalEdges = getEdges(revisionIntervalCsets); + Map<String, ChangeSet> revisionIntervalMap = getChangesetMap(revisionIntervalCsets); + DAG<String> revisionIntervalDag = DAGs.createFromEdges(revisionIntervalEdges); + DAGIterator<String> iter = revisionIntervalDag.iterator(toCommit); + iter.markUninteresting(fromCommit); + List<ChangeSet> revisionIntervalReachableChangesets = new ArrayList<ChangeSet>(); + Set<String> missingParents = new HashSet<String>(); + while (iter.hasNext()) { + String csetId = iter.next(); + ChangeSet cset = revisionIntervalMap.get(csetId); + if (cset != null) { + revisionIntervalReachableChangesets.add(cset); + } else { + missingParents.add(csetId); + } + } + + if (missingParents.isEmpty()) { + Collections.reverse(revisionIntervalReachableChangesets); + return revisionIntervalReachableChangesets; + } + Pair<List<ChangeSet>, Integer> commitsWithoutFiles = getCommitsWithoutFiles(fromCommit, toCommit); List<ChangeSet> csetsWithoutFiles = commitsWithoutFiles.first; Integer minRevNum = commitsWithoutFiles.second; if (csetsWithoutFiles.isEmpty()) - return csetsWithoutFiles; - List<ChangeSet> commitsWithFiles = getRevisionsBetween(minRevNum, toCommit); + return revisionIntervalCsets; + List<ChangeSet> commitsWithFiles = getRevisionsBetween(minRevNum, fromCommit); Map<String, ChangeSet> csetMap = getChangesetMap(commitsWithFiles); + csetMap.putAll(revisionIntervalMap); List<ChangeSet> result = new ArrayList<ChangeSet>(); for (ChangeSet cset : csetsWithoutFiles) { ChangeSet csetWithFiles = csetMap.get(cset.getId()); @@ -50,7 +74,7 @@ @NotNull private Pair<List<ChangeSet>, Integer> getCommitsWithoutFiles(@NotNull String fromCommit, @NotNull String toCommit) throws VcsException { - List<ChangeSet> csets = getRevisionsReachableFrom(toCommit); + List<ChangeSet> csets = getAllHistoryUpTo(toCommit); Map<String, ChangeSet> csetsMap = getChangesetMap(csets); if (csetsMap.containsKey(fromCommit)) { DAG<String> dag = DAGs.createFromEdges(getEdges(csets)); @@ -76,6 +100,7 @@ } + //csetId -> cset private Map<String, ChangeSet> getChangesetMap(@NotNull final List<ChangeSet> csets) { Map<String, ChangeSet> result = new HashMap<String, ChangeSet>(csets.size()); for (ChangeSet cset : csets) { @@ -85,7 +110,7 @@ } - private List<ChangeSet> getRevisionsReachableFrom(@NotNull final String revision) throws VcsException { + private List<ChangeSet> getAllHistoryUpTo(@NotNull final String revision) throws VcsException { return myRepo.log() .fromRevision(revision) .toRevision("0") @@ -95,6 +120,14 @@ } + private List<ChangeSet> getRevisionsBetween(@NotNull String fromCommit, @NotNull String toCommit) throws VcsException { + return myRepo.log() + .fromRevision(toCommit) + .toRevision(fromCommit) + .showCommitsFromAllBranches() + .call(); + } + private List<ChangeSet> getRevisionsBetween(int fromRevNum, @NotNull String toCommit) throws VcsException { return myRepo.log() .fromRevision(toCommit)
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Wed Jul 04 21:36:43 2012 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Fri Jul 06 21:26:25 2012 +0400 @@ -3,6 +3,8 @@ import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.HashSet; +import java.util.Set; /** * @author dmitry.neverov @@ -40,6 +42,11 @@ public boolean dontUseRevsets() { return myDontUseRevsets; } + + @NotNull + public Set<Long> getRevsetParentRootIds() { + return new HashSet<Long>(); + } }; }