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