# HG changeset patch # User Yuya Nishihara # Date 1537964654 -32400 # Node ID 23a00bc90a3c0082b10bbe2c8e6eedd3cc96d6f8 # Parent 1b9be0b26511d15613020f5dddd3d0362bbc0325 chgserver: do not send system() back to client if stdio redirected (issue5992) As the chg client doesn't know server-side stdio redirection, the server shouldn't upcall on "runsystem" request if the stdio streams are redirected. This patch teaches ui to remember the redirection flag, which is updated by the caller right now. Future patches (for default) will add ui methods to manage this flag internally. diff -r 1b9be0b26511 -r 23a00bc90a3c mercurial/chgserver.py --- a/mercurial/chgserver.py Wed Sep 26 21:21:05 2018 +0900 +++ b/mercurial/chgserver.py Wed Sep 26 21:24:14 2018 +0900 @@ -200,11 +200,13 @@ def _runsystem(self, cmd, environ, cwd, out): # fallback to the original system method if # a. the output stream is not stdout (e.g. stderr, cStringIO), + # b. or stdout is redirected by protectstdio(), # because the chg client is not aware of these situations and # will behave differently (i.e. write to stdout). if (out is not self.fout or not util.safehasattr(self.fout, 'fileno') - or self.fout.fileno() != procutil.stdout.fileno()): + or self.fout.fileno() != procutil.stdout.fileno() + or self._finoutredirected): return procutil.system(cmd, environ=environ, cwd=cwd, out=out) self.flush() return self._csystem(cmd, procutil.shellenviron(environ), cwd) diff -r 1b9be0b26511 -r 23a00bc90a3c mercurial/ui.py --- a/mercurial/ui.py Wed Sep 26 21:21:05 2018 +0900 +++ b/mercurial/ui.py Wed Sep 26 21:24:14 2018 +0900 @@ -231,6 +231,7 @@ self.fout = src.fout self.ferr = src.ferr self.fin = src.fin + self._finoutredirected = src._finoutredirected self.pageractive = src.pageractive self._disablepager = src._disablepager self._tweaked = src._tweaked @@ -255,6 +256,7 @@ self.fout = procutil.stdout self.ferr = procutil.stderr self.fin = procutil.stdin + self._finoutredirected = False self.pageractive = False self._disablepager = False self._tweaked = False diff -r 1b9be0b26511 -r 23a00bc90a3c mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py Wed Sep 26 21:21:05 2018 +0900 +++ b/mercurial/wireprotoserver.py Wed Sep 26 21:24:14 2018 +0900 @@ -785,6 +785,8 @@ self._ui = ui self._repo = repo self._fin, self._fout = procutil.protectstdio(ui.fin, ui.fout) + # TODO: manage the redirection flag internally by ui + ui._finoutredirected = (self._fin, self._fout) != (ui.fin, ui.fout) # Log write I/O to stdout and stderr if configured. if logfh: diff -r 1b9be0b26511 -r 23a00bc90a3c tests/test-ssh.t --- a/tests/test-ssh.t Wed Sep 26 21:21:05 2018 +0900 +++ b/tests/test-ssh.t Wed Sep 26 21:24:14 2018 +0900 @@ -332,8 +332,8 @@ remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files - abort: not a Mercurial bundle - [255] + remote: KABOOM + remote: KABOOM IN PROCESS #endif