File: pre-commit

package info (click to toggle)
fdroidserver 2.4.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,948 kB
  • sloc: python: 34,139; xml: 2,186; sh: 1,362; java: 293; makefile: 54; javascript: 23
file content (139 lines) | stat: -rwxr-xr-x 3,287 bytes parent folder | download | duplicates (3)
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
#!/bin/bash
#
# Simple pre-commit hook to check that there are no errors in the fdroidserver
# source files.

# Redirect output to stderr.
exec 1>&2

files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.*     //' | uniq | cut -b100-500`
if [ -z "$files" ]; then
    PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
    PY_TEST_FILES="tests/test_*.py"
    SH_FILES="hooks/pre-commit"
    BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
    RB_FILES="buildserver/Vagrantfile"
    YML_FILES=".*.yml .yamllint */*.yml */*.yaml"
else
    # if actually committing right now, then only run on the files
    # that are going to be committed at this moment
    PY_FILES=
    PY_TEST_FILES=
    SH_FILES=
    BASH_FILES=
    RB_FILES=
    YML_FILES=

    for f in $files; do
        test -e $f || continue
        case $f in
            test_*.py)
                PY_TEST_FILES+=" $f"
                ;;
            *.py)
                PY_FILES+=" $f"
                ;;
            *.rb)
                RB_FILES+=" $f"
                ;;
            *.yml|*.yaml|.yamllint)
                YML_FILES+=" $f"
                ;;
            *)
                if head -1 $f | grep '^#!/bin/sh' > /dev/null 2>&1; then
                    SH_FILES+=" $f"
                elif head -1 $f | grep '^#!/bin/bash' > /dev/null 2>&1; then
                    BASH_FILES+=" $f"
                elif head -1 $f | grep '^#!.*python' > /dev/null 2>&1; then
                    PY_FILES+=" $f"
                fi
                ;;
        esac
    done
fi

err() {
	echo >&2 ERROR: "$@"
	exit 1
}

warn() {
	echo >&2 WARNING: "$@"
}

cmd_exists() {
	command -v $1 1>/dev/null
}

find_command() {
	for name in "$@"; do
		for suff in "3" "-3" "-python3" ""; do
			cmd=${name}${suff}
			if cmd_exists $cmd; then
				echo $cmd
				return 0
			fi
		done
	done
	warn "$1 is not installed, using dummy placeholder!"
	echo :
}

DASH=$(find_command dash)
PYDOCSTYLE=$(find_command pydocstyle)
PYFLAKES=$(find_command pyflakes)
PYCODESTYLE=$(find_command pycodestyle pep8)
RUBY=$(find_command ruby)
YAMLLINT=$(find_command yamllint)

if [ "$PY_FILES $PY_TEST_FILES" != " " ]; then
    if ! $PYFLAKES $PY_FILES $PY_TEST_FILES; then
	err "pyflakes tests failed!"
    fi
    # ignore vendored files
    if ! $PYDOCSTYLE --match='(?!apksigcopier|looseversion|setup|test_).*\.py' $PY_FILES $PY_TEST_FILES; then
	err "pydocstyle tests failed!"
    fi
fi

if [ "$PY_FILES" != "" ]; then
    if ! $PYCODESTYLE $PY_FILES; then
	err "pep8 tests failed!"
    fi
fi

if [ "$PY_TEST_FILES" != "" ]; then
    if ! $PYCODESTYLE $PY_TEST_FILES; then
	err "pep8 tests failed!"
    fi
fi

for f in $SH_FILES; do
	if ! $DASH -n $f; then
		err "dash tests failed!"
	fi
done

for f in $BASH_FILES; do
	if ! bash -n $f; then
		err "bash tests failed!"
	fi
done

for f in $RB_FILES; do
	if ! $RUBY -c $f 1>/dev/null; then
		err "ruby tests failed!"
	fi
done

for f in $YML_FILES; do
	if ! $YAMLLINT $f; then
		err ".yml tests failed on $f!"
	fi
done

if grep -C 3 'shell=True' fdroidserver/[a-ce-z]*.py; then
    err "shell=True is too dangerous, there are unfiltered user inputs!"
fi

exit 0