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.
--- 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)
--- 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
--- 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:
--- 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