зеркало из https://github.com/microsoft/git.git
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:
Родитель
69986e19ff
Коммит
2ff6c34612
|
@ -802,6 +802,9 @@ patterns are available:
|
||||||
|
|
||||||
- `ada` suitable for source code in the Ada language.
|
- `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.
|
- `bibtex` suitable for files with BibTeX coded references.
|
||||||
|
|
||||||
- `cpp` suitable for source code in the C and C++ languages.
|
- `cpp` suitable for source code in the C and C++ languages.
|
||||||
|
|
|
@ -27,6 +27,7 @@ test_expect_success 'setup' '
|
||||||
|
|
||||||
diffpatterns="
|
diffpatterns="
|
||||||
ada
|
ada
|
||||||
|
bash
|
||||||
bibtex
|
bibtex
|
||||||
cpp
|
cpp
|
||||||
csharp
|
csharp
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT() ((
|
||||||
|
|
||||||
|
ChangeMe = "$x" + "$y"
|
||||||
|
))
|
|
@ -0,0 +1,6 @@
|
||||||
|
function RIGHT {
|
||||||
|
function InvalidSyntax{
|
||||||
|
:
|
||||||
|
echo 'ChangeMe'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
function RIGHT {
|
||||||
|
:
|
||||||
|
echo 'ChangeMe'
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
function RIGHT ( ) {
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT() [[ \
|
||||||
|
|
||||||
|
"$a" > "$ChangeMe"
|
||||||
|
]]
|
|
@ -0,0 +1,6 @@
|
||||||
|
function RIGHT {
|
||||||
|
functionInvalidSyntax {
|
||||||
|
:
|
||||||
|
echo 'ChangeMe'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
function RIGHT(){
|
||||||
|
:
|
||||||
|
echo 'ChangeMe'
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
function RIGHT() {
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
outer() {
|
||||||
|
RIGHT() {
|
||||||
|
:
|
||||||
|
echo 'ChangeMe'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
_RIGHT_0n() {
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT(){
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT() {
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT ( ) {
|
||||||
|
|
||||||
|
ChangeMe
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
RIGHT() (
|
||||||
|
|
||||||
|
ChangeMe=2
|
||||||
|
)
|
|
@ -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_]*"
|
"[a-zA-Z][a-zA-Z0-9_]*"
|
||||||
"|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-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",
|
PATTERNS("dts",
|
||||||
"!;\n"
|
"!;\n"
|
||||||
"!=\n"
|
"!=\n"
|
||||||
|
|
Загрузка…
Ссылка в новой задаче