userdiff: support Bash
Support POSIX, bashism and mixed function declarations, all four compound command types, trailing comments and mixed whitespace. Even though Bash allows locale-dependent characters in function names <https://unix.stackexchange.com/a/245336/3645>, only detect function names with characters allowed by POSIX.1-2017 <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_235> for simplicity. This should cover the vast majority of use cases, and produces system-agnostic results. Since a word pattern has to be specified, but there is no easy way to know the default word pattern, use the default `IFS` characters for a starter. A later patch can improve this. Signed-off-by: Victor Engmark <victor@engmark.name> Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									69986e19ff
								
							
						
					
					
						commit
						2ff6c34612
					
				|  | @ -802,6 +802,9 @@ patterns are available: | |||
|  | ||||
| - `ada` suitable for source code in the Ada language. | ||||
|  | ||||
| - `bash` suitable for source code in the Bourne-Again SHell language. | ||||
|   Covers a superset of POSIX shell function definitions. | ||||
|  | ||||
| - `bibtex` suitable for files with BibTeX coded references. | ||||
|  | ||||
| - `cpp` suitable for source code in the C and C++ languages. | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ test_expect_success 'setup' ' | |||
|  | ||||
| diffpatterns=" | ||||
| 	ada | ||||
| 	bash | ||||
| 	bibtex | ||||
| 	cpp | ||||
| 	csharp | ||||
|  |  | |||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT() (( | ||||
|  | ||||
|     ChangeMe = "$x" + "$y" | ||||
| )) | ||||
|  | @ -0,0 +1,6 @@ | |||
| function RIGHT { | ||||
|     function InvalidSyntax{ | ||||
|         : | ||||
|         echo 'ChangeMe' | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| function RIGHT { | ||||
|     : | ||||
|     echo 'ChangeMe' | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| 	 function 	RIGHT 	( 	) 	{ | ||||
|  | ||||
| 	    ChangeMe | ||||
| 	 } | ||||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT() [[ \ | ||||
|  | ||||
|     "$a" > "$ChangeMe" | ||||
| ]] | ||||
|  | @ -0,0 +1,6 @@ | |||
| function RIGHT { | ||||
|     functionInvalidSyntax { | ||||
|         : | ||||
|         echo 'ChangeMe' | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| function RIGHT(){ | ||||
|     : | ||||
|     echo 'ChangeMe' | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| function RIGHT() { | ||||
|  | ||||
|     ChangeMe | ||||
| } | ||||
|  | @ -0,0 +1,6 @@ | |||
| outer() { | ||||
|     RIGHT() { | ||||
|         : | ||||
|         echo 'ChangeMe' | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| _RIGHT_0n() { | ||||
|  | ||||
|     ChangeMe | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT(){ | ||||
|  | ||||
|     ChangeMe | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT() { | ||||
|  | ||||
|     ChangeMe | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| 	 RIGHT 	( 	) 	{ | ||||
|  | ||||
| 	    ChangeMe | ||||
| 	 } | ||||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT() ( | ||||
|  | ||||
|     ChangeMe=2 | ||||
| ) | ||||
|  | @ -0,0 +1,4 @@ | |||
| RIGHT() { # Comment | ||||
|  | ||||
|     ChangeMe | ||||
| } | ||||
							
								
								
									
										21
									
								
								userdiff.c
								
								
								
								
							
							
						
						
									
										21
									
								
								userdiff.c
								
								
								
								
							|  | @ -23,6 +23,27 @@ IPATTERN("ada", | |||
| 	 "[a-zA-Z][a-zA-Z0-9_]*" | ||||
| 	 "|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?" | ||||
| 	 "|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"), | ||||
| PATTERNS("bash", | ||||
| 	 /* Optional leading indentation */ | ||||
| 	 "^[ \t]*" | ||||
| 	 /* Start of captured text */ | ||||
| 	 "(" | ||||
| 	 "(" | ||||
| 	     /* POSIX identifier with mandatory parentheses */ | ||||
| 	     "[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]+))" | ||||
| 	 ")" | ||||
| 	 /* Optional whitespace */ | ||||
| 	 "[ \t]*" | ||||
| 	 /* Compound command starting with `{`, `(`, `((` or `[[` */ | ||||
| 	 "(\\{|\\(\\(?|\\[\\[)" | ||||
| 	 /* End of captured text */ | ||||
| 	 ")", | ||||
| 	 /* -- */ | ||||
| 	 /* Characters not in the default $IFS value */ | ||||
| 	 "[^ \t]+"), | ||||
| PATTERNS("dts", | ||||
| 	 "!;\n" | ||||
| 	 "!=\n" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Victor Engmark
						Victor Engmark