1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#!/bin/sh
# Copyright 2013, Alexis La Goutte (See AUTHORS file)
#
# For git user: copy tools/pre-commit to .git/hooks/ folder and make it
# executable. To bypass it for a single commit, use the --no-verify argument.
# Using --no-verify will then fail during git review because of a missing
# ChangeID. Fix that by running git review -i. Do not use -i during normal
# operation.
#
# Alternatively, invoke it directly with the commit ID. Example for checking the
# last commit:
#
# tools/pre-commit HEAD~
#
# Relative paths are also supported. For instance, if you are in epan/, then you
# could invoke `../tools/pre-commit HEAD` to check for changes to staged files.
#
# From
# http://mark-story.com/posts/view/using-git-commit-hooks-to-prevent-stupid-mistakes
#
# If the commit identifier is not given, use HEAD instead.
COMMIT_IDS=HEAD
if [ $# -gt 0 ] ; then
COMMIT_IDS=$*
fi
UNAME=$( uname -a )
case "$UNAME" in
*\ Msys)
pyvar="pythonw.exe"
;;
*)
pyvar="python3"
;;
esac
PYBIN=${WS_GITHOOK_PYTHON:-$pyvar}
# Path to hook script in the .git directory
hook_script=${GIT_DIR:-.git}/hooks/pre-commit
# Always start in the root directory of the source tree, this allows for
# invocations via relative paths (such as ../tools/pre-commit):
if ! cd "$(git rev-parse --show-toplevel)" ; then
echo "Can't change to the top-level source directory."
exit 1
fi
# Check for newer (actually, different) versions of the pre-commit script
# (but only if invoked as hook, i.e. the commit ID is not given as argument).
if [ -z "$1" ] && [ -f "$hook_script" ]; then
if ! cmp -s "$hook_script" tools/pre-commit; then
echo "Pre-commit hook script is outdated, please update! (cp tools/pre-commit ${hook_script})"
fi
fi
have_diameter_files="False"
bad_alloc_patterns=${PWD}/tools/detect_bad_alloc_patterns.py
exit_status=0
for COMMIT_ID in $COMMIT_IDS; do
COMMIT_FILES=$( git diff-index --cached --name-status "${COMMIT_ID}" | grep -v "^D" | cut -f2 | grep "\\.[ch]$" )
if git diff-index --cached --name-status "${COMMIT_ID}" | grep -v "^D" | cut -f2 | grep diameter/ > /dev/null ; then
have_diameter_files="True"
fi
# Path to filter script in the tools directory
filter_script=${PWD}/tools/pre-commit-ignore.py
filter_conf=${PWD}/tools/pre-commit-ignore.conf
if [ -f "$filter_script" ] && [ -f "$filter_conf" ]; then
CHECK_FILES=$( echo "$COMMIT_FILES" | "$PYBIN" "$filter_script" "$filter_conf" ) || continue
else
CHECK_FILES="$COMMIT_FILES"
fi
echo "$COMMIT_FILES" | $PYBIN "$bad_alloc_patterns"
# On windows python will output \r\n line endings - we don't want that.
#
# Do not use sed, as not all versions of sed support \r as meaning CR
# in a regexp - the only version that does so might be GNU sed; the
# GNU sed documentation says that only \n and \\ can be used in a
# portable script.
#
# The Single UNIX Specification says that tr supports \r; most if not
# all modern UN*Xes should support it.
CHECK_FILES=$( echo "$CHECK_FILES" | tr -d '\r' )
for FILE in $CHECK_FILES; do
# Skip some special cases
FILE_BASENAME="$( basename "$FILE" )"
# This should only be done on code that's part of one or more
# Wireshark programs; idl2wrs.c is a developer tool, not a
# Wireshark program, so these tests don't apply.
if test "$FILE_BASENAME" = "idl2wrs.c"
then
continue
fi
if test "$FILE_BASENAME" = "wmem_test.c"
then
continue
fi
#Check if checkhf is good
./tools/checkhf.pl "$FILE" || exit_status=1
#Check if checkAPIs is good
./tools/checkAPIs.pl -p "$FILE" || exit_status=1
#Check if fix-encoding-args is good
./tools/fix-encoding-args.pl "$FILE" || exit_status=1
#Check if checkfiltername is good
./tools/checkfiltername.pl "$FILE" || exit_status=1
# If there are whitespace errors, print the offending file names and fail. (from git pre-commit.sample)
git diff-index --check --cached "${COMMIT_ID}" "$FILE" || exit_status=1
done
done
if [ "$have_diameter_files" = "True" ]
then
./tools/validate-diameter-xml.sh > /dev/null || exit_status=1
fi
exit $exit_status
#
# Editor modelines
#
# Local Variables:
# c-basic-offset: 4
# tab-width: 8
# indent-tabs-mode: nil
# End:
#
# ex: set shiftwidth=4 tabstop=8 expandtab:
# :indentSize=4:tabSize=8:noTabs=true:
#
|