comparison 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
comparison
equal deleted inserted replaced
11580:69248b5add46 11581:4530b3307fb9
1 # wireproto.py - generic wire protocol support functions
2 #
3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
4 #
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
7
8 from i18n import _
9 from node import bin, hex
10 import urllib
11 import pushkey as pushkey_
12
13 def dispatch(repo, proto, command):
14 if command not in commands:
15 return False
16 func, spec = commands[command]
17 args = proto.getargs(spec)
18 proto.respond(func(repo, *args))
19 return True
20
21 def between(repo, pairs):
22 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
23 r = []
24 for b in repo.between(pairs):
25 r.append(" ".join(map(hex, b)) + "\n")
26 return "".join(r)
27
28 def branchmap(repo):
29 branchmap = repo.branchmap()
30 heads = []
31 for branch, nodes in branchmap.iteritems():
32 branchname = urllib.quote(branch)
33 branchnodes = [hex(node) for node in nodes]
34 heads.append('%s %s' % (branchname, ' '.join(branchnodes)))
35 return '\n'.join(heads)
36
37 def branches(repo, nodes):
38 nodes = map(bin, nodes.split(" "))
39 r = []
40 for b in repo.branches(nodes):
41 r.append(" ".join(map(hex, b)) + "\n")
42 return "".join(r)
43
44 def heads(repo):
45 h = repo.heads()
46 return " ".join(map(hex, h)) + "\n"
47
48 def listkeys(repo, namespace):
49 d = pushkey_.list(repo, namespace).items()
50 t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
51 v.encode('string-escape')) for k, v in d])
52 return t
53
54 def lookup(repo, key):
55 try:
56 r = hex(repo.lookup(key))
57 success = 1
58 except Exception, inst:
59 r = str(inst)
60 success = 0
61 return "%s %s\n" % (success, r)
62
63 def pushkey(repo, namespace, key, old, new):
64 r = pushkey_.push(repo, namespace, key, old, new)
65 return '%s\n' % int(r)
66
67 commands = {
68 'between': (between, 'pairs'),
69 'branchmap': (branchmap, ''),
70 'branches': (branches, 'nodes'),
71 'heads': (heads, ''),
72 'listkeys': (listkeys, 'namespace'),
73 'lookup': (lookup, 'key'),
74 'pushkey': (pushkey, 'namespace key old new'),
75 }