Patchwork D1938: ui: Improve ui.write performance when not coloring on Windows

login
register
mail settings
Submitter phabricator
Date Jan. 25, 2018, 7 p.m.
Message ID <c76f7e5e43da38e27dc033f945a75d5a@localhost.localdomain>
Download mbox | patch
Permalink /patch/27060/
State Not Applicable
Headers show

Comments

phabricator - Jan. 25, 2018, 7 p.m.
joerg.sonnenberger updated this revision to Diff 5003.
joerg.sonnenberger retitled this revision from "[ui] Improve ui.write performance when not coloring on Windows" to "ui: Improve ui.write performance when not coloring on Windows".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D1938?vs=5002&id=5003

REVISION DETAIL
  https://phab.mercurial-scm.org/D1938

AFFECTED FILES
  mercurial/cmdutil.py
  mercurial/ui.py

CHANGE DETAILS




To: joerg.sonnenberger, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -878,6 +878,18 @@ 
 
         return "".join(self._buffers.pop())
 
+    def writenolabels(self, **opts):
+        '''check if write actually uses the label'''
+        if self._buffers and not opts.get(r'prompt', False):
+            if not self._bufferapplylabels:
+                return True
+        return self._colormode is None
+    def canbatchlabelwrites(self, **opts):
+        '''check if write calls with labels are batchable'''
+        assert not self.writenolabels()
+        # Windows color printing is special, see ``write``.
+        return self._colormode != 'win32'
+
     def write(self, *args, **opts):
         '''write args to output
 
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1615,14 +1615,21 @@ 
         chunks = patch.diff(repo, node1, node2, match, changes, opts=diffopts,
                             prefix=prefix, relroot=relroot,
                             hunksfilterfn=hunksfilterfn)
-        for chunk, label in patch.diffstatui(util.iterlines(chunks),
-                                             width=width):
-            write(chunk, label=label)
+        chunksiter = patch.diffstatui(util.iterlines(chunks), width=width)
     else:
-        for chunk, label in patch.diffui(repo, node1, node2, match,
-                                         changes, opts=diffopts, prefix=prefix,
-                                         relroot=relroot,
-                                         hunksfilterfn=hunksfilterfn):
+        chunksiter = patch.diffui(repo, node1, node2, match, changes,
+                                  opts=diffopts, prefix=prefix,
+                                  relroot=relroot, hunksfilterfn=hunksfilterfn)
+
+    if fp is None and ui.writenolabels():
+        write(*(chunk for chunk, label in chunksiter))
+    elif fp is None and ui.canbatchlabelwrites():
+        output = []
+        for chunk, label in chunksiter:
+            output.append(ui.label(chunk, label=label))
+        write(*output)
+    else:
+        for chunk, label in chunksiter:
             write(chunk, label=label)
 
     if listsubrepos: