#!/usr/bin/env bash # # To install this script, copy it to .git/hooks/pre-commit in local copy of # tor git repo and make sure it has permission to execute. # # This is pre-commit git hook script that prevents commiting your changeset if # it fails our code formatting, changelog entry formatting, module include # rules, or best practices tracker. # Run only if this environment variable is set. if [ -z "$TOR_EXTRA_PRE_COMMIT_CHECKS" ]; then exit 0 fi workdir=$(git rev-parse --show-toplevel) cd "$workdir" || exit 1 set -e if [ $# -eq 0 ]; then # When called in pre-commit, check the files modified in this commit CHECK_FILTER="git diff --cached --name-only --diff-filter=ACMR" # Use the appropriate owned tor source list to filter the changed files # This is the layout in 0.3.5 and later. # Keep these lists consistent: # - OWNED_TOR_C_FILES in Makefile.am # - CHECK_FILES in pre-commit.git-hook and pre-push.git-hook # - try_parse in check_cocci_parse.sh CHECK_FILES="$($CHECK_FILTER \ src/lib/*/*.[ch] \ src/core/*/*.[ch] \ src/feature/*/*.[ch] \ src/app/*/*.[ch] \ src/test/*.[ch] \ src/test/*/*.[ch] \ src/tools/*.[ch] \ )" else # When called in pre-push, concatenate the argument array # Fails on special characters in file names CHECK_FILES="$*" fi ## General File Checks if [ -n "$(ls ./changes/)" ]; then python scripts/maint/lintChanges.py ./changes/* fi if [ -e scripts/maint/checkShellScripts.sh ]; then scripts/maint/checkShellScripts.sh fi # Always run the practracker unit tests PT_DIR=scripts/maint/practracker if [ -e "${PT_DIR}/test_practracker.sh" ]; then "${PT_DIR}/test_practracker.sh" fi if [ -e scripts/maint/checkSpaceTest.sh ]; then scripts/maint/checkSpaceTest.sh fi if [ ! "$CHECK_FILES" ]; then echo "No modified tor-owned source files, skipping further checks" exit 0 fi ## Owned Source File Checks printf "Modified tor-owned source files:\\n%s\\n" "$CHECK_FILES" # We want word splitting here, because file names are space separated # shellcheck disable=SC2086 perl scripts/maint/checkSpace.pl -C \ $CHECK_FILES if test -e scripts/maint/practracker/includes.py; then python scripts/maint/practracker/includes.py fi # Only call practracker if ${PT_DIR}/.enable_practracker_in_hooks exists # We do this check so that we can enable practracker in hooks in master, and # disable it on maint branches if [ -e "${PT_DIR}/practracker.py" ]; then if [ -e "${PT_DIR}/.enable_practracker_in_hooks" ]; then python3 "${PT_DIR}/practracker.py" "$workdir" fi fi if [ -e scripts/coccinelle/check_cocci_parse.sh ]; then # Run a verbose cocci parse check on the changed files # (spatch is slow, so we don't want to check all the files.) # # We want word splitting here, because file names are space separated # shellcheck disable=SC2086 VERBOSE=1 scripts/coccinelle/check_cocci_parse.sh \ $CHECK_FILES fi