| #!/bin/bash |
| # |
| # Copyright (c) 2015 Google Inc. |
| # |
| # This is a pre-push hook that does the following before uploading a |
| # CL for review: |
| # 1) check that python sources have been formatted with pyformat. |
| # 2) allows the user to run the unit tests. |
| |
| # This redirects stdin. Make sure to run after stdin has been read. |
| run_UnitTests() { |
| save_dir=$(pwd) |
| status=0 |
| valid=0 |
| |
| # Make sure we can read the stdin from terminal |
| exec < /dev/tty |
| |
| while [[ $valid -eq 0 ]] ; do |
| read -p "Run unit tests? [y/n] " choice |
| case "$choice" in |
| n|N ) valid=1 ;; |
| y|Y ) valid=1; cd crosperf; ./run_tests.sh; status=$? ; |
| cd $save_dir;; |
| * ) echo "Must choose y or n." |
| esac |
| done |
| if [[ $status -ne 0 ]]; then |
| exit $status |
| fi |
| } |
| |
| run_PyFormat() { |
| pyformat="./bin/tc_pyformat" |
| range=$1 |
| files=$(git show --pretty="format:" --name-only $range) |
| for f in $files; do |
| [[ $f == *.py ]] || continue |
| # File could have been removed as part of the commit. |
| [[ -e $f ]] || continue |
| diffs=$($pyformat -d $f) |
| if [[ $? -ne 0 ]]; then |
| echo "Error: $pyformat $f returned with error code $?" |
| exit 1 |
| fi |
| if [[ -n "$diffs" ]]; then |
| echo -e "Error: $f is not formatted correctly. Run $pyformat -i $f\n" |
| echo -e "diffs:\n$diffs\n" |
| exit 2 |
| fi |
| done |
| } |
| |
| z40=0000000000000000000000000000000000000000 |
| |
| while IFS=' ' read local_ref local_sha remote_ref remote_sha; do |
| if [[ "$local_sha" != $z40 ]]; then |
| if [[ "$remote_sha" == $z40 ]]; then |
| # New branch, examine commit on top of branch. |
| range="$local_sha" |
| else |
| # Update to existing branch, examine new commits |
| range="$remote_sha..$local_sha" |
| fi |
| run_PyFormat $range |
| fi |
| done |
| |
| run_UnitTests |
| |
| exit 0 |