chgserver: do not send system() back to client if stdio redirected (issue5992) stable
authorYuya Nishihara <yuya@tcha.org>
Wed, 26 Sep 2018 21:24:14 +0900
branchstable
changeset 39809 23a00bc90a3c
parent 39808 1b9be0b26511
child 39840 a9f56e4501c1
child 39939 e85462d48cb3
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.
mercurial/chgserver.py
mercurial/ui.py
mercurial/wireprotoserver.py
tests/test-ssh.t
--- 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