# HG changeset patch # User Yuya Nishihara # Date 2018-09-26 12:29:13 # Node ID b0e3f2d7c143950cec4db974488db457a732acbc # Parent 4948b327d3b9c5dcd779ef2bff441c57dd4c9e49 ui: move protectedstdio() context manager from procutil This is a follow-up series for 23a00bc90a3c, "chgserver: do not send system() back to client if stdio redirected." The function is renamed using ui terms. diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py --- a/mercurial/commandserver.py +++ b/mercurial/commandserver.py @@ -399,7 +399,7 @@ class pipeservice(object): ui = self.ui # redirect stdio to null device so that broken extensions or in-process # hooks will never cause corruption of channel protocol. - with procutil.protectedstdio(ui.fin, ui.fout) as (fin, fout): + with ui.protectedfinout() as (fin, fout): sv = server(ui, self.repo, fin, fout) try: return sv.serve() diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -1080,6 +1080,15 @@ class ui(object): return False return procutil.isatty(fh) + @contextlib.contextmanager + def protectedfinout(self): + """Run code block with protected standard streams""" + fin, fout = procutil.protectstdio(self._fin, self._fout) + try: + yield fin, fout + finally: + procutil.restorestdio(self._fin, self._fout, fin, fout) + def disablepager(self): self._disablepager = True diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py --- a/mercurial/utils/procutil.py +++ b/mercurial/utils/procutil.py @@ -299,15 +299,6 @@ def restorestdio(uin, uout, fin, fout): os.dup2(f.fileno(), uif.fileno()) f.close() -@contextlib.contextmanager -def protectedstdio(uin, uout): - """Run code block with protected standard streams""" - fin, fout = protectstdio(uin, uout) - try: - yield fin, fout - finally: - restorestdio(uin, uout, fin, fout) - def shellenviron(environ=None): """return environ with optional override, useful for shelling out""" def py2shell(val):