#!/bin/bash # Copyright 2016 Google Inc. All Rights Reserved. # # Licensed under the MIT License, . # This file may not be copied, modified, or distributed except according to those terms. # Pre-push hook for the tarpc repository. To use this hook, copy it to .git/hooks in your repository # root. # # This hook runs tests to make sure only working code is being pushed. If present, rustup is used # to build and test the code on the appropriate toolchains. The working copy must not contain # uncommitted changes, since the script currently just runs cargo build/test in the working copy. # # Options: # # - TARPC_ALLOW_DIRTY, default = 0 # # Setting this variable to 1 will run tests even though there are code changes in the working # copy. Set to 0 by default, since the intent is to test the code that's being pushed, not changes # still in the working copy. # # - TARPC_USE_CURRENT_TOOLCHAIN, default = 0 # # Setting this variable to 1 will just run cargo build and cargo test, rather than running # stable/beta/nightly. # # Note that these options are most useful for testing the hooks themselves. Use git push --no-verify # to skip the pre-push hook altogether. RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color PREFIX="${GREEN}[PREPUSH]${NC}" FAILURE="${RED}FAILED${NC}" WARNING="${YELLOW}[WARNING]${NC}" SKIPPED="${YELLOW}SKIPPED${NC}" SUCCESS="${GREEN}ok${NC}" printf "${PREFIX} Clean working copy ... " git diff --exit-code &>/dev/null if [ "$?" == 0 ]; then printf "${SUCCESS}\n" else if [ "${TARPC_ALLOW_DIRTY}" == "1" ] then printf "${SKIPPED}\n" else printf "${FAILURE}\n" exit 1 fi fi PREPUSH_RESULT=0 # args: # 1 - cargo command to run (build/test) # 2 - rust toolchain (nightly/stable/beta) run_cargo() { if [ "$1" == "build" ]; then VERB=Building else VERB=Testing fi if [ "$2" != "" ]; then printf "${PREFIX} $VERB on $2... " if [ "$2" != "nightly" ]; then rustup run $2 cargo $1 &>/dev/null else rustup run nightly cargo $1 --features unstable &>/dev/null fi else printf "${PREFIX} $VERB... " cargo $1 &>/dev/null fi if [ "$?" != "0" ]; then printf "${FAILURE}\n" PREPUSH_RESULT=1 else printf "${SUCCESS}\n" fi } TOOLCHAIN_RESULT=0 check_toolchain() { printf "${PREFIX} Checking for $1 toolchain ... " if [[ $(rustup toolchain list) =~ $1 ]]; then printf "${SUCCESS}\n" else TOOLCHAIN_RESULT=1 PREPUSH_RESULT=1 printf "${FAILURE}\n" fi } printf "${PREFIX} Checking for rustup or current toolchain directive... " command -v rustup &>/dev/null if [ "$?" == 0 ] && [ "${TARPC_USE_CURRENT_TOOLCHAIN}" == "" ]; then printf "${SUCCESS}\n" check_toolchain stable check_toolchain beta check_toolchain nightly if [ ${TOOLCHAIN_RESULT} == 1 ]; then exit 1 fi run_cargo build stable run_cargo build beta run_cargo build nightly # We still rely on some nightly stuff for tests run_cargo test nightly else if [ "${TARPC_USE_CURRENT_TOOLCHAIN}" == "" ]; then printf "${YELLOW}NOT FOUND${NC}\n" printf "${WARNING} Falling back to current toolchain: $(rustc -V)\n" else printf "${SUCCESS}\n" fi run_cargo build run_cargo test fi exit $PREPUSH_RESULT