##// END OF EJS Templates
protocol: introduce wireproto.py...
Matt Mackall -
r11581:4530b330 default
parent child Browse files
Show More
@@ -0,0 +1,75
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 }
@@ -8,7 +8,7
8
8
9 from i18n import _
9 from i18n import _
10 from node import bin, hex
10 from node import bin, hex
11 import streamclone, util, hook, pushkey
11 import streamclone, util, hook, pushkey, wireproto
12 import os, sys, tempfile, urllib, copy
12 import os, sys, tempfile, urllib, copy
13
13
14 class sshserver(object):
14 class sshserver(object):
@@ -69,7 +69,7 class sshserver(object):
69
69
70 def serve_one(self):
70 def serve_one(self):
71 cmd = self.fin.readline()[:-1]
71 cmd = self.fin.readline()[:-1]
72 if cmd:
72 if cmd and not wireproto.dispatch(self.repo, self, cmd):
73 impl = getattr(self, 'do_' + cmd, None)
73 impl = getattr(self, 'do_' + cmd, None)
74 if impl:
74 if impl:
75 r = impl()
75 r = impl()
@@ -78,29 +78,6 class sshserver(object):
78 else: self.respond("")
78 else: self.respond("")
79 return cmd != ''
79 return cmd != ''
80
80
81 def do_lookup(self):
82 key = self.getarg('key')
83 try:
84 r = hex(self.repo.lookup(key))
85 success = 1
86 except Exception, inst:
87 r = str(inst)
88 success = 0
89 return "%s %s\n" % (success, r)
90
91 def do_branchmap(self):
92 branchmap = self.repo.branchmap()
93 heads = []
94 for branch, nodes in branchmap.iteritems():
95 branchname = urllib.quote(branch)
96 branchnodes = [hex(node) for node in nodes]
97 heads.append('%s %s' % (branchname, ' '.join(branchnodes)))
98 return '\n'.join(heads)
99
100 def do_heads(self):
101 h = self.repo.heads()
102 return " ".join(map(hex, h)) + "\n"
103
104 def do_hello(self):
81 def do_hello(self):
105 '''the hello command returns a set of lines describing various
82 '''the hello command returns a set of lines describing various
106 interesting things about the server, in an RFC822-like format.
83 interesting things about the server, in an RFC822-like format.
@@ -128,22 +105,6 class sshserver(object):
128 self.lock = None
105 self.lock = None
129 return ""
106 return ""
130
107
131 def do_branches(self):
132 nodes = self.getarg('nodes')
133 nodes = map(bin, nodes.split(" "))
134 r = []
135 for b in self.repo.branches(nodes):
136 r.append(" ".join(map(hex, b)) + "\n")
137 return "".join(r)
138
139 def do_between(self):
140 pairs = self.getarg('pairs')
141 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
142 r = []
143 for b in self.repo.between(pairs):
144 r.append(" ".join(map(hex, b)) + "\n")
145 return "".join(r)
146
147 def do_changegroup(self):
108 def do_changegroup(self):
148 nodes = []
109 nodes = []
149 roots = self.getarg('roots')
110 roots = self.getarg('roots')
@@ -244,15 +205,3 class sshserver(object):
244 except streamclone.StreamException, inst:
205 except streamclone.StreamException, inst:
245 self.fout.write(str(inst))
206 self.fout.write(str(inst))
246 self.fout.flush()
207 self.fout.flush()
247
248 def do_pushkey(self):
249 namespace, key, old, new = self.getargs('namespace key old new')
250 r = pushkey.push(self.repo, namespace, key, old, new)
251 return '%s\n' % int(r)
252
253 def do_listkeys(self):
254 namespace = self.getarg('namespace')
255 d = pushkey.list(self.repo, namespace).items()
256 t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
257 v.encode('string-escape')) for k, v in d])
258 return t
General Comments 0
You need to be logged in to leave comments. Login now