D2022: ui: improve ui.write performance when not coloring on Windows
joerg.sonnenberger (Joerg Sonnenberger)
phabricator at mercurial-scm.org
Wed Feb 7 13:38:38 UTC 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG0ff41ced4c12: diff: improve ui.write performance when not coloring on Windows (authored by joerg.sonnenberger, committed by ).
CHANGED PRIOR TO COMMIT
https://phab.mercurial-scm.org/D2022?vs=5293&id=5297#toc
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D2022?vs=5293&id=5297
REVISION DETAIL
https://phab.mercurial-scm.org/D2022
AFFECTED FILES
mercurial/logcmdutil.py
mercurial/ui.py
CHANGE DETAILS
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -870,6 +870,17 @@
return "".join(self._buffers.pop())
+ def canwritewithoutlabels(self):
+ '''check if write skips the label'''
+ if self._buffers and not self._bufferapplylabels:
+ return True
+ return self._colormode is None
+
+ def canbatchlabeledwrites(self):
+ '''check if write calls with labels are batchable'''
+ # Windows color printing is special, see ``write``.
+ return self._colormode != 'win32'
+
def write(self, *args, **opts):
'''write args to output
diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py
+++ b/mercurial/logcmdutil.py
@@ -79,18 +79,31 @@
width = 80
if not ui.plain():
width = ui.termwidth()
- 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)
+
+ chunks = patch.diff(repo, node1, node2, match, changes, opts=diffopts,
+ prefix=prefix, relroot=relroot,
+ hunksfilterfn=hunksfilterfn)
+
+ if fp is not None or ui.canwritewithoutlabels():
+ if stat:
+ chunks = patch.diffstat(util.iterlines(chunks), width=width)
+ for chunk in util.filechunkiter(util.chunkbuffer(chunks)):
+ write(chunk)
else:
- for chunk, label in patch.diffui(repo, node1, node2, match,
- changes, opts=diffopts, prefix=prefix,
- relroot=relroot,
- hunksfilterfn=hunksfilterfn):
- write(chunk, label=label)
+ if stat:
+ chunks = patch.diffstatui(util.iterlines(chunks), width=width)
+ else:
+ chunks = patch.difflabel(lambda chunks, **kwargs: chunks, chunks,
+ opts=diffopts)
+ if ui.canbatchlabeledwrites():
+ def gen():
+ for chunk, label in chunks:
+ yield ui.label(chunk, label=label)
+ for chunk in util.filechunkiter(util.chunkbuffer(gen())):
+ write(chunk)
+ else:
+ for chunk, label in chunks:
+ write(chunk, label=label)
if listsubrepos:
ctx1 = repo[node1]
To: joerg.sonnenberger, #hg-reviewers, yuja
Cc: yuja, mercurial-devel
More information about the Mercurial-devel
mailing list