|  | #!/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 |