1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-10-03 17:50:11 +02:00
fdroidserver/hooks/pre-commit
Hans-Christoph Steiner 7c30569aed make git pre-commit hook only test files to be committed
Right now, the git pre-commit hook is pretty annoying to work with when
development since it tests every single file.  That means notes, incomplete
stuff, etc. will be run through the tests.  So all of the files need to be
clean in order to commit even a single trivial fix.  This commit changes it
so that the pre-commit hook is only run on the files staged to be committed.
2016-02-03 14:54:14 +01:00

126 lines
3.1 KiB
Bash
Executable File

#!/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 examples/*.py buildserver/*.py fdroidserver/*.py"
PY_TEST_FILES="tests/*.TestCase"
SH_FILES="hooks/pre-commit"
BASH_FILES="fd-commit jenkins-build docs/update.sh completion/bash-completion"
RB_FILES="buildserver/cookbooks/*/recipes/*.rb"
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=
for f in $files; do
case $f in
*.py)
PY_FILES+=" $f"
;;
*.TestCase)
PY_TEST_FILES+=" $f"
;;
*.rb)
RB_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
# In the default configuration, the checks E123, E133, E226, E241 and E242 are
# ignored because they are not rules unanimously accepted
# On top of those, we ignore:
# * E501: line too long (82 > 79 characters)
# - Recommended for readability but not enforced
# - Some lines are awkward to wrap around a char limit
# * W503: line break before binary operator
# - It's quite new
# - Quite pedantic
PEP8_IGNORE="E123,E133,E226,E241,E242,E501,W503"
err() {
echo ERROR: "$@"
exit 1
}
cmd_exists() {
command -v $1 1>/dev/null
}
if cmd_exists pyflakes-python2; then
PYFLAKES=pyflakes-python2
elif cmd_exists pyflakes; then
PYFLAKES=pyflakes
else
err "pyflakes is not installed!"
fi
if cmd_exists pep8-python2; then
PEP8=pep8-python2
elif cmd_exists pep8; then
PEP8=pep8
else
err "pep8 is not installed!"
fi
if [ ! -z $PY_FILES $PY_TEST_FILES ]; then
if ! $PYFLAKES $PY_FILES $PY_TEST_FILES; then
err "pyflakes tests failed!"
fi
fi
if [ ! -z $PY_FILES ]; then
if ! $PEP8 --ignore=$PEP8_IGNORE $PY_FILES; then
err "pep8 tests failed!"
fi
fi
# The tests use a little hack in order to cleanly import the fdroidserver
# package locally like a regular package. pep8 doesn't see that, so this
# makes pep8 skip E402 on the test files that need that hack.
if [ ! -z $PY_TEST_FILES ]; then
if ! $PEP8 --ignore=$PEP8_IGNORE,E402 $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
exit 0