--- a/mercurial/wireprotoserver.py Wed Feb 07 20:17:05 2018 -0800
+++ b/mercurial/wireprotoserver.py Wed Feb 07 20:17:47 2018 -0800
@@ -8,6 +8,7 @@
import abc
import cgi
+import contextlib
import struct
import sys
@@ -74,6 +75,20 @@
"""
@abc.abstractmethod
+ def mayberedirectstdio(self):
+ """Context manager to possibly redirect stdio.
+
+ The context manager yields a file-object like object that receives
+ stdout and stderr output when the context manager is active. Or it
+ yields ``None`` if no I/O redirection occurs.
+
+ The intent of this context manager is to capture stdio output
+ so it may be sent in the response. Some transports support streaming
+ stdio to the client in real time. For these transports, stdio output
+ won't be captured.
+ """
+
+ @abc.abstractmethod
def redirect(self):
"""may setup interception for stdout and stderr
@@ -151,6 +166,21 @@
for s in util.filechunkiter(self._req, limit=length):
fp.write(s)
+ @contextlib.contextmanager
+ def mayberedirectstdio(self):
+ oldout = self._ui.fout
+ olderr = self._ui.ferr
+
+ out = util.stringio()
+
+ try:
+ self._ui.fout = out
+ self._ui.ferr = out
+ yield out
+ finally:
+ self._ui.fout = oldout
+ self._ui.ferr = olderr
+
def redirect(self):
self._oldio = self._ui.fout, self._ui.ferr
self._ui.ferr = self._ui.fout = stringio()
@@ -393,6 +423,10 @@
fpout.write(self._fin.read(count))
count = int(self._fin.readline())
+ @contextlib.contextmanager
+ def mayberedirectstdio(self):
+ yield None
+
def redirect(self):
pass