diff -r c845479fc64d -r 204af2aa4931 mercurial/logcmdutil.py --- a/mercurial/logcmdutil.py Wed Nov 08 22:27:32 2023 +0100 +++ b/mercurial/logcmdutil.py Thu Sep 07 08:39:21 2023 +0200 @@ -98,7 +98,7 @@ return ctx.p1() -def diffordiffstat( +def get_diff_chunks( ui, repo, diffopts, @@ -107,14 +107,10 @@ match, changes=None, stat=False, - fp=None, - graphwidth=0, prefix=b'', root=b'', - listsubrepos=False, hunksfilterfn=None, ): - '''show diff or diffstat.''' if root: relroot = pathutil.canonpath(repo.root, repo.getcwd(), root) else: @@ -159,14 +155,11 @@ if stat: diffopts = diffopts.copy(context=0, noprefix=False) - width = 80 - if not ui.plain(): - width = ui.termwidth() - graphwidth # If an explicit --root was given, don't respect ui.relative-paths if not relroot: pathfn = compose(scmutil.getuipathfn(repo), pathfn) - chunks = ctx2.diff( + return ctx2.diff( ctx1, match, changes, @@ -176,6 +169,45 @@ hunksfilterfn=hunksfilterfn, ) + +def diffordiffstat( + ui, + repo, + diffopts, + ctx1, + ctx2, + match, + changes=None, + stat=False, + fp=None, + graphwidth=0, + prefix=b'', + root=b'', + listsubrepos=False, + hunksfilterfn=None, +): + '''show diff or diffstat.''' + + chunks = get_diff_chunks( + ui, + repo, + diffopts, + ctx1, + ctx2, + match, + changes=changes, + stat=stat, + prefix=prefix, + root=root, + hunksfilterfn=hunksfilterfn, + ) + + if stat: + diffopts = diffopts.copy(context=0, noprefix=False) + width = 80 + if not ui.plain(): + width = ui.termwidth() - graphwidth + if fp is not None or ui.canwritewithoutlabels(): out = fp or ui if stat: @@ -249,6 +281,33 @@ hunksfilterfn=self._makehunksfilter(ctx), ) + def getdiffstats(self, ui, ctx, diffopts, stat=False): + chunks = get_diff_chunks( + ui, + ctx.repo(), + diffopts, + diff_parent(ctx), + ctx, + match=self._makefilematcher(ctx), + stat=stat, + hunksfilterfn=self._makehunksfilter(ctx), + ) + + diffdata = [] + for filename, additions, removals, binary in patch.diffstatdata( + util.iterlines(chunks) + ): + diffdata.append( + { + b"name": filename, + b"additions": additions, + b"removals": removals, + b"binary": binary, + } + ) + + return diffdata + def changesetlabels(ctx): labels = [b'log.changeset', b'changeset.%s' % ctx.phasestr()] @@ -525,9 +584,10 @@ ) if self._includestat or b'diffstat' in datahint: - self.ui.pushbuffer() - self._differ.showdiff(self.ui, ctx, self._diffopts, stat=True) - fm.data(diffstat=self.ui.popbuffer()) + data = self._differ.getdiffstats( + self.ui, ctx, self._diffopts, stat=True + ) + fm.data(diffstat=fm.formatlist(data, name=b'diffstat')) if self._includediff or b'diff' in datahint: self.ui.pushbuffer() self._differ.showdiff(self.ui, ctx, self._diffopts, stat=False)