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:
parent
69986e19ff
commit
2ff6c34612
@ -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.
|
||||
|
@ -27,6 +27,7 @@ test_expect_success 'setup' '
|
||||
|
||||
diffpatterns="
|
||||
ada
|
||||
bash
|
||||
bibtex
|
||||
cpp
|
||||
csharp
|
||||
|
4
t/t4018/bash-arithmetic-function
Normal file
4
t/t4018/bash-arithmetic-function
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT() ((
|
||||
|
||||
ChangeMe = "$x" + "$y"
|
||||
))
|
6
t/t4018/bash-bashism-style-compact
Normal file
6
t/t4018/bash-bashism-style-compact
Normal file
@ -0,0 +1,6 @@
|
||||
function RIGHT {
|
||||
function InvalidSyntax{
|
||||
:
|
||||
echo 'ChangeMe'
|
||||
}
|
||||
}
|
4
t/t4018/bash-bashism-style-function
Normal file
4
t/t4018/bash-bashism-style-function
Normal file
@ -0,0 +1,4 @@
|
||||
function RIGHT {
|
||||
:
|
||||
echo 'ChangeMe'
|
||||
}
|
4
t/t4018/bash-bashism-style-whitespace
Normal file
4
t/t4018/bash-bashism-style-whitespace
Normal file
@ -0,0 +1,4 @@
|
||||
function RIGHT ( ) {
|
||||
|
||||
ChangeMe
|
||||
}
|
4
t/t4018/bash-conditional-function
Normal file
4
t/t4018/bash-conditional-function
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT() [[ \
|
||||
|
||||
"$a" > "$ChangeMe"
|
||||
]]
|
6
t/t4018/bash-missing-parentheses
Normal file
6
t/t4018/bash-missing-parentheses
Normal file
@ -0,0 +1,6 @@
|
||||
function RIGHT {
|
||||
functionInvalidSyntax {
|
||||
:
|
||||
echo 'ChangeMe'
|
||||
}
|
||||
}
|
4
t/t4018/bash-mixed-style-compact
Normal file
4
t/t4018/bash-mixed-style-compact
Normal file
@ -0,0 +1,4 @@
|
||||
function RIGHT(){
|
||||
:
|
||||
echo 'ChangeMe'
|
||||
}
|
4
t/t4018/bash-mixed-style-function
Normal file
4
t/t4018/bash-mixed-style-function
Normal file
@ -0,0 +1,4 @@
|
||||
function RIGHT() {
|
||||
|
||||
ChangeMe
|
||||
}
|
6
t/t4018/bash-nested-functions
Normal file
6
t/t4018/bash-nested-functions
Normal file
@ -0,0 +1,6 @@
|
||||
outer() {
|
||||
RIGHT() {
|
||||
:
|
||||
echo 'ChangeMe'
|
||||
}
|
||||
}
|
4
t/t4018/bash-other-characters
Normal file
4
t/t4018/bash-other-characters
Normal file
@ -0,0 +1,4 @@
|
||||
_RIGHT_0n() {
|
||||
|
||||
ChangeMe
|
||||
}
|
4
t/t4018/bash-posix-style-compact
Normal file
4
t/t4018/bash-posix-style-compact
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT(){
|
||||
|
||||
ChangeMe
|
||||
}
|
4
t/t4018/bash-posix-style-function
Normal file
4
t/t4018/bash-posix-style-function
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT() {
|
||||
|
||||
ChangeMe
|
||||
}
|
4
t/t4018/bash-posix-style-whitespace
Normal file
4
t/t4018/bash-posix-style-whitespace
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT ( ) {
|
||||
|
||||
ChangeMe
|
||||
}
|
4
t/t4018/bash-subshell-function
Normal file
4
t/t4018/bash-subshell-function
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT() (
|
||||
|
||||
ChangeMe=2
|
||||
)
|
4
t/t4018/bash-trailing-comment
Normal file
4
t/t4018/bash-trailing-comment
Normal file
@ -0,0 +1,4 @@
|
||||
RIGHT() { # Comment
|
||||
|
||||
ChangeMe
|
||||
}
|
21
userdiff.c
21
userdiff.c
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user