96 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/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: test/script/custom-linting-rules [--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 | ||
|  | 
 | ||
|  | shopt -s globstar | ||
|  | 
 | ||
|  | directories=("$@") | ||
|  | 
 | ||
|  | check_errors() { | ||
|  |     regex="$1" | ||
|  |     message="$2" | ||
|  | 
 | ||
|  |     for directory in "${directories[@]}"; do | ||
|  |         while IFS= read -r match; do | ||
|  |             RETURN_CODE=1 | ||
|  |             echo "$match $message" | ||
|  |         done < <(grep -n "$regex" "$directory"/**/*.vim \ | ||
|  |             | grep -v 'no-custom-checks' \ | ||
|  |             | grep -o '^[^:]\+:[0-9]\+' \ | ||
|  |             | sed 's:^\./::') | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | if (( FIX_ERRORS )); then | ||
|  |     for directory in "${directories[@]}"; do | ||
|  |         sed -i "s/^\(function.*)\) *$/\1 abort/" "$directory"/**/*.vim | ||
|  |         sed -i "s/shellescape(/ale#Escape(/" "$directory"/**/*.vim | ||
|  |         sed -i 's/==#/is#/g' "$directory"/**/*.vim | ||
|  |         sed -i 's/==?/is?/g' "$directory"/**/*.vim | ||
|  |         sed -i 's/!=#/isnot#/g' "$directory"/**/*.vim | ||
|  |         sed -i 's/!=?/isnot?/g' "$directory"/**/*.vim | ||
|  |     done | ||
|  | fi | ||
|  | 
 | ||
|  | check_errors \ | ||
|  |     '^function.*) *$' \ | ||
|  |     'Function without abort keyword (See :help except-compat)' | ||
|  | check_errors '^function[^!]' 'function without !' | ||
|  | check_errors ' \+$' 'Trailing whitespace' | ||
|  | check_errors '^ * end\?i\? *$' 'Write endif, not en, end, or endi' | ||
|  | check_errors '^  [^ ]' 'Use four spaces, not two spaces' | ||
|  | check_errors $'\t' 'Use four spaces, not tabs' | ||
|  | # This check should prevent people from using a particular inconsistent name. | ||
|  | check_errors 'let g:ale_\w\+_\w\+_args =' 'Name your option g:ale_<filetype>_<lintername>_options instead' | ||
|  | check_errors 'shellescape(' 'Use ale#Escape instead of shellescape' | ||
|  | check_errors 'simplify(' 'Use ale#path#Simplify instead of simplify' | ||
|  | check_errors "expand(['\"]%" "Use expand('#' . a:buffer . '...') instead. You might get a filename for the wrong buffer." | ||
|  | check_errors 'getcwd()' "Do not use getcwd(), as it could run from the wrong buffer. Use expand('#' . a:buffer . ':p:h') instead." | ||
|  | check_errors '==#' "Use 'is#' instead of '==#'. 0 ==# 'foobar' is true" | ||
|  | check_errors '==?' "Use 'is?' instead of '==?'. 0 ==? 'foobar' is true" | ||
|  | check_errors '!=#' "Use 'isnot#' instead of '!=#'. 0 !=# 'foobar' is false" | ||
|  | check_errors '!=?' "Use 'isnot?' instead of '!=?'. 0 !=? 'foobar' is false" | ||
|  | check_errors '^ *:\?echo' "Stray echo line. Use \`execute echo\` if you want to echo something" | ||
|  | 
 | ||
|  | exit $RETURN_CODE |