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. | - `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. | - `bibtex` suitable for files with BibTeX coded references. | ||||||
|  |  | ||||||
| - `cpp` suitable for source code in the C and C++ languages. | - `cpp` suitable for source code in the C and C++ languages. | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ test_expect_success 'setup' ' | ||||||
|  |  | ||||||
| diffpatterns=" | diffpatterns=" | ||||||
| 	ada | 	ada | ||||||
|  | 	bash | ||||||
| 	bibtex | 	bibtex | ||||||
| 	cpp | 	cpp | ||||||
| 	csharp | 	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_]*" | 	 "[a-zA-Z][a-zA-Z0-9_]*" | ||||||
| 	 "|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-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", | PATTERNS("dts", | ||||||
| 	 "!;\n" | 	 "!;\n" | ||||||
| 	 "!=\n" | 	 "!=\n" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Victor Engmark
						Victor Engmark