--- a/hgext3rd/evolve/__init__.py Tue Nov 07 13:05:38 2017 +0100
+++ b/hgext3rd/evolve/__init__.py Tue Nov 14 23:15:19 2017 +0100
@@ -416,10 +416,10 @@
def _configureoptions(ui, repo):
# If no capabilities are specified, enable everything.
# This is so existing evolve users don't need to change their config.
- evolveopts = ui.configlist('experimental', 'evolution')
+ evolveopts = repo.ui.configlist('experimental', 'evolution')
if not evolveopts:
evolveopts = ['all']
- ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
+ repo.ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
if obsolete.isenabled(repo, 'exchange'):
repo.ui.setconfig('server', 'bundle1', False)
--- a/hgext3rd/evolve/serveronly.py Tue Nov 07 13:05:38 2017 +0100
+++ b/hgext3rd/evolve/serveronly.py Tue Nov 14 23:15:19 2017 +0100
@@ -53,9 +53,9 @@
@eh.reposetup
def default2evolution(ui, repo):
- evolveopts = ui.configlist('experimental', 'evolution')
+ evolveopts = repo.ui.configlist('experimental', 'evolution')
if not evolveopts:
evolveopts = 'all'
- ui.setconfig('experimental', 'evolution', evolveopts)
+ repo.ui.setconfig('experimental', 'evolution', evolveopts)
if obsolete.isenabled(repo, 'exchange'):
repo.ui.setconfig('server', 'bundle1', False)
--- a/hgext3rd/topic/discovery.py Tue Nov 07 13:05:38 2017 +0100
+++ b/hgext3rd/topic/discovery.py Tue Nov 14 23:15:19 2017 +0100
@@ -1,5 +1,6 @@
from __future__ import absolute_import
+import collections
import weakref
from mercurial.i18n import _
@@ -15,6 +16,7 @@
def _headssummary(orig, *args):
# In mercurial < 4.2, we receive repo, remote and outgoing as arguments
+ pushop = None
if len(args) == 3:
pushoparg = False
repo, remote, outgoing = args
@@ -31,17 +33,51 @@
publishing = ('phases' not in remote.listkeys('namespaces')
or bool(remote.listkeys('phases').get('publishing', False)))
- if publishing or not remote.capable('topics'):
+ if ((publishing or not remote.capable('topics'))
+ and not getattr(pushop, 'publish', False)):
return orig(*args)
+ publishedset = ()
+ remotebranchmap = None
+ origremotebranchmap = remote.branchmap
+ # < hg-4.4 do not have a --publish flag anyway
+ if pushoparg and util.safehasattr(pushop, 'remotephases'):
+ publishednode = [c.node() for c in pushop.outdatedphases]
+ publishedset = repo.revs('ancestors(%ln + %ln)',
+ publishednode,
+ pushop.remotephases.publicheads)
+
+ rev = repo.unfiltered().changelog.nodemap.get
+
+ def remotebranchmap():
+ # drop topic information from changeset about to be published
+ result = collections.defaultdict(list)
+ for branch, heads in origremotebranchmap().iteritems():
+ if ':' not in branch:
+ result[branch].extend(heads)
+ else:
+ namedbranch = branch.split(':', 1)[0]
+ for h in heads:
+ r = rev(h)
+ if r is not None and r in publishedset:
+ result[namedbranch].append(h)
+ else:
+ result[branch].append(h)
+ for heads in result.itervalues():
+ heads.sort()
+ return result
+
class repocls(repo.__class__):
# awful hack to see branch as "branch:topic"
def __getitem__(self, key):
ctx = super(repocls, self).__getitem__(key)
oldbranch = ctx.branch
+ rev = ctx.rev()
def branch():
branch = oldbranch()
+ if rev in publishedset:
+ return branch
topic = ctx.topic()
if topic:
branch = "%s:%s" % (branch, topic)
@@ -56,6 +92,8 @@
def branchinfo(rev):
branch, close = changelog.branchinfo(rev)
+ if rev in publishedset:
+ return branch, close
topic = repo[rev].topic()
if topic:
branch = "%s:%s" % (branch, topic)
@@ -67,6 +105,8 @@
oldrepocls = repo.__class__
try:
repo.__class__ = repocls
+ if remotebranchmap is not None:
+ remote.branchmap = remotebranchmap
unxx = repo.filtered('unfiltered-topic')
repo.unfiltered = lambda: unxx
if pushoparg:
@@ -83,6 +123,8 @@
if 'unfiltered' in vars(repo):
del repo.unfiltered
repo.__class__ = oldrepocls
+ if remotebranchmap is not None:
+ remote.branchmap = origremotebranchmap
def wireprotobranchmap(orig, repo, proto):
oldrepo = repo.__class__
--- a/tests/test-wireproto.t Tue Nov 07 13:05:38 2017 +0100
+++ b/tests/test-wireproto.t Tue Nov 14 23:15:19 2017 +0100
@@ -200,8 +200,45 @@
abort: unexpected response: empty string
[255]
+(do some extra pulling to be sure)
+
+ $ hg -R client pull http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ obsmarker-exchange: 377 bytes received
+
+ $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+ $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers --config extensions.evolve='!'
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
But we do let it goes fine on repository with exchange disabled:
$ $RUNTESTDIR/killdaemons.py $DAEMON_PIDS
$ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log --config experimental.evolution='!'
$ hg debugpushkey http://localhost:$HGPORT/ obsolete
+
+(do some extra pulling to be sure)
+
+ $ hg -R client pull http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+ $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+ $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers --config extensions.evolve='!'
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+ $ $RUNTESTDIR/killdaemons.py $DAEMON_PIDS