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):