[PATCH 1 of 3] pull: pre-filter remote phases before moving local ones
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Thu Aug 7 02:19:01 UTC 2014
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1407311677 25200
# Wed Aug 06 00:54:37 2014 -0700
# Node ID 868752444f3b8a350bd7a64ecd55d239335578c2
# Parent 793f9276aeb9c78366c205ac0351867c72b27595
pull: pre-filter remote phases before moving local ones
We were relying on the phase internal to filter out redundant phase information
from remove. However as we plan to integrate phases movement inside the
transaction, we want to avoid useless transaction creation on no-op pull.
Therefor we filter out all the information that already match the current
repository state. This will let us create a transaction only when there is
actual phase movement needed.
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -825,18 +825,31 @@ def _pullapplyphases(pullop, remotephase
if remotephases and not publishing:
# remote is new and unpublishing
pheads, _dr = phases.analyzeremotephases(pullop.repo,
pullop.pulledsubset,
remotephases)
- phases.advanceboundary(pullop.repo, phases.public, pheads)
- phases.advanceboundary(pullop.repo, phases.draft,
- pullop.pulledsubset)
+ dheads = pullop.pulledsubset
else:
# Remote is old or publishing all common changesets
# should be seen as public
- phases.advanceboundary(pullop.repo, phases.public,
- pullop.pulledsubset)
+ pheads = pullop.pulledsubset
+ dheads = []
+ unfi = pullop.repo.unfiltered()
+ phase = unfi._phasecache.phase
+ rev = unfi.changelog.nodemap.get
+ public = phases.public
+ draft = phases.draft
+
+ # exclude changesets already public locally and update the others
+ pheads = [pn for pn in pheads if phase(unfi, rev(pn)) > public]
+ if pheads:
+ phases.advanceboundary(pullop.repo, public, pheads)
+
+ # exclude changesets already draft locally and update the others
+ dheads = [pn for pn in dheads if phase(unfi, rev(pn)) > draft]
+ if dheads:
+ phases.advanceboundary(pullop.repo, draft, dheads)
def _pullobsolete(pullop):
"""utility function to pull obsolete markers from a remote
The `gettransaction` is function that return the pull transaction, creating
More information about the Mercurial-devel
mailing list