forked from DGNum/gestioCOF
104e71dcf6
On CI: - black and isort in check mode must pass. - flake8 only prints errors WIP: make it also failed. On pre-commit: - black and isort will format staged files, if installed on path. - flake8 prints its output if necessary.
106 lines
2.5 KiB
Bash
Executable file
106 lines
2.5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# pre-commit hook for gestioCOF project.
|
|
#
|
|
# Run formatters first, then checkers.
|
|
# Formatters which changed a file must set the flag 'formatter_updated'.
|
|
|
|
exit_code=0
|
|
formatter_updated=0
|
|
checker_dirty=0
|
|
|
|
# TODO(AD): We should check only staged changes.
|
|
# Working? -> Stash unstaged changes, run it, pop stash
|
|
STAGED_PYTHON_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".py$")
|
|
|
|
# Formatter: black
|
|
|
|
printf "> black ... "
|
|
|
|
if type black &>/dev/null; then
|
|
if [ -z $STAGED_PYTHON_FILES ]; then
|
|
printf "OK\n"
|
|
else
|
|
BLACK_OUTPUT="/tmp/gc-black-output.log"
|
|
touch $BLACK_OUTPUT
|
|
black --check $STAGED_PYTHON_FILES &>$BLACK_OUTPUT
|
|
printf "OK\n"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
black $STAGED_PYTHON_FILES &>$BLACK_OUTPUT
|
|
tail -1 $BLACK_OUTPUT
|
|
formatter_updated=1
|
|
fi
|
|
fi
|
|
else
|
|
printf "SKIP: program not found\n"
|
|
printf "HINT: Install black with 'pip3 install black' (black requires Python>=3.6)\n"
|
|
fi
|
|
|
|
# Formatter: isort
|
|
|
|
printf "> isort ... "
|
|
|
|
if type isort &>/dev/null; then
|
|
if [ -z $STAGED_PYTHON_FILES ]; then
|
|
printf "OK\n"
|
|
else
|
|
ISORT_OUTPUT="/tmp/gc-isort-output.log"
|
|
touch $ISORT_OUTPUT
|
|
isort --check-only $STAGED_PYTHON_FILES &>$ISORT_OUTPUT
|
|
printf "OK\n"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
isort $STAGED_PYTHON_FILES &>$ISORT_OUTPUT
|
|
printf "Reformatted.\n"
|
|
formatter_updated=1
|
|
fi
|
|
fi
|
|
else
|
|
printf "SKIP: program not found\n"
|
|
printf "HINT: Install isort with 'pip install isort'\n"
|
|
fi
|
|
|
|
# Checker: flake8
|
|
|
|
printf "> flake8 ... "
|
|
|
|
if type flake8 &>/dev/null; then
|
|
if [ -z $STAGED_PYTHON_FILES ]; then
|
|
printf "OK\n"
|
|
else
|
|
FLAKE8_OUTPUT="/tmp/gc-flake8-output.log"
|
|
touch $FLAKE8_OUTPUT
|
|
flake8 $STAGED_PYTHON_FILES &>$FLAKE8_OUTPUT
|
|
|
|
if [ $? -eq 0 ]; then
|
|
printf "OK\n"
|
|
else
|
|
printf "FAIL\n"
|
|
cat $FLAKE8_OUTPUT
|
|
checker_dirty=1
|
|
fi
|
|
fi
|
|
else
|
|
printf "SKIP: program not found\n"
|
|
printf "HINT: Install flake8 with 'pip install flake8'\n"
|
|
fi
|
|
|
|
# End
|
|
|
|
if [ $checker_dirty -ne 0 ]
|
|
then
|
|
printf ">>> Checker(s) detect(s) issue(s)\n"
|
|
printf " You can still commit and push :)\n"
|
|
printf " Be warned that our CI may cause you more trouble.\n"
|
|
fi
|
|
|
|
if [ $formatter_updated -ne 0 ]
|
|
then
|
|
printf ">>> Working tree updated by formatter(s)\n"
|
|
printf " Add changes to staging area and retry.\n"
|
|
exit_code=1
|
|
fi
|
|
|
|
printf "\n"
|
|
|
|
exit $exit_code
|