2017-01-22 09:54:57 -05: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 06:50:59 -05:00
|
|
|
|
|
|
|
endif_regex='^ * end?i? *$'
|
|
|
|
|
|
|
|
if [[ "$line" =~ $endif_regex ]]; then
|
|
|
|
output_error 'Write endif, not en, end, or endi'
|
|
|
|
fi
|
2017-01-22 09:54:57 -05: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
|