equal
deleted
inserted
replaced
5 # This software may be used and distributed according to the terms |
5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 from node import bin, hex |
8 from node import bin, hex |
9 from i18n import _ |
9 from i18n import _ |
10 import repo, os, re, util |
10 import repo, os, re, util, error |
11 |
11 |
12 class remotelock(object): |
12 class remotelock(object): |
13 def __init__(self, repo): |
13 def __init__(self, repo): |
14 self.repo = repo |
14 self.repo = repo |
15 def release(self): |
15 def release(self): |
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_(repo.RepoError(_("couldn't parse location %s") % path)) |
29 self.raise_(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_(repo.RepoError(_("could not create remote repo"))) |
48 self.raise_(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 |
76 if l: |
76 if l: |
77 ui.debug(_("remote: "), l) |
77 ui.debug(_("remote: "), l) |
78 lines.append(l) |
78 lines.append(l) |
79 max_noise -= 1 |
79 max_noise -= 1 |
80 else: |
80 else: |
81 self.raise_(repo.RepoError(_("no suitable response from remote hg"))) |
81 self.raise_(error.RepoError(_("no suitable response from remote hg"))) |
82 |
82 |
83 self.capabilities = util.set() |
83 self.capabilities = util.set() |
84 lines.reverse() |
84 lines.reverse() |
85 for l in lines: |
85 for l in lines: |
86 if l.startswith("capabilities:"): |
86 if l.startswith("capabilities:"): |
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_(repo.RepoError(data)) |
160 self.raise_(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(" ")) |
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_(repo.RepoError(_("push refused: %s") % d)) |
201 self.raise_(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_(repo.RepoError(_("push failed: %s") % r)) |
214 self.raise_(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_(util.UnexpectedOutput(_("unexpected response:"), r)) |
220 self.raise_(util.UnexpectedOutput(_("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_(repo.RepoError(_("push refused: %s") % d)) |
225 self.raise_(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) |