git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[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 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@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
Previous: MoumitaNext: Johannes Sixt
Message 2 of 37 in “[GSOC 2025] [Newbie] userdiff: add built-in pattern for shell scripts”
  1. 0/1 [GSOC 2025] [Newbie] userdiff: add built-in pattern for shell scriptsMoumita, Feb 11, 2025
  2. 1/1 Added built in function recognition for shellMoumita, Feb 11, 2025
  3. Johannes SixtFeb 15, 2025
  4. 0/1 [PATCH v2 0/1] [GSOC 2025] [Newbie] userdiff: add built-in pattern for shell scriptsMoumita, Feb 18, 2025
  5. 1/1 userdiff: extend Bash pattern to cover more shell function formsMoumita, Feb 18, 2025
  6. Junio C HamanoFeb 18, 2025
  7. Johannes SixtFeb 22, 2025
  8. Junio C HamanoFeb 24, 2025
  9. Junio C HamanoFeb 18, 2025
  10. Johannes SixtFeb 22, 2025
  11. Eric SunshineFeb 18, 2025
  12. 0/1 userdiff: improve Bash function and word regex patternsMoumita, Mar 28, 2025
  13. 1/1 userdiff: extend Bash pattern to cover more shell function formsMoumita, Mar 28, 2025
  14. Junio C HamanoMar 29, 2025
  15. MOUMITA DHARMar 30, 2025
  16. 0/1 [GSOC] userdiff:Added newlines at the end of the test casesMoumita, Mar 30, 2025
  17. 1/1 [GSOC] userdiff: extend Bash pattern to cover more shell function formsMoumita, Mar 30, 2025
  18. Junio C HamanoMay 2, 2025
  19. Johannes SixtMay 6, 2025
  20. MOUMITA DHARMay 10, 2025
  21. Johannes SixtMay 10, 2025
  22. 0/1 Added the closing ")" to make sure is not unbalanced and corrected the tests for word diffMoumita, May 11, 2025
  23. 1/1 userdiff: extend Bash pattern to cover more shell function formsMoumita, May 11, 2025
  24. Moumita, May 11, 2025
  25. Moumita, May 11, 2025
  26. Moumita, May 11, 2025
  27. 0/1 Added the newline after the test in t/4018Moumita, May 11, 2025
  28. 1/1 userdiff: extend Bash pattern to cover more shell function formsMoumita, May 11, 2025
  29. Junio C HamanoMay 13, 2025
  30. MOUMITA DHARMay 14, 2025
  31. Johannes SixtMay 16, 2025
  32. Junio C HamanoMay 17, 2025
  33. Johannes SixtMay 18, 2025
  34. 0/1 Updated the word diff regex for Bash scriptsMoumita, May 16, 2025
  35. 1/1 userdiff: extend Bash pattern to cover more shell function formsMoumita, May 16, 2025
  36. Johannes SixtMay 16, 2025
  37. Junio C HamanoMay 16, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.