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