Patchwork [2,of,6] ui: factor out function that writes data to fout/ferr with labeling

login
register
mail settings
Submitter Yuya Nishihara
Date Nov. 4, 2018, 12:55 p.m.
Message ID <27823240c017e4a7d474.1541336122@mimosa>
Download mbox | patch
Permalink /patch/36357/
State Accepted
Headers show

Comments

Yuya Nishihara - Nov. 4, 2018, 12:55 p.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1541233955 -32400
#      Sat Nov 03 17:32:35 2018 +0900
# Node ID 27823240c017e4a7d474c93013c149d9c84d73c9
# Parent  86c9952592c51f6ce45eb44c59214e5a68a463df
ui: factor out function that writes data to fout/ferr with labeling

I'm thinking of adding an option to send status messages to stderr (or a
dedicated command-server channel) so that structured output (e.g. JSON)
would never be interleaved with non-formatter output. A unified write()
interface helps to do that.

Patch

diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -947,20 +947,20 @@  class ui(object):
             else:
                 self._buffers[-1].extend(args)
         else:
-            self._writenobuf(*args, **opts)
+            self._writenobuf(self._write, *args, **opts)
 
-    def _writenobuf(self, *args, **opts):
+    def _writenobuf(self, write, *args, **opts):
         self._progclear()
         if self._colormode == 'win32':
             # windows color printing is its own can of crab, defer to
             # the color module and that is it.
-            color.win32print(self, self._write, *args, **opts)
+            color.win32print(self, write, *args, **opts)
         else:
             msgs = args
             if self._colormode is not None:
                 label = opts.get(r'label', '')
                 msgs = [self.label(a, label) for a in args]
-            self._write(*msgs, **opts)
+            write(*msgs, **opts)
 
     def _write(self, *msgs, **opts):
         # opencode timeblockedsection because this is a critical path
@@ -976,18 +976,8 @@  class ui(object):
     def write_err(self, *args, **opts):
         if self._bufferstates and self._bufferstates[-1][0]:
             self.write(*args, **opts)
-            return
-        self._progclear()
-        if self._colormode == 'win32':
-            # windows color printing is its own can of crab, defer to
-            # the color module and that is it.
-            color.win32print(self, self._write_err, *args, **opts)
         else:
-            msgs = args
-            if self._colormode is not None:
-                label = opts.get(r'label', '')
-                msgs = [self.label(a, label) for a in args]
-            self._write_err(*msgs, **opts)
+            self._writenobuf(self._write_err, *args, **opts)
 
     def _write_err(self, *msgs, **opts):
         try:
@@ -1352,7 +1342,7 @@  class ui(object):
         if not self.interactive():
             self.write(msg, ' ', default or '', "\n")
             return default
-        self._writenobuf(msg, label='ui.prompt')
+        self._writenobuf(self._write, msg, label='ui.prompt')
         self.flush()
         try:
             r = self._readline()