Introduced a built-in userdiff driver for shell scripts, enabling accurate function name recognition in `git diff` hunk headers. Enhancements include: - Function name detection for both POSIX and Bash/Ksh-style functions: - `function_name() { ... }` - `function function_name { ... }` - Exclusion of shell keywords that can resemble function names, preventing false matches (e.g., `if`, `for`, `while`, `return`, etc.). - Improved tokenization support for: - Identifiers (variable and function names) - Numeric constants (integers and decimals) - Shell variables (`$VAR`, `${VAR}`) - Logical (`&&`, `||`, `==`, `!=`, `<=`, `>=`) and arithmetic operators - Assignment and redirection operators - Brackets and grouping symbols This update improves Git’s diff readability for shell scripts, bringing it in line with existing built-in userdiff drivers. Signed-off-by: Moumita <dhar61595@xxxxxxxxx> --- userdiff.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/userdiff.c b/userdiff.c index 340c4eb4f7..a8c14807c6 100644 --- a/userdiff.c +++ b/userdiff.c @@ -334,6 +334,26 @@ PATTERNS("scheme", "\\|([^\\\\]*)\\|" /* All other words should be delimited by spaces or parentheses */ "|([^][)(}{[ \t])+"), +PATTERNS("shell", + /* Negate shell keywords that can look like functions */ + "!^[ \t]*(if|elif|else|fi|for|while|until|case|esac|then|do|done|return|break|continue)\\b\n" + /* POSIX-style shell functions: function_name() { ... } */ + "^[ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*\\(\\)[ \t]*\\{\n" + /* Bash/Ksh-style functions: function function_name { ... } */ + "^[ \t]*function[ \t]+([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*\\{\n", + /* -- */ + /* Identifiers: variable and function names */ + "[a-zA-Z_][a-zA-Z0-9_]*" + /* Numeric constants: integers and decimals */ + "|[-+]?[0-9]+(\\.[0-9]*)?" + /* Shell variables: $VAR and ${VAR} */ + "|\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{[^}]+\\}" + /* Logical and comparison operators */ + "|\\|\\||&&|<<|>>|==|!=|<=|>=" + /* Assignment and arithmetic operators */ + "|[-+*/%&|^!=<>]=?" + /* Brackets and grouping symbols */ + "|\\(|\\)|\\{|\\}|\\[|\\]"), PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$", "\\\\[a-zA-Z@]+|\\\\.|([a-zA-Z0-9]|[^\x01-\x7f])+"), { .name = "default", .binary = -1 }, -- 2.48.0