[PATCH 3 of 3] sshserver: redirect stdin/stdout early and use duplicated streams

Yuya Nishihara yuya at tcha.org
Mon May 7 09:11:24 EDT 2018


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1521964053 -32400
#      Sun Mar 25 16:47:33 2018 +0900
# Node ID a7e53b70e5026bac9772f9869e754a2a6f530587
# Parent  ea801aa5d559e37f68fb9bdda47dec6e58abcb88
sshserver: redirect stdin/stdout early and use duplicated streams

This is what we achieved with hook.redirect(True) plus ui.fout = ui.ferr.

The hook.redirect() function can't be completely removed yet since hgweb
still depends on it. I'm not sure if it is necessary for WSGI servers. CGI
needs it, but does WSGI communicate over stdin/stdout channels?

diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py
--- a/mercurial/wireprotoserver.py
+++ b/mercurial/wireprotoserver.py
@@ -18,7 +18,6 @@ from .thirdparty import (
 from . import (
     encoding,
     error,
-    hook,
     pycompat,
     util,
     wireprototypes,
@@ -785,8 +784,7 @@ class sshserver(object):
     def __init__(self, ui, repo, logfh=None):
         self._ui = ui
         self._repo = repo
-        self._fin = ui.fin
-        self._fout = ui.fout
+        self._fin, self._fout = procutil.protectstdio(ui.fin, ui.fout)
 
         # Log write I/O to stdout and stderr if configured.
         if logfh:
@@ -795,11 +793,10 @@ class sshserver(object):
             ui.ferr = util.makeloggingfileobject(
                 logfh, ui.ferr, 'e', logdata=True)
 
-        hook.redirect(True)
-        ui.fout = repo.ui.fout = ui.ferr
-
     def serve_forever(self):
         self.serveuntil(threading.Event())
+        procutil.restorestdio(self._ui.fin, self._ui.fout,
+                              self._fin, self._fout)
         sys.exit(0)
 
     def serveuntil(self, ev):


More information about the Mercurial-devel mailing list