24 self._url = path |
24 self._url = path |
25 self.ui = ui |
25 self.ui = ui |
26 |
26 |
27 m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path) |
27 m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path) |
28 if not m: |
28 if not m: |
29 self.raise_(error.RepoError(_("couldn't parse location %s") % path)) |
29 self.abort(error.RepoError(_("couldn't parse location %s") % path)) |
30 |
30 |
31 self.user = m.group(2) |
31 self.user = m.group(2) |
32 self.host = m.group(3) |
32 self.host = m.group(3) |
33 self.port = m.group(5) |
33 self.port = m.group(5) |
34 self.path = m.group(7) or "." |
34 self.path = m.group(7) or "." |
43 cmd = cmd % (sshcmd, args, remotecmd, self.path) |
43 cmd = cmd % (sshcmd, args, remotecmd, self.path) |
44 |
44 |
45 ui.note(_('running %s\n') % cmd) |
45 ui.note(_('running %s\n') % cmd) |
46 res = util.system(cmd) |
46 res = util.system(cmd) |
47 if res != 0: |
47 if res != 0: |
48 self.raise_(error.RepoError(_("could not create remote repo"))) |
48 self.abort(error.RepoError(_("could not create remote repo"))) |
49 |
49 |
50 self.validate_repo(ui, sshcmd, args, remotecmd) |
50 self.validate_repo(ui, sshcmd, args, remotecmd) |
51 |
51 |
52 def url(self): |
52 def url(self): |
53 return self._url |
53 return self._url |
130 l = self.pipei.readline() |
130 l = self.pipei.readline() |
131 self.readerr() |
131 self.readerr() |
132 try: |
132 try: |
133 l = int(l) |
133 l = int(l) |
134 except: |
134 except: |
135 self.raise_(error.ResponseError(_("unexpected response:"), l)) |
135 self.abort(error.ResponseError(_("unexpected response:"), l)) |
136 return self.pipei.read(l) |
136 return self.pipei.read(l) |
137 |
137 |
138 def _send(self, data, flush=False): |
138 def _send(self, data, flush=False): |
139 self.pipeo.write("%d\n" % len(data)) |
139 self.pipeo.write("%d\n" % len(data)) |
140 if data: |
140 if data: |
155 d = self.call("lookup", key=key) |
155 d = self.call("lookup", key=key) |
156 success, data = d[:-1].split(" ", 1) |
156 success, data = d[:-1].split(" ", 1) |
157 if int(success): |
157 if int(success): |
158 return bin(data) |
158 return bin(data) |
159 else: |
159 else: |
160 self.raise_(error.RepoError(data)) |
160 self.abort(error.RepoError(data)) |
161 |
161 |
162 def heads(self): |
162 def heads(self): |
163 d = self.call("heads") |
163 d = self.call("heads") |
164 try: |
164 try: |
165 return map(bin, d[:-1].split(" ")) |
165 return map(bin, d[:-1].split(" ")) |
166 except: |
166 except: |
167 self.raise_(error.ResponseError(_("unexpected response:"), d)) |
167 self.abort(error.ResponseError(_("unexpected response:"), d)) |
168 |
168 |
169 def branches(self, nodes): |
169 def branches(self, nodes): |
170 n = " ".join(map(hex, nodes)) |
170 n = " ".join(map(hex, nodes)) |
171 d = self.call("branches", nodes=n) |
171 d = self.call("branches", nodes=n) |
172 try: |
172 try: |
173 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ] |
173 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ] |
174 return br |
174 return br |
175 except: |
175 except: |
176 self.raise_(error.ResponseError(_("unexpected response:"), d)) |
176 self.abort(error.ResponseError(_("unexpected response:"), d)) |
177 |
177 |
178 def between(self, pairs): |
178 def between(self, pairs): |
179 n = " ".join(["-".join(map(hex, p)) for p in pairs]) |
179 n = " ".join(["-".join(map(hex, p)) for p in pairs]) |
180 d = self.call("between", pairs=n) |
180 d = self.call("between", pairs=n) |
181 try: |
181 try: |
182 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ] |
182 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ] |
183 return p |
183 return p |
184 except: |
184 except: |
185 self.raise_(error.ResponseError(_("unexpected response:"), d)) |
185 self.abort(error.ResponseError(_("unexpected response:"), d)) |
186 |
186 |
187 def changegroup(self, nodes, kind): |
187 def changegroup(self, nodes, kind): |
188 n = " ".join(map(hex, nodes)) |
188 n = " ".join(map(hex, nodes)) |
189 return self.do_cmd("changegroup", roots=n) |
189 return self.do_cmd("changegroup", roots=n) |
190 |
190 |
196 |
196 |
197 def unbundle(self, cg, heads, source): |
197 def unbundle(self, cg, heads, source): |
198 d = self.call("unbundle", heads=' '.join(map(hex, heads))) |
198 d = self.call("unbundle", heads=' '.join(map(hex, heads))) |
199 if d: |
199 if d: |
200 # remote may send "unsynced changes" |
200 # remote may send "unsynced changes" |
201 self.raise_(error.RepoError(_("push refused: %s") % d)) |
201 self.abort(error.RepoError(_("push refused: %s") % d)) |
202 |
202 |
203 while 1: |
203 while 1: |
204 d = cg.read(4096) |
204 d = cg.read(4096) |
205 if not d: |
205 if not d: |
206 break |
206 break |
209 self._send("", flush=True) |
209 self._send("", flush=True) |
210 |
210 |
211 r = self._recv() |
211 r = self._recv() |
212 if r: |
212 if r: |
213 # remote may send "unsynced changes" |
213 # remote may send "unsynced changes" |
214 self.raise_(error.RepoError(_("push failed: %s") % r)) |
214 self.abort(error.RepoError(_("push failed: %s") % r)) |
215 |
215 |
216 r = self._recv() |
216 r = self._recv() |
217 try: |
217 try: |
218 return int(r) |
218 return int(r) |
219 except: |
219 except: |
220 self.raise_(error.ResponseError(_("unexpected response:"), r)) |
220 self.abort(error.ResponseError(_("unexpected response:"), r)) |
221 |
221 |
222 def addchangegroup(self, cg, source, url): |
222 def addchangegroup(self, cg, source, url): |
223 d = self.call("addchangegroup") |
223 d = self.call("addchangegroup") |
224 if d: |
224 if d: |
225 self.raise_(error.RepoError(_("push refused: %s") % d)) |
225 self.abort(error.RepoError(_("push refused: %s") % d)) |
226 while 1: |
226 while 1: |
227 d = cg.read(4096) |
227 d = cg.read(4096) |
228 if not d: |
228 if not d: |
229 break |
229 break |
230 self.pipeo.write(d) |
230 self.pipeo.write(d) |