# HG changeset patch
# User Denis Laxalde
# Date 1507293917 -7200
# Fri Oct 06 14:45:17 2017 +0200
# Node ID 909a69f31ef323ded6fef8dd56fb44dc97f4cd89
# Parent c73893dd6cfb5693029f5d9dcf1d537197b40a4a
# EXP-Topic followlines-cli
diff: pass a diff hunks filter function from changeset_printer to patch.diff()
We add a 'hunksfilterfn' keyword argument in all functions of the call
stack from changeset_printer.show() to patch.diff(). This is a callable
that will be used to filter out hunks by line range and will be used in
the "-L/--line-range" option of "hg log" command introduced in the
following changesets.
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1494,7 +1494,7 @@ def export(repo, revs, fntemplate='hg-%h
def diffordiffstat(ui, repo, diffopts, node1, node2, match,
changes=None, stat=False, fp=None, prefix='',
- root='', listsubrepos=False):
+ root='', listsubrepos=False, hunksfilterfn=None):
'''show diff or diffstat.'''
if fp is None:
write = ui.write
@@ -1522,14 +1522,16 @@ def diffordiffstat(ui, repo, diffopts, n
if not ui.plain():
width = ui.termwidth()
chunks = patch.diff(repo, node1, node2, match, changes, diffopts,
-prefix=prefix, relroot=relroot)
+prefix=prefix, relroot=relroot,
+hunksfilterfn=hunksfilterfn)
for chunk, label in patch.diffstatui(util.iterlines(chunks),
width=width):
write(chunk, label=label)
else:
for chunk, label in patch.diffui(repo, node1, node2, match,
changes, diffopts, prefix=prefix,
- relroot=relroot):
+ relroot=relroot,
+ hunksfilterfn=hunksfilterfn):
write(chunk, label=label)
if listsubrepos:
@@ -1591,16 +1593,17 @@ class changeset_printer(object):
if self.footer:
self.ui.write(self.footer)
-def show(self, ctx, copies=None, matchfn=None, **props):
+def show(self, ctx, copies=None, matchfn=None, hunksfilterfn=None,
+ **props):
props = pycompat.byteskwargs(props)
if self.buffered:
self.ui.pushbuffer(labeled=True)
-self._show(ctx, copies, matchfn, props)
+self._show(ctx, copies, matchfn, hunksfilterfn, props)
self.hunk[ctx.rev()] = self.ui.popbuffer()
else:
-self._show(ctx, copies, matchfn, props)
-
-def _show(self, ctx, copies, matchfn, props):
+self._show(ctx, copies, matchfn, hunksfilterfn, props)
+
+def _show(self, ctx, copies, matchfn, hunksfilterfn, props):
'''show a single changeset or file revision'''
changenode = ctx.node()
rev = ctx.rev()
@@ -1711,13 +1714,13 @@ class changeset_printer(object):
label='log.summary')
self.ui.write("\n")
-self.showpatch(ctx, matchfn)
+self.showpatch(ctx, matchfn, hunksfilterfn=hunksfilterfn)
def _exthook(self, ctx):
'''empty method used by extension as a hook point
'''
-def showpatch(self, ctx, matchfn):
+def showpatch(self, ctx, matchfn, hunksfilterfn=None):
if not matchfn:
matchfn = self.matchfn
if matchfn:
@@ -1728,12 +1731,14 @@ class changeset_printer(object):
prev = ctx.p1().node()
if stat:
diffordiffstat(self.ui, self.repo, diffopts, prev, node,
- match=matchfn, stat=True)
+ match=matchfn, stat=True,
+ hunksfilterfn=hunksfilterfn)
if diff:
if stat:
self.ui.write("\n")
diffordiffstat(self.ui, self.repo, diffopts, prev, node,
- match=matchfn, stat=False)
+ match=matchfn, stat=False,
+ hunksfilterfn=hunksfilterfn)
self.ui.write("\n")
class jsonchangeset(changeset_printer):
@@ -1750,7 +1755,7 @@ class jsonchangeset(changeset_printer):
else:
self.ui.write("[]\n")
-def _show(self, ctx, copies, matchfn, props):
+def _show(self, ctx, copies, matchfn, hunksfilterfn, props):
'''show a single changeset or file revision'''
rev = ctx.rev()
if rev is None:
@@ -1884,7 +1889,7 @@ class changeset_templater(changeset_prin
self.footer +=
templater.stringify(self.t(self._parts['docfooter']))
return super(changeset_templater, self).close()
-def _show(self, ctx, copies, matchfn, props):
+def _show(self, ctx,