Patchwork [1,of,2] patch: enable diff.tab markup for the color extension

login
register
mail settings
Submitter Jordi Gutiérrez Hermoso
Date Aug. 24, 2014, 10:22 p.m.
Message ID <a028ddacb2daea2b4fe1.1408918936@Iris>
Download mbox | patch
Permalink /patch/5575/
State Accepted
Commit c343557a84423215d47af9bdefaed62d32de0d9a
Headers show

Comments

Jordi Gutiérrez Hermoso - Aug. 24, 2014, 10:22 p.m.
# HG changeset patch
# User Jordi Gutiérrez Hermoso <jordigh@octave.org>
# Date 1408562150 14400
#      Wed Aug 20 15:15:50 2014 -0400
# Node ID a028ddacb2daea2b4fe1db75f76f5ca0305f41c6
# Parent  9d81f3c34b9fa408901c1b0362dd3a891639dee7
patch: enable diff.tab markup for the color extension

The following patch splits up changed lines along tabs (using
re.findall), and gives them a "diff.tab" label. This can be used by
the color extension for colorising tabs, like it does right now with
trailing whitespace.

I also provide corresponding tests.
Pierre-Yves David - Sept. 17, 2014, 11:54 p.m.
On 08/24/2014 03:22 PM, Jordi Gutiérrez Hermoso wrote:
> # HG changeset patch
> # User Jordi Gutiérrez Hermoso <jordigh@octave.org>
> # Date 1408562150 14400
> #      Wed Aug 20 15:15:50 2014 -0400
> # Node ID a028ddacb2daea2b4fe1db75f76f5ca0305f41c6
> # Parent  9d81f3c34b9fa408901c1b0362dd3a891639dee7
> patch: enable diff.tab markup for the color extension

pushed to the clowncopter with a minor fix (see below)

> The following patch splits up changed lines along tabs (using
> re.findall), and gives them a "diff.tab" label. This can be used by
> the color extension for colorising tabs, like it does right now with
> trailing whitespace.
>
> I also provide corresponding tests.
>
> diff --git a/mercurial/patch.py b/mercurial/patch.py
> --- a/mercurial/patch.py
> +++ b/mercurial/patch.py
> @@ -18,6 +18,7 @@ from node import hex, short
>   import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
>
>   gitre = re.compile('diff --git a/(.*) b/(.*)')
> +tabsplitter = re.compile(r'(\t+|[^\t]+)')
>
>   class PatchError(Exception):
>       pass
> @@ -1669,15 +1670,26 @@ def difflabel(func, *args, **kw):
>                   if line and line[0] not in ' +-@\\':
>                       head = True
>               stripline = line
> +            diffline = False
>               if not head and line and line[0] in '+-':
> -                # highlight trailing whitespace, but only in changed lines
> +                # highlight tabs and trailing whitespace, but only in
> +                # changed lines
>                   stripline = line.rstrip()
> +                diffline = True
> +
>               prefixes = textprefixes
>               if head:
>                   prefixes = headprefixes
>               for prefix, label in prefixes:
>                   if stripline.startswith(prefix):
> -                    yield (stripline, label)
> +                    if diffline:
> +                        for token in tabsplitter.findall(stripline):
> +                            if '\t' in token:

I changed this line:

-                            if '\t' in token:
+                            if '\t' == token[0]:

Patch

diff --git a/mercurial/patch.py b/mercurial/patch.py
--- a/mercurial/patch.py
+++ b/mercurial/patch.py
@@ -18,6 +18,7 @@  from node import hex, short
 import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
 
 gitre = re.compile('diff --git a/(.*) b/(.*)')
+tabsplitter = re.compile(r'(\t+|[^\t]+)')
 
 class PatchError(Exception):
     pass
@@ -1669,15 +1670,26 @@  def difflabel(func, *args, **kw):
                 if line and line[0] not in ' +-@\\':
                     head = True
             stripline = line
+            diffline = False
             if not head and line and line[0] in '+-':
-                # highlight trailing whitespace, but only in changed lines
+                # highlight tabs and trailing whitespace, but only in
+                # changed lines
                 stripline = line.rstrip()
+                diffline = True
+
             prefixes = textprefixes
             if head:
                 prefixes = headprefixes
             for prefix, label in prefixes:
                 if stripline.startswith(prefix):
-                    yield (stripline, label)
+                    if diffline:
+                        for token in tabsplitter.findall(stripline):
+                            if '\t' in token:
+                                yield (token, 'diff.tab')
+                            else:
+                                yield (token, label)
+                    else:
+                        yield (stripline, label)
                     break
             else:
                 yield (line, '')
diff --git a/tests/test-diff-color.t b/tests/test-diff-color.t
--- a/tests/test-diff-color.t
+++ b/tests/test-diff-color.t
@@ -159,4 +159,44 @@  issue3712: test colorization of subrepo 
    b
   \x1b[0;32m+bb\x1b[0m (esc)
 
+test tabs
+
+  $ cat >> a <<EOF
+  > 	one tab
+  > 		two tabs
+  > end tab	
+  > mid	tab
+  > 	all		tabs	
+  > EOF
+  $ hg diff --nodates --color=always
+  \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
+  \x1b[0;31;1m--- a/a\x1b[0m (esc)
+  \x1b[0;32;1m+++ b/a\x1b[0m (esc)
+  \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
+   a
+   c
+   c
+  \x1b[0;32m+aa\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m	\x1b[0;32mone tab\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m		\x1b[0;32mtwo tabs\x1b[0m (esc)
+  \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m	\x1b[0m (esc)
+  \x1b[0;32m+mid\x1b[0m	\x1b[0;32mtab\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m	\x1b[0;32mall\x1b[0m		\x1b[0;32mtabs\x1b[0m\x1b[0;1;41m	\x1b[0m (esc)
+  $ echo "[color]" >> $HGRCPATH
+  $ echo "diff.tab = bold magenta" >> $HGRCPATH
+  $ hg diff --nodates --color=always
+  \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
+  \x1b[0;31;1m--- a/a\x1b[0m (esc)
+  \x1b[0;32;1m+++ b/a\x1b[0m (esc)
+  \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
+   a
+   c
+   c
+  \x1b[0;32m+aa\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m\x1b[0;1;35m	\x1b[0m\x1b[0;32mone tab\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m\x1b[0;1;35m		\x1b[0m\x1b[0;32mtwo tabs\x1b[0m (esc)
+  \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m	\x1b[0m (esc)
+  \x1b[0;32m+mid\x1b[0m\x1b[0;1;35m	\x1b[0m\x1b[0;32mtab\x1b[0m (esc)
+  \x1b[0;32m+\x1b[0m\x1b[0;1;35m	\x1b[0m\x1b[0;32mall\x1b[0m\x1b[0;1;35m		\x1b[0m\x1b[0;32mtabs\x1b[0m\x1b[0;1;41m	\x1b[0m (esc)
+
   $ cd ..