Mercurial > public > mercurial-scm > hg
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) |