| 
									
										
										
										
											2017-01-22 14:54:57 +00:00
										 |  |  | #!/bin/bash -eu | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This Bash script implements custom sanity checks for scripts beyond what | 
					
						
							|  |  |  | # Vint covers, which are easy to check with regex. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # A flag for automatically fixing some errors. | 
					
						
							|  |  |  | FIX_ERRORS=0 | 
					
						
							|  |  |  | RETURN_CODE=0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function print_help() { | 
					
						
							|  |  |  |     echo "Usage: ./custom-checks [--fix] [DIRECTORY]" 1>&2 | 
					
						
							|  |  |  |     echo 1>&2 | 
					
						
							|  |  |  |     echo "  -h, --help    Print this help text" 1>&2 | 
					
						
							|  |  |  |     echo "      --fix     Automatically fix some errors" 1>&2 | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while [ $# -ne 0 ]; do | 
					
						
							|  |  |  |     case $1 in | 
					
						
							|  |  |  |     -h) ;& --help) | 
					
						
							|  |  |  |         print_help | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     --fix) | 
					
						
							|  |  |  |         FIX_ERRORS=1 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     --) | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |         break | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     -?*) | 
					
						
							|  |  |  |         echo "Invalid argument: $1" 1>&2 | 
					
						
							|  |  |  |         exit 1 | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     *) | 
					
						
							|  |  |  |         break | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ $# -eq 0 ] || [ -z "$1" ]; then | 
					
						
							|  |  |  |     print_help | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Called to output an error. | 
					
						
							|  |  |  | # If called at least one, the return code for this script will be 1. | 
					
						
							|  |  |  | output_error() { | 
					
						
							|  |  |  |     echo "$FILENAME:$LINE_NUMBER $1" | 
					
						
							|  |  |  |     RETURN_CODE=1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This function is called for each line in each file to check syntax. | 
					
						
							|  |  |  | check_line() { | 
					
						
							|  |  |  |     line="$1" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if [[ "$line" =~ ^function ]]; then | 
					
						
							|  |  |  |         if ! [[ "$line" =~ abort$ ]]; then | 
					
						
							|  |  |  |             if ((FIX_ERRORS)); then | 
					
						
							|  |  |  |                 # Use sed to add the 'abort' flag | 
					
						
							|  |  |  |                 sed -i "${LINE_NUMBER}s/$/ abort/" "$FILENAME" | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 output_error 'Function without abort keyword (See :help except-compat)' | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if [[ "$line" =~ ' '+$ ]]; then | 
					
						
							|  |  |  |         output_error 'Trailing whitespace' | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2017-02-21 11:50:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     endif_regex='^ * end?i? *$' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if [[ "$line" =~ $endif_regex ]]; then | 
					
						
							|  |  |  |         output_error 'Write endif, not en, end, or endi' | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2017-01-22 14:54:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Loop through all of the vim files and keep track of the file line numbers. | 
					
						
							|  |  |  | for FILENAME in $(find "$1" -name '*.vim'); do | 
					
						
							|  |  |  |     LINE_NUMBER=0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while read; do | 
					
						
							|  |  |  |         LINE_NUMBER=$(expr $LINE_NUMBER + 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         check_line "$REPLY" | 
					
						
							|  |  |  |     done < "$FILENAME" | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exit $RETURN_CODE |