blob: 0f6856eeed59a089e919af8078573b7736b0ea66 [file] [log] [blame]
#!/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