--- 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)
--- a/tests/test-template-map.t Wed Nov 08 22:27:32 2023 +0100
+++ b/tests/test-template-map.t Thu Sep 07 08:39:21 2023 +0200
@@ -766,7 +766,26 @@
],
'desc': 'third',
'diff': 'diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n',
- 'diffstat': ' fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n',
+ 'diffstat': [
+ {
+ 'additions': 1,
+ 'binary': False,
+ 'name': 'fourth',
+ 'removals': 0
+ },
+ {
+ 'additions': 0,
+ 'binary': False,
+ 'name': 'second',
+ 'removals': 1
+ },
+ {
+ 'additions': 1,
+ 'binary': False,
+ 'name': 'third',
+ 'removals': 0
+ }
+ ],
'files': [
'fourth',
'second',
@@ -820,7 +839,7 @@
"date": [1577872860, 0],
"desc": "third",
"diff": "diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n",
- "diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n",
+ "diffstat": [{"additions": 1, "binary": false, "name": "fourth", "removals": 0}, {"additions": 0, "binary": false, "name": "second", "removals": 1}, {"additions": 1, "binary": false, "name": "third", "removals": 0}],
"files": ["fourth", "second", "third"],
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
@@ -1180,7 +1199,7 @@
$ hg log -r. -T'json(diffstat)'
[
- {"diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n"}
+ {"diffstat": [{"additions": 1, "binary": false, "name": "fourth", "removals": 0}, {"additions": 0, "binary": false, "name": "second", "removals": 1}, {"additions": 1, "binary": false, "name": "third", "removals": 0}]}
]
$ hg log -r. -T'json(manifest)'