userdiff: support Bash

Support POSIX, bashism and mixed function declarations, all four
compound command types, trailing comments and mixed whitespace.

Even though Bash allows locale-dependent characters in function names
<https://unix.stackexchange.com/a/245336/3645>, only detect function
names with characters allowed by POSIX.1-2017
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_235>
for simplicity. This should cover the vast majority of use cases, and
produces system-agnostic results.

Since a word pattern has to be specified, but there is no easy way to
know the default word pattern, use the default `IFS` characters for a
starter. A later patch can improve this.

Signed-off-by: Victor Engmark <victor@engmark.name>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Victor Engmark 2020-10-22 12:45:08 +13:00 committed by Junio C Hamano
parent 69986e19ff
commit 2ff6c34612
18 changed files with 91 additions and 0 deletions

View File

@ -802,6 +802,9 @@ patterns are available:
- `ada` suitable for source code in the Ada language.
- `bash` suitable for source code in the Bourne-Again SHell language.
Covers a superset of POSIX shell function definitions.
- `bibtex` suitable for files with BibTeX coded references.
- `cpp` suitable for source code in the C and C++ languages.

View File

@ -27,6 +27,7 @@ test_expect_success 'setup' '
diffpatterns="
ada
bash
bibtex
cpp
csharp

View File

@ -0,0 +1,4 @@
RIGHT() ((
ChangeMe = "$x" + "$y"
))

View File

@ -0,0 +1,6 @@
function RIGHT {
function InvalidSyntax{
:
echo 'ChangeMe'
}
}

View File

@ -0,0 +1,4 @@
function RIGHT {
:
echo 'ChangeMe'
}

View File

@ -0,0 +1,4 @@
function RIGHT ( ) {
ChangeMe
}

View File

@ -0,0 +1,4 @@
RIGHT() [[ \
"$a" > "$ChangeMe"
]]

View File

@ -0,0 +1,6 @@
function RIGHT {
functionInvalidSyntax {
:
echo 'ChangeMe'
}
}

View File

@ -0,0 +1,4 @@
function RIGHT(){
:
echo 'ChangeMe'
}

View File

@ -0,0 +1,4 @@
function RIGHT() {
ChangeMe
}

View File

@ -0,0 +1,6 @@
outer() {
RIGHT() {
:
echo 'ChangeMe'
}
}

View File

@ -0,0 +1,4 @@
_RIGHT_0n() {
ChangeMe
}

View File

@ -0,0 +1,4 @@
RIGHT(){
ChangeMe
}

View File

@ -0,0 +1,4 @@
RIGHT() {
ChangeMe
}

View File

@ -0,0 +1,4 @@
RIGHT ( ) {
ChangeMe
}

View File

@ -0,0 +1,4 @@
RIGHT() (
ChangeMe=2
)

View File

@ -0,0 +1,4 @@
RIGHT() { # Comment
ChangeMe
}

View File

@ -23,6 +23,27 @@ IPATTERN("ada",
"[a-zA-Z][a-zA-Z0-9_]*"
"|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?"
"|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"),
PATTERNS("bash",
/* Optional leading indentation */
"^[ \t]*"
/* Start of captured text */
"("
"("
/* POSIX identifier with mandatory parentheses */
"[a-zA-Z_][a-zA-Z0-9_]*[ \t]*\\([ \t]*\\))"
"|"
/* Bashism identifier with optional parentheses */
"(function[ \t]+[a-zA-Z_][a-zA-Z0-9_]*(([ \t]*\\([ \t]*\\))|([ \t]+))"
")"
/* Optional whitespace */
"[ \t]*"
/* Compound command starting with `{`, `(`, `((` or `[[` */
"(\\{|\\(\\(?|\\[\\[)"
/* End of captured text */
")",
/* -- */
/* Characters not in the default $IFS value */
"[^ \t]+"),
PATTERNS("dts",
"!;\n"
"!=\n"