Mercurial > public > mercurial-scm > hg-stable
diff mercurial/exchange.py @ 22350:6d113cc7a31a
push: only push obsmarkers relevant to the "pushed subset"
We should only exchange obsolete markers related to the changesets
that are being exchanged. For example, if `A'` is a successor of `A`,
we do not want to push the marker if we are not exchanging
`A'`. Otherwise `A` would disappear without a successor, leading to confusion
for both users and the evolution mechanism.
Therefore we now exchange only the markers relevant to the subset of nodes
involved in the push (the nodes themselves may be already common but were
selected by --rev (or the lack of --rev)).
Note that all selected markers are still exchanged on each push. We do
not have a discovery protocol for markers in core yet. Such discovery
would save us the exchange of markers known on both side.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 20 Aug 2014 01:15:09 -0700 |
parents | 7198cb9b56b9 |
children | dc371d1f0de1 |
line wrap: on
line diff
--- a/mercurial/exchange.py Wed Aug 20 19:47:35 2014 -0700 +++ b/mercurial/exchange.py Wed Aug 20 01:15:09 2014 -0700 @@ -297,7 +297,11 @@ if (obsolete._enabled and pushop.repo.obsstore and 'obsolete' in pushop.remote.listkeys('namespaces')): - pushop.outobsmarkers = pushop.repo.obsstore + repo = pushop.repo + # very naive computation, that can be quite expensive on big repo. + # However: evolution is currently slow on them anyway. + nodes = (c.node() for c in repo.set('::%ln', pushop.futureheads)) + pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes) @pushdiscovery('bookmarks') def _pushdiscoverybookmarks(pushop): @@ -680,7 +684,7 @@ repo = pushop.repo remote = pushop.remote pushop.stepsdone.add('obsmarkers') - if (pushop.outobsmarkers): + if pushop.outobsmarkers: rslts = [] remotedata = obsolete._pushkeyescape(pushop.outobsmarkers) for key in sorted(remotedata, reverse=True):