Show More
@@ -131,16 +131,40 b' def _cleanuppipes(ui, pipei, pipeo, pipe' | |||
|
131 | 131 | |
|
132 | 132 | pipee.close() |
|
133 | 133 | |
|
134 | def _makeconnection(ui, sshcmd, args, remotecmd, path, sshenv=None): | |
|
135 | """Create an SSH connection to a server. | |
|
136 | ||
|
137 | Returns a tuple of (process, stdin, stdout, stderr) for the | |
|
138 | spawned process. | |
|
139 | """ | |
|
140 | cmd = '%s %s %s' % ( | |
|
141 | sshcmd, | |
|
142 | args, | |
|
143 | util.shellquote('%s -R %s serve --stdio' % ( | |
|
144 | _serverquote(remotecmd), _serverquote(path)))) | |
|
145 | ||
|
146 | ui.debug('running %s\n' % cmd) | |
|
147 | cmd = util.quotecommand(cmd) | |
|
148 | ||
|
149 | # no buffer allow the use of 'select' | |
|
150 | # feel free to remove buffering and select usage when we ultimately | |
|
151 | # move to threading. | |
|
152 | stdin, stdout, stderr, proc = util.popen4(cmd, bufsize=0, env=sshenv) | |
|
153 | ||
|
154 | stdout = doublepipe(ui, util.bufferedinputpipe(stdout), stderr) | |
|
155 | stdin = doublepipe(ui, stdin, stderr) | |
|
156 | ||
|
157 | return proc, stdin, stdout, stderr | |
|
158 | ||
|
134 | 159 | class sshpeer(wireproto.wirepeer): |
|
135 | 160 | def __init__(self, ui, path, create=False, sshstate=None): |
|
136 | 161 | self._url = path |
|
137 | 162 | self._ui = ui |
|
138 | self._pipeo = self._pipei = self._pipee = None | |
|
163 | # self._subprocess is unused. Keeping a handle on the process | |
|
164 | # holds a reference and prevents it from being garbage collected. | |
|
165 | self._subprocess, self._pipei, self._pipeo, self._pipee = sshstate | |
|
139 | 166 | |
|
140 | u = util.url(path, parsequery=False, parsefragment=False) | |
|
141 | self._path = u.path or '.' | |
|
142 | ||
|
143 | self._validaterepo(*sshstate) | |
|
167 | self._validaterepo() | |
|
144 | 168 | |
|
145 | 169 | # Begin of _basepeer interface. |
|
146 | 170 | |
@@ -172,28 +196,7 b' class sshpeer(wireproto.wirepeer):' | |||
|
172 | 196 | |
|
173 | 197 | # End of _basewirecommands interface. |
|
174 | 198 | |
|
175 | def _validaterepo(self, sshcmd, args, remotecmd, sshenv=None): | |
|
176 | assert self._pipei is None | |
|
177 | ||
|
178 | cmd = '%s %s %s' % (sshcmd, args, | |
|
179 | util.shellquote("%s -R %s serve --stdio" % | |
|
180 | (_serverquote(remotecmd), _serverquote(self._path)))) | |
|
181 | self.ui.debug('running %s\n' % cmd) | |
|
182 | cmd = util.quotecommand(cmd) | |
|
183 | ||
|
184 | # while self._subprocess isn't used, having it allows the subprocess to | |
|
185 | # to clean up correctly later | |
|
186 | # | |
|
187 | # no buffer allow the use of 'select' | |
|
188 | # feel free to remove buffering and select usage when we ultimately | |
|
189 | # move to threading. | |
|
190 | sub = util.popen4(cmd, bufsize=0, env=sshenv) | |
|
191 | self._pipeo, self._pipei, self._pipee, self._subprocess = sub | |
|
192 | ||
|
193 | self._pipei = util.bufferedinputpipe(self._pipei) | |
|
194 | self._pipei = doublepipe(self.ui, self._pipei, self._pipee) | |
|
195 | self._pipeo = doublepipe(self.ui, self._pipeo, self._pipee) | |
|
196 | ||
|
199 | def _validaterepo(self): | |
|
197 | 200 | def badresponse(): |
|
198 | 201 | msg = _("no suitable response from remote hg") |
|
199 | 202 | hint = self.ui.config("ui", "ssherrorhint") |
@@ -380,6 +383,9 b' def instance(ui, path, create):' | |||
|
380 | 383 | if res != 0: |
|
381 | 384 | raise error.RepoError(_('could not create remote repo')) |
|
382 | 385 | |
|
383 | sshstate = (sshcmd, args, remotecmd, sshenv) | |
|
386 | proc, stdin, stdout, stderr = _makeconnection(ui, sshcmd, args, remotecmd, | |
|
387 | remotepath, sshenv) | |
|
388 | ||
|
389 | sshstate = (proc, stdout, stdin, stderr) | |
|
384 | 390 | |
|
385 | 391 | return sshpeer(ui, path, create=create, sshstate=sshstate) |
@@ -69,7 +69,8 b' def main():' | |||
|
69 | 69 | checkobject(badpeer()) |
|
70 | 70 | checkobject(httppeer.httppeer(ui, 'http://localhost')) |
|
71 | 71 | checkobject(localrepo.localpeer(dummyrepo())) |
|
72 |
checkobject(testingsshpeer(ui, 'ssh://localhost/foo', False, |
|
|
72 | checkobject(testingsshpeer(ui, 'ssh://localhost/foo', False, | |
|
73 | (None, None, None, None))) | |
|
73 | 74 | checkobject(bundlerepo.bundlepeer(dummyrepo())) |
|
74 | 75 | checkobject(statichttprepo.statichttppeer(dummyrepo())) |
|
75 | 76 | checkobject(unionrepo.unionpeer(dummyrepo())) |
General Comments 0
You need to be logged in to leave comments.
Login now