Mercurial > hg
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 } |