Patchwork [2,of,3,STABLE] context: ability to manipulate diff feature opt-ins

login
register
mail settings
Submitter Gregory Szorc
Date July 18, 2015, 9:24 p.m.
Message ID <b6ab3a470c0196159e89.1437254670@vm-ubuntu-main.gateway.sonic.net>
Download mbox | patch
Permalink /patch/10038/
State Changes Requested
Delegated to: Matt Mackall
Headers show

Comments

Gregory Szorc - July 18, 2015, 9:24 p.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1437254506 25200
#      Sat Jul 18 14:21:46 2015 -0700
# Node ID b6ab3a470c0196159e8931c8c6dd4b5c4a52a4f6
# Parent  d88519184df5f9538b4f9294bee7a595d5dce6d2
context: ability to manipulate diff feature opt-ins

Before this patch, basectx.diff respected all diff options. Sometimes
consumers want to opt out of certain classes of diff features.

Change the function to call patch.difffeatureopts instead of
diffallopts and allow the various features to be opted out of via
arguments.
Yuya Nishihara - July 20, 2015, 11:18 a.m.
On Sat, 18 Jul 2015 14:24:30 -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc@gmail.com>
> # Date 1437254506 25200
> #      Sat Jul 18 14:21:46 2015 -0700
> # Node ID b6ab3a470c0196159e8931c8c6dd4b5c4a52a4f6
> # Parent  d88519184df5f9538b4f9294bee7a595d5dce6d2
> context: ability to manipulate diff feature opt-ins
> 
> Before this patch, basectx.diff respected all diff options. Sometimes
> consumers want to opt out of certain classes of diff features.
> 
> Change the function to call patch.difffeatureopts instead of
> diffallopts and allow the various features to be opted out of via
> arguments.
> 
> diff --git a/mercurial/context.py b/mercurial/context.py
> --- a/mercurial/context.py
> +++ b/mercurial/context.py
> @@ -268,15 +268,23 @@ class basectx(object):
>                                include, exclude, default,
>                                auditor=r.auditor, ctx=self,
>                                listsubrepos=listsubrepos, badfn=badfn)
>  
> -    def diff(self, ctx2=None, match=None, **opts):
> -        """Returns a diff generator for the given contexts and matcher"""
> +    def diff(self, ctx2=None, match=None, allowgit=True, allowwhitespace=True,
> +             allowformatchanging=True, **opts):
> +        """Returns a diff generator for the given contexts and matcher.
> +
> +        The various allow* arguments control whether the diff features under
> +        that category are respected. See patch.difffeatureopts.
> +        """
>          if ctx2 is None:
>              ctx2 = self.p1()
>          if ctx2 is not None:
>              ctx2 = self._repo[ctx2]
> -        diffopts = patch.diffopts(self._repo.ui, opts)
> +        diffopts = patch.difffeatureopts(self._repo.ui, opts=opts,
> +                                         git=allowgit,
> +                                         whitespace=allowwhitespace,
> +                                         formatchanging=allowformatchanging)
>          return patch.diff(self._repo, ctx2, self, match=match, opts=diffopts)

I'm noob about this API, but I think patch.diff*opts() exists to pack various
diff-related options into one argument. It seems this change goes the opposite
direction.

Instead, maybe we can change templatekw.showdiffstat() to not use ctx.diff() ?

Patch

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -268,15 +268,23 @@  class basectx(object):
                               include, exclude, default,
                               auditor=r.auditor, ctx=self,
                               listsubrepos=listsubrepos, badfn=badfn)
 
-    def diff(self, ctx2=None, match=None, **opts):
-        """Returns a diff generator for the given contexts and matcher"""
+    def diff(self, ctx2=None, match=None, allowgit=True, allowwhitespace=True,
+             allowformatchanging=True, **opts):
+        """Returns a diff generator for the given contexts and matcher.
+
+        The various allow* arguments control whether the diff features under
+        that category are respected. See patch.difffeatureopts.
+        """
         if ctx2 is None:
             ctx2 = self.p1()
         if ctx2 is not None:
             ctx2 = self._repo[ctx2]
-        diffopts = patch.diffopts(self._repo.ui, opts)
+        diffopts = patch.difffeatureopts(self._repo.ui, opts=opts,
+                                         git=allowgit,
+                                         whitespace=allowwhitespace,
+                                         formatchanging=allowformatchanging)
         return patch.diff(self._repo, ctx2, self, match=match, opts=diffopts)
 
     def dirs(self):
         return self._manifest.dirs()