#!/bin/bash # Hook for git which can test code for each commit. # To install and use it just copy or symlink it to .git/hooks/pre-commit # example (project base dir): pushd .git/hooks/; ln -s ../../scripts/hooks/pre-commit .; popd if [ -e "php-cs-fixer.phar" ] then PHPCSFIXER="php php-cs-fixer.phar" elif hash php-cs-fixer then PHPCSFIXER="php-cs-fixer" fi if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi FIXERS='indentation,linefeed,trailing_spaces,short_tag,braces,controls_spaces,eof_ending,visibility' ST=0 # Global exit status # Loop through all committed files for file in $(git diff-index --name-only $against); do echo -n "testing $file..." FIXEROUT=$(php-cs-fixer fix --dry-run -v --fixers=$FIXERS "$file" | grep -P '\d\)' | sed -r "s~^.*?${file} ~~"; exit ${PIPESTATUS[0]}) FIXERST=$? PARSEROUT=$(php --syntax-check "$file" 2>&1 | egrep -v 'No syntax errors|Errors parsing'; exit ${PIPESTATUS[0]}) PARSERST=$? echo -e -n "\r${file}..." if [ $FIXERST != 0 ]; then echo $FIXEROUT elif [ $PARSERST != 0 ]; then echo $PARSEROUT else echo "OK " fi ST=$(($ST | $FIXERST | $PARSERST)) done exit $ST