Mercurial > hg > mercurial
changeset 457:33b9aab523af Faradi-7.0.x
Optimize changes calculation
When revsets are not used first try to calculate changes in revisions interval. Build whole history graph only when some parent is not included in interval.
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Thu, 05 Jul 2012 20:52:02 +0400 |
parents | f9bf9ec48347 |
children | 1725588ec4f6 |
files | mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java |
diffstat | 1 files changed, 35 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Thu Jul 05 19:07:01 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Thu Jul 05 20:52:02 2012 +0400 @@ -31,13 +31,35 @@ @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()) + 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 +72,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 +98,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 +108,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 +118,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)