comparison mercurial/sshserver.py @ 11579:c19d7e91cc46

protocol: add ssh getargs - introduce getargs - make getarg a helper function - update users
author Matt Mackall <mpm@selenic.com>
date Mon, 12 Jul 2010 17:28:02 -0500
parents ee1ed6afac21
children 69248b5add46
comparison
equal deleted inserted replaced
11578:bb7af1de5e38 11579:c19d7e91cc46
27 27
28 # Prevent insertion/deletion of CRs 28 # Prevent insertion/deletion of CRs
29 util.set_binary(self.fin) 29 util.set_binary(self.fin)
30 util.set_binary(self.fout) 30 util.set_binary(self.fout)
31 31
32 def getarg(self): 32 def getargs(self, args):
33 argline = self.fin.readline()[:-1] 33 data = {}
34 arg, l = argline.split() 34 keys = args.split()
35 val = self.fin.read(int(l)) 35 count = len(keys)
36 return arg, val 36 for n in xrange(len(keys)):
37 argline = self.fin.readline()[:-1]
38 arg, l = argline.split()
39 val = self.fin.read(int(l))
40 if arg not in keys:
41 raise util.Abort("unexpected parameter %r" % arg)
42 if arg == '*':
43 star = {}
44 for n in xrange(int(l)):
45 arg, l = argline.split()
46 val = self.fin.read(int(l))
47 star[arg] = val
48 data['*'] = star
49 else:
50 data[arg] = val
51 return [data[k] for k in keys]
52
53 def getarg(self, name):
54 return self.getargs(name)[0]
37 55
38 def respond(self, v): 56 def respond(self, v):
39 self.fout.write("%d\n" % len(v)) 57 self.fout.write("%d\n" % len(v))
40 self.fout.write(v) 58 self.fout.write(v)
41 self.fout.flush() 59 self.fout.flush()
57 impl() 75 impl()
58 else: self.respond("") 76 else: self.respond("")
59 return cmd != '' 77 return cmd != ''
60 78
61 def do_lookup(self): 79 def do_lookup(self):
62 arg, key = self.getarg() 80 key = self.getarg('key')
63 assert arg == 'key'
64 try: 81 try:
65 r = hex(self.repo.lookup(key)) 82 r = hex(self.repo.lookup(key))
66 success = 1 83 success = 1
67 except Exception, inst: 84 except Exception, inst:
68 r = str(inst) 85 r = str(inst)
108 self.lock.release() 125 self.lock.release()
109 self.lock = None 126 self.lock = None
110 self.respond("") 127 self.respond("")
111 128
112 def do_branches(self): 129 def do_branches(self):
113 arg, nodes = self.getarg() 130 nodes = self.getarg('nodes')
114 nodes = map(bin, nodes.split(" ")) 131 nodes = map(bin, nodes.split(" "))
115 r = [] 132 r = []
116 for b in self.repo.branches(nodes): 133 for b in self.repo.branches(nodes):
117 r.append(" ".join(map(hex, b)) + "\n") 134 r.append(" ".join(map(hex, b)) + "\n")
118 self.respond("".join(r)) 135 self.respond("".join(r))
119 136
120 def do_between(self): 137 def do_between(self):
121 arg, pairs = self.getarg() 138 pairs = self.getarg('pairs')
122 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")] 139 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
123 r = [] 140 r = []
124 for b in self.repo.between(pairs): 141 for b in self.repo.between(pairs):
125 r.append(" ".join(map(hex, b)) + "\n") 142 r.append(" ".join(map(hex, b)) + "\n")
126 self.respond("".join(r)) 143 self.respond("".join(r))
127 144
128 def do_changegroup(self): 145 def do_changegroup(self):
129 nodes = [] 146 nodes = []
130 arg, roots = self.getarg() 147 roots = self.getarg('roots')
131 nodes = map(bin, roots.split(" ")) 148 nodes = map(bin, roots.split(" "))
132 149
133 cg = self.repo.changegroup(nodes, 'serve') 150 cg = self.repo.changegroup(nodes, 'serve')
134 while True: 151 while True:
135 d = cg.read(4096) 152 d = cg.read(4096)
138 self.fout.write(d) 155 self.fout.write(d)
139 156
140 self.fout.flush() 157 self.fout.flush()
141 158
142 def do_changegroupsubset(self): 159 def do_changegroupsubset(self):
143 argmap = dict([self.getarg(), self.getarg()]) 160 bases, heads = self.getargs('bases heads')
144 bases = [bin(n) for n in argmap['bases'].split(' ')] 161 bases = [bin(n) for n in bases.split(' ')]
145 heads = [bin(n) for n in argmap['heads'].split(' ')] 162 heads = [bin(n) for n in heads.split(' ')]
146 163
147 cg = self.repo.changegroupsubset(bases, heads, 'serve') 164 cg = self.repo.changegroupsubset(bases, heads, 'serve')
148 while True: 165 while True:
149 d = cg.read(4096) 166 d = cg.read(4096)
150 if not d: 167 if not d:
168 def client_url(self): 185 def client_url(self):
169 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] 186 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0]
170 return 'remote:ssh:' + client 187 return 'remote:ssh:' + client
171 188
172 def do_unbundle(self): 189 def do_unbundle(self):
173 their_heads = self.getarg()[1].split() 190 their_heads = self.getarg('heads').split()
174 191
175 def check_heads(): 192 def check_heads():
176 heads = map(hex, self.repo.heads()) 193 heads = map(hex, self.repo.heads())
177 return their_heads == [hex('force')] or their_heads == heads 194 return their_heads == [hex('force')] or their_heads == heads
178 195
225 except streamclone.StreamException, inst: 242 except streamclone.StreamException, inst:
226 self.fout.write(str(inst)) 243 self.fout.write(str(inst))
227 self.fout.flush() 244 self.fout.flush()
228 245
229 def do_pushkey(self): 246 def do_pushkey(self):
230 arg, key = self.getarg() 247 namespace, key, old, new = self.getargs('namespace key old new')
231 arg, namespace = self.getarg()
232 arg, new = self.getarg()
233 arg, old = self.getarg()
234 r = pushkey.push(self.repo, namespace, key, old, new) 248 r = pushkey.push(self.repo, namespace, key, old, new)
235 self.respond('%s\n' % int(r)) 249 self.respond('%s\n' % int(r))
236 250
237 def do_listkeys(self): 251 def do_listkeys(self):
238 arg, namespace = self.getarg() 252 namespace = self.getarg('namespace')
239 d = pushkey.list(self.repo, namespace).items() 253 d = pushkey.list(self.repo, namespace).items()
240 t = '\n'.join(['%s\t%s' % (k.encode('string-escape'), 254 t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
241 v.encode('string-escape')) for k, v in d]) 255 v.encode('string-escape')) for k, v in d])
242 self.respond(t) 256 self.respond(t)