# HG changeset patch # User Pierre-Yves David # Date 2014-08-06 07:54:37 # Node ID d34058dd3246d739dcaed569da2b5afc6d2eebe3 # Parent 14306a686e711fdefb8ef0cfaddff3ecc3bb6bfb pull: pre-filter remote phases before moving local ones We were relying on the phase internals to filter out redundant phase information from remove. However as we plan to integrate phase movement inside the transaction, we want to avoid useless transaction creation on no-op pulls. Therefore we filter out all the information that already matches 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,14 +825,27 @@ def _pullapplyphases(pullop, remotephase 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