aboutsummaryrefslogtreecommitdiff
path: root/toolchain_utils_githooks/pre-push.real
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain_utils_githooks/pre-push.real')
-rwxr-xr-xtoolchain_utils_githooks/pre-push.real71
1 files changed, 71 insertions, 0 deletions
diff --git a/toolchain_utils_githooks/pre-push.real b/toolchain_utils_githooks/pre-push.real
new file mode 100755
index 00000000..0f6856ee
--- /dev/null
+++ b/toolchain_utils_githooks/pre-push.real
@@ -0,0 +1,71 @@
+#!/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