Mercurial > public > mercurial-scm > hg
diff mercurial/wireproto.py @ 11581:4530b3307fb9
protocol: introduce wireproto.py
- add a protocol-independent dispatcher
- move most of the basic commands from sshserver to wireproto
- dispatch through wireproto first
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 14 Jul 2010 15:25:15 -0500 |
parents | |
children | 944c23762c3c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/wireproto.py Wed Jul 14 15:25:15 2010 -0500 @@ -0,0 +1,75 @@ +# wireproto.py - generic wire protocol support functions +# +# Copyright 2005-2010 Matt Mackall <mpm@selenic.com> +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +from i18n import _ +from node import bin, hex +import urllib +import pushkey as pushkey_ + +def dispatch(repo, proto, command): + if command not in commands: + return False + func, spec = commands[command] + args = proto.getargs(spec) + proto.respond(func(repo, *args)) + return True + +def between(repo, pairs): + pairs = [map(bin, p.split("-")) for p in pairs.split(" ")] + r = [] + for b in repo.between(pairs): + r.append(" ".join(map(hex, b)) + "\n") + return "".join(r) + +def branchmap(repo): + branchmap = repo.branchmap() + heads = [] + for branch, nodes in branchmap.iteritems(): + branchname = urllib.quote(branch) + branchnodes = [hex(node) for node in nodes] + heads.append('%s %s' % (branchname, ' '.join(branchnodes))) + return '\n'.join(heads) + +def branches(repo, nodes): + nodes = map(bin, nodes.split(" ")) + r = [] + for b in repo.branches(nodes): + r.append(" ".join(map(hex, b)) + "\n") + return "".join(r) + +def heads(repo): + h = repo.heads() + return " ".join(map(hex, h)) + "\n" + +def listkeys(repo, namespace): + d = pushkey_.list(repo, namespace).items() + t = '\n'.join(['%s\t%s' % (k.encode('string-escape'), + v.encode('string-escape')) for k, v in d]) + return t + +def lookup(repo, key): + try: + r = hex(repo.lookup(key)) + success = 1 + except Exception, inst: + r = str(inst) + success = 0 + return "%s %s\n" % (success, r) + +def pushkey(repo, namespace, key, old, new): + r = pushkey_.push(repo, namespace, key, old, new) + return '%s\n' % int(r) + +commands = { + 'between': (between, 'pairs'), + 'branchmap': (branchmap, ''), + 'branches': (branches, 'nodes'), + 'heads': (heads, ''), + 'listkeys': (listkeys, 'namespace'), + 'lookup': (lookup, 'key'), + 'pushkey': (pushkey, 'namespace key old new'), +}