userdiff: add a builtin pattern for dts files

The Linux kernel receives many patches to the devicetree files each
release. The hunk header for those patches typically show nothing,
making it difficult to figure out what node is being modified without
applying the patch or opening the file and seeking to the context. Let's
add a builtin 'dts' pattern to git so that users can get better diff
output on dts files when they use the diff=dts driver.

The regex has been constructed based on the spec at devicetree.org[1]
and with some help from Johannes Sixt.

[1] https://github.com/devicetree-org/devicetree-specification/releases/latest

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stephen Boyd 2019-08-19 14:22:43 -07:00 committed by Junio C Hamano
parent 5fa0f5238b
commit 3c81760bc6
14 changed files with 168 additions and 0 deletions

View File

@ -810,6 +810,8 @@ patterns are available:
- `css` suitable for cascading style sheets.
- `dts` suitable for devicetree (DTS) files.
- `fortran` suitable for source code in the Fortran language.
- `fountain` suitable for Fountain documents.

View File

@ -31,6 +31,7 @@ diffpatterns="
cpp
csharp
css
dts
fortran
fountain
golang

9
t/t4018/dts-labels Normal file
View File

@ -0,0 +1,9 @@
/ {
label_1: node1@ff00 {
label2: RIGHT {
vendor,some-property;
ChangeMe = <0x45-30>;
};
};
};

View File

@ -0,0 +1,8 @@
/ {
label_1: node1 {
RIGHT {
prop-array = <1>, <4>;
ChangeMe = <0xffeedd00>;
};
};
};

8
t/t4018/dts-nodes Normal file
View File

@ -0,0 +1,8 @@
/ {
label_1: node1@ff00 {
RIGHT@deadf00,4000 {
#size-cells = <1>;
ChangeMe = <0xffeedd00>;
};
};
};

View File

@ -0,0 +1,8 @@
/ {
label_1: node1@ff00 {
RIGHT@deadf00,4000 /* &a comment */ {
#size-cells = <1>;
ChangeMe = <0xffeedd00>;
};
};
};

View File

@ -0,0 +1,8 @@
/ {
label_1: node1@ff00 {
RIGHT@deadf00,4000 { /* a trailing comment */
#size-cells = <1>;
ChangeMe = <0xffeedd00>;
};
};
};

9
t/t4018/dts-reference Normal file
View File

@ -0,0 +1,9 @@
&label_1 {
TEST = <455>;
};
&RIGHT {
vendor,some-property;
ChangeMe = <0x45-30>;
};

5
t/t4018/dts-root Normal file
View File

@ -0,0 +1,5 @@
/RIGHT { /* Technically just supposed to be a slash */
#size-cells = <1>;
ChangeMe = <0xffeedd00>;
};

View File

@ -303,6 +303,7 @@ test_language_driver bibtex
test_language_driver cpp
test_language_driver csharp
test_language_driver css
test_language_driver dts
test_language_driver fortran
test_language_driver html
test_language_driver java

37
t/t4034/dts/expect Normal file
View File

@ -0,0 +1,37 @@
<BOLD>diff --git a/pre b/post<RESET>
<BOLD>index b6a9051..7803aee 100644<RESET>
<BOLD>--- a/pre<RESET>
<BOLD>+++ b/post<RESET>
<CYAN>@@ -1,32 +1,32 @@<RESET>
/ {<RESET>
<RED>this_handle<RESET><GREEN>HANDLE_2<RESET>: <RED>node<RESET><GREEN>new-node<RESET>@<RED>f00<RESET><GREEN>eeda<RESET> {
compatible = "<RED>mydev<RESET><GREEN>vendor,compat<RESET>";
string-prop = <RED>start<RESET><GREEN>end<RESET>: "hello <RED>world!<RESET><GREEN>world?<RESET>" <RED>end<RESET><GREEN>start<RESET>: ;
<RED>#size-cells<RESET><GREEN>#address-cells<RESET> = <<RED>0+0<RESET><GREEN>0+40<RESET>>;
reg = <<RED>0xf00<RESET><GREEN>0xeeda<RESET>>;
prop = <<GREEN>(<RESET>1<GREEN>)<RESET>>;
prop = <<GREEN>(<RESET>-1e10<GREEN>)<RESET>>;
prop = <(!<RED>3<RESET><GREEN>1<RESET>)>;
prop = <(~<RED>3<RESET><GREEN>1<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>*<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>&<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>*<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>/<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>%<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3+4<RESET><GREEN>1+2<RESET>)>;
prop = <(<RED>3-4<RESET><GREEN>1-2<RESET>)>;
prop = /bits/ <RED>64<RESET><GREEN>32<RESET> <(<RED>3<RESET><GREEN>1<RESET><<<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>>><RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>&<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>^<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>|<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>&&<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>3<RESET><GREEN>1<RESET>||<RED>4<RESET><GREEN>2<RESET>)>;
prop = <(<RED>4?5<RESET><GREEN>1?2<RESET>:3)>;
list = <&<RED>this_handle<RESET><GREEN>HANDLE_2<RESET>>, <0 0 0 <RED>0<RESET><GREEN>1<RESET>>;
};<RESET>
&<RED>phandle<RESET><GREEN>phandle2<RESET> {
<RED>pre-phandle<RESET><GREEN>prop_handle<RESET> = <&<RED>this_handle<RESET><GREEN>HANDLE_2<RESET>>;
};<RESET>
};<RESET>

32
t/t4034/dts/post Normal file
View File

@ -0,0 +1,32 @@
/ {
HANDLE_2: new-node@eeda {
compatible = "vendor,compat";
string-prop = end: "hello world?" start: ;
#address-cells = <0+40>;
reg = <0xeeda>;
prop = <(1)>;
prop = <(-1e10)>;
prop = <(!1)>;
prop = <(~1)>;
prop = <(1*2)>;
prop = <(1&2)>;
prop = <(1*2)>;
prop = <(1/2)>;
prop = <(1%2)>;
prop = <(1+2)>;
prop = <(1-2)>;
prop = /bits/ 32 <(1<<2)>;
prop = <(1>>2)>;
prop = <(1&2)>;
prop = <(1^2)>;
prop = <(1|2)>;
prop = <(1&&2)>;
prop = <(1||2)>;
prop = <(1?2:3)>;
list = <&HANDLE_2>, <0 0 0 1>;
};
&phandle2 {
prop_handle = <&HANDLE_2>;
};
};

32
t/t4034/dts/pre Normal file
View File

@ -0,0 +1,32 @@
/ {
this_handle: node@f00 {
compatible = "mydev";
string-prop = start: "hello world!" end: ;
#size-cells = <0+0>;
reg = <0xf00>;
prop = <1>;
prop = <-1e10>;
prop = <(!3)>;
prop = <(~3)>;
prop = <(3*4)>;
prop = <(3&4)>;
prop = <(3*4)>;
prop = <(3/4)>;
prop = <(3%4)>;
prop = <(3+4)>;
prop = <(3-4)>;
prop = /bits/ 64 <(3<<4)>;
prop = <(3>>4)>;
prop = <(3&4)>;
prop = <(3^4)>;
prop = <(3|4)>;
prop = <(3&&4)>;
prop = <(3||4)>;
prop = <(4?5:3)>;
list = <&this_handle>, <0 0 0 0>;
};
&phandle {
pre-phandle = <&this_handle>;
};
};

View File

@ -23,6 +23,14 @@ IPATTERN("ada",
"[a-zA-Z][a-zA-Z0-9_]*"
"|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?"
"|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"),
PATTERNS("dts",
"!;\n"
/* lines beginning with a word optionally preceded by '&' or the root */
"^[ \t]*((/|&?[a-zA-Z_]).*)",
/* -- */
/* Property names and math operators */
"[a-zA-Z0-9,._+?#-]+"
"|[-+*/%&^|!~]|>>|<<|&&|\\|\\|"),
IPATTERN("fortran",
"!^([C*]|[ \t]*!)\n"
"!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n"