gestioCOF/.pre-commit.sh
Aurélien Delobelle 104e71dcf6 core -- Add black,isort,flake8 to CI and pre-commit hook
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.
2018-10-06 12:53:50 +02:00

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