I wrapped the POSIX function pattern in an extra set of parentheses and added a closing parenthesis in the Bashism function case to balance the opening group ,this makes the grouping explicit and consistent with the outer structure of the regex. Also I added the test case so that everything on the function definition line is captured correctly. And corrected the word diff test so that the operators like '+=' are treated as a single token. Moumita Dhar (1): userdiff: extend Bash pattern to cover more shell function forms t/t4018/bash-bashism-style-multiline-function | 4 ++ .../bash-hunk-header-complete-line-capture | 4 ++ t/t4018/bash-posix-style-multiline-function | 4 ++ .../bash-posix-style-single-command-function | 3 ++ t/t4034-diff-words.sh | 1 + t/t4034/bash/expect | 38 +++++++++++++++++++ t/t4034/bash/post | 33 ++++++++++++++++ t/t4034/bash/pre | 33 ++++++++++++++++ userdiff.c | 28 ++++++++++---- 9 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 t/t4018/bash-bashism-style-multiline-function create mode 100644 t/t4018/bash-hunk-header-complete-line-capture create mode 100644 t/t4018/bash-posix-style-multiline-function create mode 100644 t/t4018/bash-posix-style-single-command-function create mode 100644 t/t4034/bash/expect create mode 100644 t/t4034/bash/post create mode 100644 t/t4034/bash/pre Range-diff against v4: 1: 40cffd3b4a ! 1: 478b77e0c8 userdiff: extend Bash pattern to cover more shell function forms @@ Commit message `x () echo hello`. Replacing the function body matching logic with `.*$`, ensures - that everything on the function definition line is captured, - aligning with other userdiff drivers and improving hunk headers in - `git diff`. + 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, improving syntax-aware diffs. + command-line options. Signed-off-by: Moumita Dhar <dhar61595@xxxxxxxxx> @@ t/t4018/bash-bashism-style-multiline-function (new) + echo 'ChangeMe' +} + ## t/t4018/bash-hunk-header-complete-line-capture (new) ## +@@ ++func() { # RIGHT ++ ++ ChangeMe ++} + \ No newline at end of file + ## t/t4018/bash-posix-style-multiline-function (new) ## @@ +RIGHT() \ @@ t/t4034/bash/expect (new) +<BOLD>index 09ac008..60ba6a2 100644<RESET> +<BOLD>--- a/pre<RESET> +<BOLD>+++ b/post<RESET> -+<CYAN>@@ -1,25 +1,25 @@<RESET> ++<CYAN>@@ -1,33 +1,33 @@<RESET> +<RED>my_var<RESET><GREEN>new_var<RESET>=10 +x=<RED>123<RESET><GREEN>456<RESET> +y=<RED>3.14<RESET><GREEN>2.71<RESET> +z=<RED>.5<RESET><GREEN>.75<RESET> +echo <RED>$USER<RESET><GREEN>$USERNAME<RESET> +${<RED>HOME<RESET><GREEN>HOMEDIR<RESET>} -+if [ "<RED>$a<RESET><GREEN>$x<RESET>" == "<RED>$b<RESET><GREEN>$y<RESET>" ] || [ "<RED>$c<RESET><GREEN>$x<RESET>" != "<RED>$d<RESET><GREEN>$y<RESET>" ]; then echo "OK"; fi -+((<RED>a<RESET><GREEN>x<RESET>+=<RED>b<RESET><GREEN>y<RESET>)) -+((<RED>a<RESET><GREEN>x<RESET>-=<RED>b<RESET><GREEN>y<RESET>)) -+$((<RED>a<RESET><GREEN>x<RESET><<<RED>b<RESET><GREEN>y<RESET>)) -+$((<RED>a<RESET><GREEN>x<RESET>>><RED>b<RESET><GREEN>y<RESET>)) -+${<RED>a<RESET><GREEN>x<RESET>:-<RED>b<RESET><GREEN>y<RESET>} -+${<RED>a<RESET><GREEN>x<RESET>:=<RED>b<RESET><GREEN>y<RESET>} -+${<RED>a<RESET><GREEN>x<RESET>##*/} -+${<RED>a<RESET><GREEN>x<RESET>%.*} -+${<RED>a<RESET><GREEN>x<RESET>%%.*} -+${<RED>a<RESET><GREEN>x<RESET>^^} -+${<RED>a<RESET><GREEN>x<RESET>,} -+${<RED>a<RESET><GREEN>x<RESET>,,} -+${!<RED>a<RESET><GREEN>x<RESET>} -+${<RED>a<RESET><GREEN>x<RESET>[@]} -+${<RED>a<RESET><GREEN>x<RESET>:?error message} -+${<RED>a<RESET><GREEN>x<RESET>:2:3} ++((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>]} ++${a<RED>:2:3<RESET><GREEN>:4:6<RESET>} +ls <RED>-a<RESET><GREEN>-x<RESET> +ls <RED>--a<RESET><GREEN>--x<RESET> @@ t/t4034/bash/post (new) +z=.75 +echo $USERNAME +${HOMEDIR} -+if [ "$x" == "$y" ] || [ "$x" != "$y" ]; then echo "OK"; fi -+((x+=y)) -+((x-=y)) -+$((x<<y)) -+$((x>>y)) -+${x:-y} -+${x:=y} -+${x##*/} -+${x%.*} -+${x%%.*} -+${x^^} -+${x,} -+${x,,} -+${!x} -+${x[@]} -+${x:?error message} -+${x:2:3} ++((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[@]} ++${a:4:6} +ls -x +ls --x @@ t/t4034/bash/pre (new) +z=.5 +echo $USER +${HOME} -+if [ "$a" == "$b" ] || [ "$c" != "$d" ]; then echo "OK"; fi -+((a+=b)) -+((a-=b)) -+$((a << b)) -+$((a >> b)) -+${a:-b} -+${a:=b} -+${a##*/} ++((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,} -+${a,,} -+${!a} -+${a[@]} -+${a:?error message} ++${a} ++${a[*]} +${a:2:3} +ls -a +ls --a ## userdiff.c ## @@ userdiff.c: 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]+))" ++ "(function[ \t]+[a-zA-Z_][a-zA-Z0-9_]*(([ \t]*\\([ \t]*\\))|([ \t]+)))" ")" - /* Optional whitespace */ - "[ \t]*" @@ userdiff.c: PATTERNS("bash", + /* Assignment and arithmetic operators */ + "|[-+*/%&|^!=<>]=?" + /* Additional parameter expansion operators */ -+ "|:?=|:-|:\\+|:\\?|:|#|##|%|%%|/[a-zA-Z0-9_-]+|\\^\\^?|,|,,?|!|@|:[0-9]+(:[0-9]+)?" ++ "|:?=|:-|:\\+|:\\?|:|#|##|%|%%|\\^\\^?|,|,,?|!|@|:[0-9]+(:[0-9]+)?" + /* Command-line options (to avoid splitting -option) */ + "|--?[a-zA-Z0-9_-]+" + /* Brackets and grouping symbols */ -- 2.48.0