From: Ivan Tham Date: Thu, 30 Mar 2017 18:08:29 GMT Subject: [PATCH v2] userdiff: add build-in pattern for shell Message-ID: <20170330180829.27879-1-pickfire@riseup.net> In-Reply-To: <20170329165331.17742-1-pickfire@riseup.net> Shell are widely used but comes with lots of different patterns. The build-in pattern aim for POSIX-like shells with some additions: - Notably ${g//re/s} and ${g#cut} - Bashisms such as "function" Signed-off-by: Ivan Tham --- Documentation/gitattributes.txt | 2 ++ t/t4034-diff-words.sh | 1 + t/t4034/sh/expect | 14 ++++++++++++++ t/t4034/sh/post | 7 +++++++ t/t4034/sh/pre | 7 +++++++ userdiff.c | 5 +++++ 6 files changed, 36 insertions(+) create mode 100644 t/t4034/sh/expect create mode 100644 t/t4034/sh/post create mode 100644 t/t4034/sh/pre diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index a53d093ca..f8440119d 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -706,6 +706,8 @@ patterns are available: - `ruby` suitable for source code in the Ruby language. +- `sh` suitable for source code in POSIX-like shells. + - `tex` suitable for source code for LaTeX documents. diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh index 912df9122..2eb662f89 100755 --- a/t/t4034-diff-words.sh +++ b/t/t4034-diff-words.sh @@ -313,6 +313,7 @@ test_language_driver perl test_language_driver php test_language_driver python test_language_driver ruby +test_language_driver sh test_language_driver tex test_expect_success 'word-diff with diff.sbe' ' diff --git a/t/t4034/sh/expect b/t/t4034/sh/expect new file mode 100644 index 000000000..e7b0a9ae3 --- /dev/null +++ b/t/t4034/sh/expect @@ -0,0 +1,14 @@ +diff --git a/pre b/post +index 7bb0d15..df3845b 100644 +--- a/pre ++++ b/post +@@ -1,7 +1,7 @@ +echo "Hello world! +bomb?" +fork(){ bombfork|bombfork& } +; bomb +ax=1 a2 x=$((ax+12)) ax=$((a-1x-2)) ax=$((ax*12)) ax=$((ax/12)) +ax=$(ax) ax=`ax` ax=${ax#ax*} ax=${ax%ax*} ax=${ax//ax/ax} +command -h -v--help=all -q | xargs -- echo 2>&1 &/dev/null +[ $a -eq $b$x -ne $y ]&&echo aaxx||echo bbyy +[ "$a$x"!=12 ] && echo ax || echo by diff --git a/t/t4034/sh/post b/t/t4034/sh/post new file mode 100644 index 000000000..df3845b4f --- /dev/null +++ b/t/t4034/sh/post @@ -0,0 +1,7 @@ +echo "Hello world?" +fork(){ fork|fork& } +x=2 x=$((x+2)) x=$((x-2)) x=$((x*2)) x=$((x/2)) +x=$(x) x=`x` x=${x#x*} x=${x%x*} x=${x//x/x} +command --help=all -q | xargs -- echo 2>/dev/null +[ $x -ne $y ]&&echo xx||echo yy +[ "$x"!=2 ] && echo x || echo y diff --git a/t/t4034/sh/pre b/t/t4034/sh/pre new file mode 100644 index 000000000..7bb0d1562 --- /dev/null +++ b/t/t4034/sh/pre @@ -0,0 +1,7 @@ +echo Hello world! +bomb(){ bomb|bomb& }; bomb +a=1 a=$((a+1)) a=$((a-1)) a=$((a*1)) a=$((a/1)) +a=$(a) a=`a` a=${a#a*} a=${a%a*} a=${a//a/a} +command -h -v | xargs -- echo >&1 & +[ $a -eq $b ]&&echo aa||echo bb +[ "$a"!=1 ] && echo a || echo b diff --git a/userdiff.c b/userdiff.c index 8b732e40b..72ffd85f1 100644 --- a/userdiff.c +++ b/userdiff.c @@ -148,6 +148,11 @@ PATTERNS("csharp", "[a-zA-Z_][a-zA-Z0-9_]*" "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?" "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), +PATTERNS("sh", + "^[ \t]*(function )?[A-Za-z_][A-Za-z_0-9]*[ \t]*\\(\\)[\t]*\\{?$", + /* -- */ + "(\\$|--?)?([a-zA-Z_][a-zA-Z0-9._]*|[0-9]+|#|\\?)|--" /* command/param */ + "|\\$[({]|[)}]|[-+*/=!]=?|[\\]&%#/|]{1,2}|[<>]{1,3}|[ \t]#.*"), IPATTERN("css", "![:;][[:space:]]*$\n" "^[_a-z0-9].*$", -- 2.12.2.609.gf7d0c115f