From patchwork Wed Feb 7 12:59:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D2022: ui: improve ui.write performance when not coloring on Windows From: phabricator X-Patchwork-Id: 27421 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Wed, 7 Feb 2018 12:59:28 +0000 joerg.sonnenberger updated this revision to Diff 5293. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D2022?vs=5181&id=5293 REVISION DETAIL https://phab.mercurial-scm.org/D2022 AFFECTED FILES mercurial/logcmdutil.py mercurial/ui.py CHANGE DETAILS To: joerg.sonnenberger, #hg-reviewers, yuja Cc: yuja, mercurial-devel 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, **opts): + '''check if write skips the label''' + if self._buffers and not self._bufferapplylabels: + return True + return self._colormode is None + + def canbatchlabeledwrites(self, **opts): + '''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]