D2467: sshpeer: support not reading and forwarding stderr

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Mon Feb 26 16:17:36 EST 2018


indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The "doublepipe" primitive as used by sshpeer will automatically read
  from stderr and forward output to the local ui.
  
  This poses problems for deterministic testing because reads may not
  be consistent. For example, the server may not be done sending all
  output to stderr and the client will perform different numbers of
  read operations or will read from stderr and stdout at different times.
  
  To make tests deterministic, we'll need to disable the "doublepipe"
  primitive and perform stderr I/O explicitly. We add an argument to the
  sshpeer constructor to disable the use of the doublepipe.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/sshpeer.py

CHANGE DETAILS

diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
--- a/mercurial/sshpeer.py
+++ b/mercurial/sshpeer.py
@@ -337,13 +337,16 @@
     return protoname, caps
 
 class sshv1peer(wireproto.wirepeer):
-    def __init__(self, ui, url, proc, stdin, stdout, stderr, caps):
+    def __init__(self, ui, url, proc, stdin, stdout, stderr, caps,
+                 autoreadstderr=True):
         """Create a peer from an existing SSH connection.
 
         ``proc`` is a handle on the underlying SSH process.
         ``stdin``, ``stdout``, and ``stderr`` are handles on the stdio
         pipes for that process.
         ``caps`` is a set of capabilities supported by the remote.
+        ``autoreadstderr`` denotes whether to automatically read from
+        stderr and to forward its output.
         """
         self._url = url
         self._ui = ui
@@ -353,8 +356,9 @@
 
         # And we hook up our "doublepipe" wrapper to allow querying
         # stderr any time we perform I/O.
-        stdout = doublepipe(ui, util.bufferedinputpipe(stdout), stderr)
-        stdin = doublepipe(ui, stdin, stderr)
+        if autoreadstderr:
+            stdout = doublepipe(ui, util.bufferedinputpipe(stdout), stderr)
+            stdin = doublepipe(ui, stdin, stderr)
 
         self._pipeo = stdin
         self._pipei = stdout



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


More information about the Mercurial-devel mailing list