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() |
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) |