# HG changeset patch # User Pierre-Yves David # Date 1510697718 -3600 # Node ID 68aeeb4d4b8f81a3e9159de1aa74c6285d377f20 # Parent 9d9ff55d1bb1d48a994784f7e5d242f3d6e882b9# Parent 1b58e0121689be2361df081b6ab5dcc017581098 test-compat: merge stable into mercurial-4.3 diff -r 1b58e0121689 -r 68aeeb4d4b8f hgext3rd/evolve/__init__.py --- a/hgext3rd/evolve/__init__.py Tue Nov 07 13:05:37 2017 +0100 +++ b/hgext3rd/evolve/__init__.py Tue Nov 14 23:15:18 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) diff -r 1b58e0121689 -r 68aeeb4d4b8f hgext3rd/evolve/serveronly.py --- a/hgext3rd/evolve/serveronly.py Tue Nov 07 13:05:37 2017 +0100 +++ b/hgext3rd/evolve/serveronly.py Tue Nov 14 23:15:18 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) diff -r 1b58e0121689 -r 68aeeb4d4b8f hgext3rd/topic/discovery.py --- a/hgext3rd/topic/discovery.py Tue Nov 07 13:05:37 2017 +0100 +++ b/hgext3rd/topic/discovery.py Tue Nov 14 23:15:18 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__ diff -r 1b58e0121689 -r 68aeeb4d4b8f tests/test-evolve-serveronly-legacy.t diff -r 1b58e0121689 -r 68aeeb4d4b8f tests/test-wireproto.t --- a/tests/test-wireproto.t Tue Nov 07 13:05:37 2017 +0100 +++ b/tests/test-wireproto.t Tue Nov 14 23:15:18 2017 +0100 @@ -204,8 +204,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: 376 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