]> git.ipfire.org Git - thirdparty/git.git/commitdiff
userdiff: extend Bash pattern to cover more shell function forms
authorMoumita Dhar <dhar61595@gmail.com>
Fri, 16 May 2025 14:45:12 +0000 (20:15 +0530)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 May 2025 18:52:41 +0000 (11:52 -0700)
The previous function regex required explicit matching of function
bodies using `{`, `(`, `((`, or `[[`, which caused several issues:

- It failed to capture valid functions where `{` was on the next line
  due to line continuation (`\`).
- It did not recognize functions with single  command body, such as
  `x () echo hello`.

Replacing the function body matching logic with `.*$`, ensures
that everything on the function definition line is captured.

Additionally, the word regex is refined to better recognize shell
syntax, including additional parameter expansion operators and
command-line options.

Signed-off-by: Moumita Dhar <dhar61595@gmail.com>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4018/bash-bashism-style-complete-line-capture [new file with mode: 0644]
t/t4018/bash-posix-style-complete-line-capture [new file with mode: 0644]
t/t4018/bash-posix-style-single-command-function [new file with mode: 0644]
t/t4034-diff-words.sh
t/t4034/bash/expect [new file with mode: 0644]
t/t4034/bash/post [new file with mode: 0644]
t/t4034/bash/pre [new file with mode: 0644]
userdiff.c

diff --git a/t/t4018/bash-bashism-style-complete-line-capture b/t/t4018/bash-bashism-style-complete-line-capture
new file mode 100644 (file)
index 0000000..070b979
--- /dev/null
@@ -0,0 +1,4 @@
+function myfunc # RIGHT
+{
+    echo 'ChangeMe'
+}
diff --git a/t/t4018/bash-posix-style-complete-line-capture b/t/t4018/bash-posix-style-complete-line-capture
new file mode 100644 (file)
index 0000000..b56942f
--- /dev/null
@@ -0,0 +1,4 @@
+func() { # RIGHT
+
+    ChangeMe
+}
diff --git a/t/t4018/bash-posix-style-single-command-function b/t/t4018/bash-posix-style-single-command-function
new file mode 100644 (file)
index 0000000..398ae1c
--- /dev/null
@@ -0,0 +1,3 @@
+RIGHT() echo "hello"
+
+    ChangeMe
index f51d3557f101cf515f620d58e9284f0f06890022..0be647c2fbc05c3a81fd76647037d91f20dcd79b 100755 (executable)
@@ -320,6 +320,7 @@ test_expect_success 'unset default driver' '
 
 test_language_driver ada
 test_language_driver bibtex
+test_language_driver bash
 test_language_driver cpp
 test_language_driver csharp
 test_language_driver css
diff --git a/t/t4034/bash/expect b/t/t4034/bash/expect
new file mode 100644 (file)
index 0000000..1864ab2
--- /dev/null
@@ -0,0 +1,36 @@
+<BOLD>diff --git a/pre b/post<RESET>
+<BOLD>index 09ac008..60ba6a2 100644<RESET>
+<BOLD>--- a/pre<RESET>
+<BOLD>+++ b/post<RESET>
+<CYAN>@@ -1,31 +1,31 @@<RESET>
+<RED>my_var<RESET><GREEN>new_var<RESET>=10
+x=<RED>123<RESET><GREEN>456<RESET>
+echo <RED>$1<RESET><GREEN>$2<RESET>
+echo <RED>$USER<RESET><GREEN>$USERNAME<RESET>
+${<RED>HOME<RESET><GREEN>HOMEDIR<RESET>}
+((a<RED>+<RESET><GREEN>+=<RESET>b))
+((a<RED>*<RESET><GREEN>*=<RESET>b))
+((a<RED>/<RESET><GREEN>/=<RESET>b))
+((a<RED>%<RESET><GREEN>%=<RESET>b))
+((a<RED>|<RESET><GREEN>|=<RESET>b))
+((a<RED>^<RESET><GREEN>^=<RESET>b))
+((a<RED>=<RESET><GREEN>==<RESET>b))
+((a<RED>!<RESET><GREEN>!=<RESET>b))
+((a<RED><<RESET><GREEN><=<RESET>b))
+((a<RED>><RESET><GREEN>>=<RESET>b))
+$((a<RED><<RESET><GREEN><<<RESET>b))
+$((a<RED>><RESET><GREEN>>><RESET>b))
+$((a<RED>&<RESET><GREEN>&&<RESET>b))
+$((a<RED>|<RESET><GREEN>||<RESET>b))
+${a<RED>:<RESET><GREEN>:-<RESET>b}
+${a<RED>:<RESET><GREEN>:=<RESET>b}
+${a<RED>:<RESET><GREEN>:+<RESET>b}
+${a<RED>:<RESET><GREEN>:?<RESET>b}
+${a<RED>#<RESET><GREEN>##<RESET>*/}
+${a<RED>%<RESET><GREEN>%%<RESET>.*}
+${a<RED>^<RESET><GREEN>^^<RESET>}
+${a<RED>,<RESET><GREEN>,,<RESET>}
+${<GREEN>!<RESET>a}
+${a[<RED>*<RESET><GREEN>@<RESET>]}
+ls <RED>-a<RESET><GREEN>-x<RESET>
+ls <RED>--all<RESET><GREEN>--color<RESET>
diff --git a/t/t4034/bash/post b/t/t4034/bash/post
new file mode 100644 (file)
index 0000000..2bbee89
--- /dev/null
@@ -0,0 +1,31 @@
+new_var=10
+x=456
+echo $2
+echo $USERNAME
+${HOMEDIR}
+((a+=b))
+((a*=b))
+((a/=b))
+((a%=b))
+((a|=b))
+((a^=b))
+((a==b))
+((a!=b))
+((a<=b))
+((a>=b))
+$((a<<b))
+$((a>>b))
+$((a&&b))
+$((a||b))
+${a:-b}
+${a:=b}
+${a:+b}
+${a:?b}
+${a##*/}
+${a%%.*}
+${a^^}
+${a,,}
+${!a}
+${a[@]}
+ls -x
+ls --color
diff --git a/t/t4034/bash/pre b/t/t4034/bash/pre
new file mode 100644 (file)
index 0000000..8d22039
--- /dev/null
@@ -0,0 +1,31 @@
+my_var=10
+x=123
+echo $1
+echo $USER
+${HOME}
+((a+b))
+((a*b))
+((a/b))
+((a%b))
+((a|b))
+((a^b))
+((a=b))
+((a!b))
+((a<b))
+((a>b))
+$((a<b))
+$((a>b))
+$((a&b))
+$((a|b))
+${a:b}
+${a:b}
+${a:b}
+${a:b}
+${a#*/}
+${a%.*}
+${a^}
+${a,}
+${a}
+${a[*]}
+ls -a
+ls --all
index da75625020e34c9016ec84c63aa5050d9172d750..05776ccd10401c0066ea59213c42751fe40a71e4 100644 (file)
@@ -59,20 +59,30 @@ PATTERNS("bash",
         "("
         "("
             /* POSIX identifier with mandatory parentheses */
-            "[a-zA-Z_][a-zA-Z0-9_]*[ \t]*\\([ \t]*\\))"
+            "([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]+))"
+            "(function[ \t]+[a-zA-Z_][a-zA-Z0-9_]*(([ \t]*\\([ \t]*\\))|([ \t]+)))"
         ")"
-        /* Optional whitespace */
-        "[ \t]*"
-        /* Compound command starting with `{`, `(`, `((` or `[[` */
-        "(\\{|\\(\\(?|\\[\\[)"
+        /* Everything after the function header is captured  */
+        ".*$"
         /* End of captured text */
         ")",
         /* -- */
-        /* Characters not in the default $IFS value */
-        "[^ \t]+"),
+        /* Identifiers: variable and function names */
+         "[a-zA-Z_][a-zA-Z0-9_]*"
+        /* Shell variables: $VAR, ${VAR} */
+         "|\\$[a-zA-Z0-9_]+|\\$\\{"
+         /*Command list separators and redirection operators  */
+        "|\\|\\||&&|<<|>>"
+        /* Operators ending in '=' (comparison + compound assignment) */
+        "|==|!=|<=|>=|[-+*/%&|^]="
+        /* Additional parameter expansion operators */
+        "|:=|:-|:\\+|:\\?|##|%%|\\^\\^|,,"
+        /* Command-line options (to avoid splitting -option) */
+        "|[-a-zA-Z0-9_]+"
+        /* Brackets and grouping symbols */
+        "|\\(|\\)|\\{|\\}|\\[|\\]"),
 PATTERNS("bibtex",
         "(@[a-zA-Z]{1,}[ \t]*\\{{0,1}[ \t]*[^ \t\"@',\\#}{~%]*).*$",
         /* -- */