Mercurial > evolve
diff src/topic/discovery.py @ 1886:0504e76bfbd9
push: allow pushing new topic to non-publishing server by default
This improves and fix the behavior change introduced by the new "topicmap".
* Topics are properly ignored when pushing to a publishing server,
* pushing new topics is allowed without --force a non-publishing server,
* Pushing extra heads on a topic requires --force.
Create of new head on a branch by phase movement is not properly detected for
now. We'll improve that part in a later changesets.
There is more awful monkey patching going on. We'll have to refactor core to get
rid of them.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Sat, 12 Mar 2016 18:19:27 +0000 |
parents | |
children | 68125d026b07 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/topic/discovery.py Sat Mar 12 18:19:27 2016 +0000 @@ -0,0 +1,51 @@ +from mercurial import branchmap +from . import topicmap + +def _headssummary(orig, repo, remote, outgoing): + publishing = ('phases' not in remote.listkeys('namespaces') + or bool(remote.listkeys('phases').get('publishing', False))) + if publishing: + return orig(repo, remote, outgoing) + oldgetitem = repo.__getitem__ + oldrepo = repo.__class__ + oldbranchcache = branchmap.branchcache + oldfilename = branchmap._filename + try: + class repocls(repo.__class__): + def __getitem__(self, key): + ctx = super(repocls, self).__getitem__(key) + oldbranch = ctx.branch + def branch(): + branch = oldbranch() + topic = ctx.topic() + if topic: + branch = "%s:%s" % (branch, topic) + return branch + ctx.branch = branch + return ctx + repo.__class__ = repocls + branchmap.branchcache = topicmap.topiccache + branchmap._filename = topicmap._filename + summary = orig(repo, remote, outgoing) + for key, value in summary.iteritems(): + if ':' in key: # This is a topic + if value[0] is None and value[1]: + summary[key] = ([value[1].pop(0)], ) + value[1:] + return summary + finally: + repo.__class__ = oldrepo + branchmap.branchcache = oldbranchcache + branchmap._filename = oldfilename + +def wireprotobranchmap(orig, repo, proto): + oldrepo = repo.__class__ + print repo + try: + class repocls(repo.__class__): + def branchmap(self): + usetopic = not self.publishing() + return super(repocls, self).branchmap(topic=usetopic) + repo.__class__ = repocls + return orig(repo, proto) + finally: + repo.__class__ = oldrepo