| #!/bin/bash | |
| usage() { | |
| if [ -n "$1" ]; then | |
| echo "$1" > /dev/stderr; | |
| fi | |
| echo "Usage: $0 -y <yapf_exec> -p lint_program<> [-l|-c|-f]" > /dev/stderr | |
| exit 1 | |
| } | |
| run() { | |
| eval $1 | |
| res=$? | |
| if [[ $res != 0 ]]; then | |
| echo $2 > /dev/stderr | |
| fi | |
| return $res | |
| } | |
| lint_file() { | |
| cmd=$1 | |
| file=$2 | |
| run "$cmd $file" "lint failed on $file" | |
| return $? | |
| } | |
| check_file() { | |
| cmd=$1 | |
| file=$2 | |
| run "$cmd -d $file > /dev/null" "yapf needs to reformat $file" | |
| return $? | |
| } | |
| format_file() { | |
| cmd=$1 | |
| file=$2 | |
| run "$cmd -i $file" "yapf failed to format $file" | |
| return $? | |
| } | |
| do_check=0 | |
| do_format=0 | |
| do_lint=0 | |
| yapf_exec=yapf | |
| lint_exec=pyflakes | |
| while getopts "lcfy:p:" opt; do | |
| case $opt in | |
| c) | |
| do_check=1; | |
| ;; | |
| f) | |
| do_format=1; | |
| ;; | |
| y) | |
| yapf_exec=$OPTARG | |
| ;; | |
| p) | |
| lint_exec=$OPTARG | |
| ;; | |
| l) | |
| do_lint=1; | |
| ;; | |
| *) | |
| usage | |
| ;; | |
| esac | |
| done | |
| shift $((OPTIND - 1)) | |
| if [ -n "$*" ]; then | |
| usage "leftover args: '$*'" | |
| fi | |
| if (( do_check + do_format + do_lint != 1 )); then | |
| usage "Provide exactly one option" | |
| fi | |
| ret=0 | |
| # using git will only check and format files in the git index. This avoids | |
| # formatting temporary files and files in submodules | |
| TOP_DIR=`git rev-parse --show-toplevel` | |
| for file in $(git ls-tree --full-tree --name-only -r HEAD | grep "\.py$"); do | |
| if [ $do_check != 0 ]; then | |
| check_file $yapf_exec $TOP_DIR/$file; | |
| res=$? | |
| elif [ $do_format != 0 ]; then | |
| format_file "$yapf_exec" $TOP_DIR/$file; | |
| res=$? | |
| elif [ $do_lint != 0 ]; then | |
| lint_file "$lint_exec" $TOP_DIR/$file; | |
| res=$? | |
| fi; | |
| if [[ $res != 0 ]]; then | |
| ((ret++)) | |
| fi | |
| done | |
| exit $ret |