aboutsummaryrefslogtreecommitdiffstats
path: root/tools/pre-commit
blob: be74103d01c83054d6b7b7a3265b19c9c5309004 (plain)
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
#!/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_ID="${1:-HEAD}"

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

exit_status=0

COMMIT_FILES=$( git diff-index --cached --name-status "${COMMIT_ID}" | grep -v "^D" | cut -f2 | grep "\\.[ch]$" )
DIAMETER_FILES=$( git diff-index --cached --name-status "${COMMIT_ID}" | grep -v "^D" | cut -f2 | grep diameter/ )

# 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" ) || exit
else
    CHECK_FILES="$COMMIT_FILES"
fi

bad_alloc_patterns=${PWD}/tools/detect_bad_alloc_patterns.py
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

if [ "x$DIAMETER_FILES" != x ]
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:
#