1078 def _isatty(self, fh): |
1078 def _isatty(self, fh): |
1079 if self.configbool('ui', 'nontty'): |
1079 if self.configbool('ui', 'nontty'): |
1080 return False |
1080 return False |
1081 return procutil.isatty(fh) |
1081 return procutil.isatty(fh) |
1082 |
1082 |
|
1083 def protectfinout(self): |
|
1084 """Duplicate ui streams and redirect original if they are stdio |
|
1085 |
|
1086 Returns (fin, fout) which point to the original ui fds, but may be |
|
1087 copy of them. The returned streams can be considered "owned" in that |
|
1088 print(), exec(), etc. never reach to them. |
|
1089 """ |
|
1090 if self._finoutredirected: |
|
1091 # if already redirected, protectstdio() would just create another |
|
1092 # nullfd pair, which is equivalent to returning self._fin/_fout. |
|
1093 return self._fin, self._fout |
|
1094 fin, fout = procutil.protectstdio(self._fin, self._fout) |
|
1095 self._finoutredirected = (fin, fout) != (self._fin, self._fout) |
|
1096 return fin, fout |
|
1097 |
|
1098 def restorefinout(self, fin, fout): |
|
1099 """Restore ui streams from possibly duplicated (fin, fout)""" |
|
1100 if (fin, fout) == (self._fin, self._fout): |
|
1101 return |
|
1102 procutil.restorestdio(self._fin, self._fout, fin, fout) |
|
1103 # protectfinout() won't create more than one duplicated streams, |
|
1104 # so we can just turn the redirection flag off. |
|
1105 self._finoutredirected = False |
|
1106 |
1083 @contextlib.contextmanager |
1107 @contextlib.contextmanager |
1084 def protectedfinout(self): |
1108 def protectedfinout(self): |
1085 """Run code block with protected standard streams""" |
1109 """Run code block with protected standard streams""" |
1086 fin, fout = procutil.protectstdio(self._fin, self._fout) |
1110 fin, fout = self.protectfinout() |
1087 try: |
1111 try: |
1088 yield fin, fout |
1112 yield fin, fout |
1089 finally: |
1113 finally: |
1090 procutil.restorestdio(self._fin, self._fout, fin, fout) |
1114 self.restorefinout(fin, fout) |
1091 |
1115 |
1092 def disablepager(self): |
1116 def disablepager(self): |
1093 self._disablepager = True |
1117 self._disablepager = True |
1094 |
1118 |
1095 def pager(self, command): |
1119 def pager(self, command): |