sshpeer: inline I/O into _validaterepo()
We want to move the handshake code out of the peer class so the
peer factory function can perform the handshake and instantiate
a proper class depending on the results. To make that refactor
easier to read, we first inline I/O functionality into
_validaterepo().
Test output for low-level protocol tests didn't change, thus
hopefully demonstrating that this refactor didn't change any
material behavior.
Because we no longer call _callstream(), our test extension for
monkeypatching the peer had to change its hook point.
Differential Revision: https://phab.mercurial-scm.org/D2033
--- a/mercurial/sshpeer.py Mon Feb 05 14:17:24 2018 -0800
+++ b/mercurial/sshpeer.py Sun Feb 04 14:10:56 2018 -0800
@@ -212,9 +212,28 @@
self._abort(error.RepoError(msg, hint=hint))
try:
- # skip any noise generated by remote shell
- self._callstream("hello")
- r = self._callstream("between", pairs=("%s-%s" % ("0"*40, "0"*40)))
+ pairsarg = '%s-%s' % ('0' * 40, '0' * 40)
+
+ handshake = [
+ 'hello\n',
+ 'between\n',
+ 'pairs %d\n' % len(pairsarg),
+ pairsarg,
+ ]
+
+ requestlog = self.ui.configbool('devel', 'debug.peer-request')
+
+ if requestlog:
+ self.ui.debug('devel-peer-request: hello\n')
+ self.ui.debug('sending hello command\n')
+ if requestlog:
+ self.ui.debug('devel-peer-request: between\n')
+ self.ui.debug('devel-peer-request: pairs: %d bytes\n' %
+ len(pairsarg))
+ self.ui.debug('sending between command\n')
+
+ self._pipeo.write(''.join(handshake))
+ self._pipeo.flush()
except IOError:
badresponse()
@@ -222,8 +241,8 @@
max_noise = 500
while lines[-1] and max_noise:
try:
- l = r.readline()
- self._readerr()
+ l = self._pipei.readline()
+ _forwardoutput(self.ui, self._pipee)
if lines[-1] == "1\n" and l == "\n":
break
if l:
--- a/tests/sshprotoext.py Mon Feb 05 14:17:24 2018 -0800
+++ b/tests/sshprotoext.py Sun Feb 04 14:10:56 2018 -0800
@@ -54,24 +54,16 @@
class extrahandshakecommandspeer(sshpeer.sshpeer):
"""An ssh peer that sends extra commands as part of initial handshake."""
- # There isn't a good hook point. So we wrap _callstream() and inject
- # logic when the peer says "hello".
- def _callstream(self, cmd, **args):
- if cmd != b'hello':
- return super(extrahandshakecommandspeer, self)._callstream(cmd,
- **args)
-
+ def _validaterepo(self):
mode = self._ui.config(b'sshpeer', b'handshake-mode')
if mode == b'pre-no-args':
self._callstream(b'no-args')
- return super(extrahandshakecommandspeer, self)._callstream(
- cmd, **args)
+ return super(extrahandshakecommandspeer, self)._validaterepo()
elif mode == b'pre-multiple-no-args':
self._callstream(b'unknown1')
self._callstream(b'unknown2')
self._callstream(b'unknown3')
- return super(extrahandshakecommandspeer, self)._callstream(
- cmd, **args)
+ return super(extrahandshakecommandspeer, self)._validaterepo()
else:
raise error.ProgrammingError(b'unknown HANDSHAKECOMMANDMODE: %s' %
mode)