changeset 40541:c2aea007130b

ui: add inner function to select write destination I'm going to add a config knob to redirect any status messages to stderr. This function helps to switch underlying file objects. # no-check-commit because of existing write_err() function
author Yuya Nishihara <yuya@tcha.org>
date Sat, 03 Nov 2018 18:17:30 +0900
parents 06e841e72523
children d8997c5ce2ff
files mercurial/ui.py tests/test-rollback.t
diffstat 2 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/ui.py	Sat Nov 03 18:04:22 2018 +0900
+++ b/mercurial/ui.py	Sat Nov 03 18:17:30 2018 +0900
@@ -913,6 +913,13 @@
 
         return "".join(self._buffers.pop())
 
+    def _isbuffered(self, dest):
+        if dest is self.fout:
+            return bool(self._buffers)
+        if dest is self.ferr:
+            return bool(self._bufferstates and self._bufferstates[-1][0])
+        return False
+
     def canwritewithoutlabels(self):
         '''check if write skips the label'''
         if self._buffers and not self._bufferapplylabels:
@@ -940,14 +947,20 @@
         "cmdname.type" is recommended. For example, status issues
         a label of "status.modified" for modified files.
         '''
-        if self._buffers:
+        self._write(self.fout, *args, **opts)
+
+    def write_err(self, *args, **opts):
+        self._write(self.ferr, *args, **opts)
+
+    def _write(self, dest, *args, **opts):
+        if self._isbuffered(dest):
             if self._bufferapplylabels:
                 label = opts.get(r'label', '')
                 self._buffers[-1].extend(self.label(a, label) for a in args)
             else:
                 self._buffers[-1].extend(args)
         else:
-            self._writenobuf(self.fout, *args, **opts)
+            self._writenobuf(dest, *args, **opts)
 
     def _writenobuf(self, dest, *args, **opts):
         self._progclear()
@@ -981,12 +994,6 @@
             self._blockedtimes['stdio_blocked'] += \
                 (util.timer() - starttime) * 1000
 
-    def write_err(self, *args, **opts):
-        if self._bufferstates and self._bufferstates[-1][0]:
-            self.write(*args, **opts)
-        else:
-            self._writenobuf(self.ferr, *args, **opts)
-
     def flush(self):
         # opencode timeblockedsection because this is a critical path
         starttime = util.timer()
--- a/tests/test-rollback.t	Sat Nov 03 18:04:22 2018 +0900
+++ b/tests/test-rollback.t	Sat Nov 03 18:17:30 2018 +0900
@@ -278,11 +278,12 @@
   > 
   > def uisetup(ui):
   >     class badui(ui.__class__):
-  >         def write_err(self, *args, **kwargs):
+  >         def _write(self, dest, *args, **kwargs):
   >             olderr = self.ferr
   >             try:
-  >                 self.ferr = fdproxy(self, olderr)
-  >                 return super(badui, self).write_err(*args, **kwargs)
+  >                 if dest is self.ferr:
+  >                     self.ferr = dest = fdproxy(self, olderr)
+  >                 return super(badui, self)._write(dest, *args, **kwargs)
   >             finally:
   >                 self.ferr = olderr
   >