D2033: sshpeer: inline I/O into _validaterepo()

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Tue Feb 6 08:24:31 EST 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rHGa9cffd14aa04: sshpeer: inline I/O into _validaterepo() (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2033?vs=5234&id=5250

REVISION DETAIL
  https://phab.mercurial-scm.org/D2033

AFFECTED FILES
  mercurial/sshpeer.py
  tests/sshprotoext.py

CHANGE DETAILS

diff --git a/tests/sshprotoext.py b/tests/sshprotoext.py
--- a/tests/sshprotoext.py
+++ b/tests/sshprotoext.py
@@ -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)
diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
--- a/mercurial/sshpeer.py
+++ b/mercurial/sshpeer.py
@@ -212,18 +212,37 @@
             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()
 
         lines = ["", "dummy"]
         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:



To: indygreg, #hg-reviewers, yuja
Cc: mercurial-devel


More information about the Mercurial-devel mailing list