diff --git a/hooks/pre-commit b/hooks/pre-commit index 5103749..ae144b9 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -5,12 +5,34 @@ #!/bin/sh # -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. +# Pre-commit hook for the tarpc repository. To use this hook, copy it to .git/hooks in your +# repository root. # -# To enable this hook, rename this file to "pre-commit". +# This precommit checks the following: +# 1. All filenames are ascii +# 2. There is no bad whitespace +# 3. rustfmt is installed +# 4. rustfmt is a noop on files that are in the index +# +# Options: +# +# - TARPC_SKIP_RUSTFMT, default = 0 +# +# Set this to 1 to skip running rustfmt +# +# Note that these options are most useful for testing the hooks themselves. Use git commit +# --no-verify to skip the pre-commit hook altogether. + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' # No Color + +PREFIX="${GREEN}[PRECOMMIT]${NC}" +FAILURE="${RED}FAILED${NC}" +WARNING="${RED}[WARNING]${NC}" +SKIPPED="${YELLOW}SKIPPED${NC}" +SUCCESS="${GREEN}ok${NC}" if git rev-parse --verify HEAD >/dev/null 2>&1 then @@ -20,35 +42,74 @@ else against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi -# If you want to allow non-ASCII filenames set this variable to true. -allownonascii=$(git config --bool hooks.allownonascii) - # Redirect output to stderr. exec 1>&2 -# Cross platform projects tend to avoid non-ASCII filenames; prevent -# them from being added to the repository. We exploit the fact that the -# printable range starts at the space character and ends with tilde. -if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff --cached --name-only --diff-filter=A -z $against | +FAILED=0 + +printf "${PREFIX} Checking that all filenames are ascii ... " +# Note that the use of brackets around a tr range is ok here, (it's +# even required, for portability to Solaris 10's /usr/bin/tr), since +# the square bracket bytes happen to fall in the designated range. +if test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then - cat <<\EOF -Error: Attempt to add a non-ASCII file name. + FAILED=1 + printf "${FAILURE}\n" +else + printf "${SUCCESS}\n" +fi -This can cause problems if you want to work with people on other platforms. +printf "${PREFIX} Checking for bad whitespace ... " +git diff-index --check --cached $against -- &>/dev/null +if [ "$?" != 0 ]; then + FAILED=1 + printf "${FAILURE}\n" +else + printf "${SUCCESS}\n" +fi -To be portable it is advisable to rename the file. - -If you know what you are doing you can disable this check using: - - git config hooks.allownonascii true -EOF +printf "${PREFIX} Checking for rustfmt ... " +command -v rustfmt &>/dev/null +if [ $? == 0 ]; then + printf "${SUCCESS}\n" +else + printf "${FAILURE}\n" exit 1 fi -# If there are whitespace errors, print the offending file names and fail. -exec git diff-index --check --cached $against -- +printf "${PREFIX} Checking for shasum ... " +command -v shasum &>/dev/null +if [ $? == 0 ]; then + printf "${SUCCESS}\n" +else + printf "${FAILURE}\n" + exit 1 +fi + +# Just check that running rustfmt doesn't do anything to the file. I do this instead of +# modifying the file because I don't want to mess with the developer's index, which may +# not only contain discrete files. +printf "${PREFIX} Checking formatting ... " +FMTRESULT=0 +for file in $(git diff --name-only --cached); +do + if [ ${file: -3} == ".rs" ]; then + HASH=$(shasum $file) + NEW_HASH=$(rustfmt --write-mode=display $file | shasum) + if [ "${HASH}" != "${NEW_HASH}" ]; then + FMTRESULT=1 + fi + fi +done + +if [ "${TARPC_SKIP_RUSTFMT}" == 1 ]; then + printf "${SKIPPED}\n"$? +elif [ ${FMTRESULT} != 0 ]; then + FAILED=1 + printf "${FAILURE}\n" +else + printf "${SUCCESS}\n" +fi + +exit ${FAILED} diff --git a/hooks/pre-push b/hooks/pre-push index 9880510..a488ea8 100755 --- a/hooks/pre-push +++ b/hooks/pre-push @@ -3,6 +3,29 @@ # 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, multirust 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. + #!/bin/sh RED='\033[0;31m' @@ -10,30 +33,95 @@ 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 - echo ${RED}ERROR${NC} You have uncommitted changes please commit or stash them before pushing so that I can run tests! - exit 1 -fi - -printf "${YELLOW}[PRESUBMIT]${NC} Running tests ... " - -TEST_RESULT=0 -cargo test --manifest-path tarpc/Cargo.toml &>/dev/null -if [ "$?" != "0" ]; -then - printf "${RED}FAILED${NC}" - TEST_RESULT=1 +if [ "$?" == 0 ]; then + printf "${SUCCESS}\n" else - printf "${GREEN}ok${NC}" -fi -printf "\n" - -RESULT=0 -if [ "$TEST_RESULT" == "1" ]; -then - RESULT=1 + if [ "${TARPC_ALLOW_DIRTY}" == "1" ] + then + printf "${SKIPPED}\n" + else + printf "${FAILURE}\n" + exit 1 + fi fi -exit $RESULT +PREPUSH_RESULT=0 + +# args: +# 1 - cargo command to run (build/test) +# 2 - directory name of crate to build +# 3 - rust toolchain (nightly/stable/beta) +run_cargo() { + if [ "$1" == "build" ]; then + VERB=Building + else + VERB=Testing + fi + if [ "$3" != "" ]; then + printf "${PREFIX} $VERB $2 on $3 ... " + multirust run $3 cargo $1 --manifest-path $2/Cargo.toml &>/dev/null + else + printf "${PREFIX} $VERB $2 ... " + cargo $1 --manifest-path $2/Cargo.toml &>/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 [[ $(multirust list-toolchain) =~ $1 ]]; then + printf "${SUCCESS}\n" + else + TOOLCHAIN_RESULT=1 + PREPUSH_RESULT=1 + printf "${FAILURE}\n" + fi +} + +printf "${PREFIX} Checking for multirust ... " +command -v multirust &>/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 tarpc stable + run_cargo build tarpc_examples stable + + run_cargo build tarpc beta + run_cargo build tarpc_examples beta + + run_cargo build tarpc nightly + run_cargo build tarpc_examples nightly + + # We still rely on some nightly stuff for tests + run_cargo test tarpc nightly + run_cargo test tarpc_examples nightly +else + printf "${YELLOW}NOT FOUND${NC}\n" + printf "${WARNING} Falling back to current toolchain: $(rustc -V)\n" + + run_cargo test tarpc + run_cargo test tarpc_examples +fi + +exit $PREPUSH_RESULT diff --git a/tarpc/install-hooks.sh b/tarpc/install-hooks.sh deleted file mode 100755 index 15a1b9d..0000000 --- a/tarpc/install-hooks.sh +++ /dev/null @@ -1,8 +0,0 @@ -# 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. - -#!/bin/sh -ln -s ../../hooks/pre-commit .git/hooks/pre-commit -ln -s ../../hooks/pre-push .git/hooks/pre-push