# HG changeset patch # User Yuya Nishihara # Date 1521964053 -32400 # Node ID bfe8ef6e370e3722d31fddc56e1a03a784e27392 # Parent dc1ed7fe33e45dcaa30b421d3281bd45b7818bd7 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 -r dc1ed7fe33e4 -r bfe8ef6e370e mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py Sun Mar 25 16:35:24 2018 +0900 +++ b/mercurial/wireprotoserver.py Sun Mar 25 16:47:33 2018 +0900 @@ -18,7 +18,6 @@ from . import ( encoding, error, - hook, pycompat, util, wireprototypes, @@ -785,8 +784,7 @@ 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 @@ 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):