[PATCH 1/1] Added built in function recognition for shell
- From
Moumita <dhar61595@gmail.com>
- Date
- Feb 11, 2025, 11:46 UTC
- Message-ID
- <20250211114611.9334-2-dhar61595@gmail.com>
- In-Reply-To
- <20250211114611.9334-1-dhar61595@gmail.com>
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 symbolsThis update improves Git’s diff readability for shell scripts, bringing it in line with existing built-in userdiff drivers.
Signed-off-by: Moumita <dhar61595@gmail.com> --- 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