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 * |
8 from node import * |
9 from remoterepo import * |
9 from remoterepo import * |
10 from i18n import _ |
10 from i18n import _ |
11 import hg, os, re, stat, util |
11 import repo, os, re, stat, util |
12 |
12 |
13 class sshrepository(remoterepository): |
13 class sshrepository(remoterepository): |
14 def __init__(self, ui, path, create=0): |
14 def __init__(self, ui, path, create=0): |
15 self._url = path |
15 self._url = path |
16 self.ui = ui |
16 self.ui = ui |
17 |
17 |
18 m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path) |
18 m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path) |
19 if not m: |
19 if not m: |
20 self.raise_(hg.RepoError(_("couldn't parse location %s") % path)) |
20 self.raise_(repo.RepoError(_("couldn't parse location %s") % path)) |
21 |
21 |
22 self.user = m.group(2) |
22 self.user = m.group(2) |
23 self.host = m.group(3) |
23 self.host = m.group(3) |
24 self.port = m.group(5) |
24 self.port = m.group(5) |
25 self.path = m.group(7) or "." |
25 self.path = m.group(7) or "." |
35 cmd = cmd % (sshcmd, args, remotecmd, self.path) |
35 cmd = cmd % (sshcmd, args, remotecmd, self.path) |
36 |
36 |
37 ui.note('running %s\n' % cmd) |
37 ui.note('running %s\n' % cmd) |
38 res = os.system(cmd) |
38 res = os.system(cmd) |
39 if res != 0: |
39 if res != 0: |
40 self.raise_(hg.RepoError(_("could not create remote repo"))) |
40 self.raise_(repo.RepoError(_("could not create remote repo"))) |
41 |
41 |
42 self.validate_repo(ui, sshcmd, args, remotecmd) |
42 self.validate_repo(ui, sshcmd, args, remotecmd) |
43 |
43 |
44 def url(self): |
44 def url(self): |
45 return self._url |
45 return self._url |
134 d = self.call("lookup", key=key) |
134 d = self.call("lookup", key=key) |
135 success, data = d[:-1].split(" ", 1) |
135 success, data = d[:-1].split(" ", 1) |
136 if int(success): |
136 if int(success): |
137 return bin(data) |
137 return bin(data) |
138 else: |
138 else: |
139 self.raise_(hg.RepoError(data)) |
139 self.raise_(repo.RepoError(data)) |
140 |
140 |
141 def heads(self): |
141 def heads(self): |
142 d = self.call("heads") |
142 d = self.call("heads") |
143 try: |
143 try: |
144 return map(bin, d[:-1].split(" ")) |
144 return map(bin, d[:-1].split(" ")) |
173 return self.do_cmd("changegroupsubset", bases=bases, heads=heads) |
173 return self.do_cmd("changegroupsubset", bases=bases, heads=heads) |
174 |
174 |
175 def unbundle(self, cg, heads, source): |
175 def unbundle(self, cg, heads, source): |
176 d = self.call("unbundle", heads=' '.join(map(hex, heads))) |
176 d = self.call("unbundle", heads=' '.join(map(hex, heads))) |
177 if d: |
177 if d: |
178 self.raise_(hg.RepoError(_("push refused: %s") % d)) |
178 self.raise_(repo.RepoError(_("push refused: %s") % d)) |
179 |
179 |
180 while 1: |
180 while 1: |
181 d = cg.read(4096) |
181 d = cg.read(4096) |
182 if not d: break |
182 if not d: break |
183 self.pipeo.write(str(len(d)) + '\n') |
183 self.pipeo.write(str(len(d)) + '\n') |