Patchwork D2391: sshpeer: factor out code for creating peers from pipes

login
register
mail settings
Submitter phabricator
Date Feb. 23, 2018, 4:29 p.m.
Message ID <7b83f87aff3a18fcc3ef775f8eb15d8f@localhost.localdomain>
Download mbox | patch
Permalink /patch/28278/
State Not Applicable
Headers show

Comments

phabricator - Feb. 23, 2018, 4:29 p.m.
indygreg updated this revision to Diff 6018.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2391?vs=6004&id=6018

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

AFFECTED FILES
  mercurial/sshpeer.py

CHANGE DETAILS




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

Patch

diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
--- a/mercurial/sshpeer.py
+++ b/mercurial/sshpeer.py
@@ -531,6 +531,35 @@ 
     # And handshake is performed before the peer is instantiated. So
     # we need no custom code.
 
+def makepeer(ui, path, proc, stdin, stdout, stderr):
+    """Make a peer instance from existing pipes.
+
+    ``path`` and ``proc`` are stored on the eventual peer instance and may
+    not be used for anything meaningful.
+
+    ``stdin``, ``stdout``, and ``stderr`` are the pipes connected to the
+    SSH server's stdio handles.
+
+    This function is factored out to allow creating peers that don't
+    actually spawn a new process. It is useful for starting SSH protocol
+    servers and clients via non-standard means, which can be useful for
+    testing.
+    """
+    try:
+        protoname, caps = _performhandshake(ui, stdin, stdout, stderr)
+    except Exception:
+        _cleanuppipes(ui, stdout, stdin, stderr)
+        raise
+
+    if protoname == wireprotoserver.SSHV1:
+        return sshv1peer(ui, path, proc, stdin, stdout, stderr, caps)
+    elif protoname == wireprotoserver.SSHV2:
+        return sshv2peer(ui, path, proc, stdin, stdout, stderr, caps)
+    else:
+        _cleanuppipes(ui, stdout, stdin, stderr)
+        raise error.RepoError(_('unknown version of SSH protocol: %s') %
+                              protoname)
+
 def instance(ui, path, create):
     """Create an SSH peer.
 
@@ -565,17 +594,4 @@ 
     proc, stdin, stdout, stderr = _makeconnection(ui, sshcmd, args, remotecmd,
                                                   remotepath, sshenv)
 
-    try:
-        protoname, caps = _performhandshake(ui, stdin, stdout, stderr)
-    except Exception:
-        _cleanuppipes(ui, stdout, stdin, stderr)
-        raise
-
-    if protoname == wireprotoserver.SSHV1:
-        return sshv1peer(ui, path, proc, stdin, stdout, stderr, caps)
-    elif protoname == wireprotoserver.SSHV2:
-        return sshv2peer(ui, path, proc, stdin, stdout, stderr, caps)
-    else:
-        _cleanuppipes(ui, stdout, stdin, stderr)
-        raise error.RepoError(_('unknown version of SSH protocol: %s') %
-                              protoname)
+    return makepeer(ui, path, proc, stdin, stdout, stderr)