Created
September 2, 2012 04:18
-
-
Save ka2n/3594806 to your computer and use it in GitHub Desktop.
PHP CodeSniffer pre-commit hook for git. Works nicely with https://github.com/klaussilveira/phpcs-psr.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# path to phpcs "binary" | |
PHPCS_BIN=/usr/bin/phpcs | |
# the coding standard, you can also specify a path to your own standard here | |
# e. g. /path/to/my/standard/dir/ | |
PHPCS_CODING_STANDARD=PSR | |
# comma-separated list of file patterns being ignored | |
PHPCS_IGNORE= | |
# egrep compatible pattern of files to be checked | |
PHPCS_FILE_PATTERN="\.(php|phtml)$" | |
# ignore warnings | |
PHPCS_IGNORE_WARNINGS=1 | |
# encoding | |
PHPCS_ENCODING=utf-8 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# PHP CodeSniffer pre-commit hook for git | |
# | |
# @author Soenke Ruempler <[email protected]> | |
# @author Sebastian Kaspari <[email protected]> | |
# | |
# see the README | |
PHPCS_BIN=/usr/bin/phpcs | |
PHPCS_CODING_STANDARD=PEAR | |
PHPCS_IGNORE= | |
TMP_STAGING=".tmp_staging" | |
# parse config | |
CONFIG_FILE=$(dirname $0)/config | |
if [ -e $CONFIG_FILE ]; then | |
. $CONFIG_FILE | |
fi | |
# simple check if code sniffer is set up correctly | |
if [ ! -x $PHPCS_BIN ]; then | |
echo "PHP CodeSniffer bin not found or executable -> $PHPCS_BIN" | |
exit 1 | |
fi | |
# stolen from template file | |
if git rev-parse --verify HEAD | |
then | |
against=HEAD | |
else | |
# Initial commit: diff against an empty tree object | |
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 | |
fi | |
# this is the magic: | |
# retrieve all files in staging area that are added, modified or renamed | |
# but no deletions etc | |
FILES=$(git diff-index --name-only --cached --diff-filter=ACMR $against -- ) | |
if [ "$FILES" == "" ]; then | |
exit 0 | |
fi | |
# create temporary copy of staging area | |
if [ -e $TMP_STAGING ]; then | |
rm -rf $TMP_STAGING | |
fi | |
mkdir $TMP_STAGING | |
# match files against whitelist | |
FILES_TO_CHECK="" | |
for FILE in $FILES | |
do | |
echo "$FILE" | egrep -q "$PHPCS_FILE_PATTERN" | |
RETVAL=$? | |
if [ "$RETVAL" -eq "0" ] | |
then | |
FILES_TO_CHECK="$FILES_TO_CHECK $FILE" | |
fi | |
done | |
if [ "$FILES_TO_CHECK" == "" ]; then | |
exit 0 | |
fi | |
# execute the code sniffer | |
if [ "$PHPCS_IGNORE" != "" ]; then | |
IGNORE="--ignore=$PHPCS_IGNORE" | |
else | |
IGNORE="" | |
fi | |
if [ "$PHPCS_ENCODING" != "" ]; then | |
ENCODING="--encoding=$PHPCS_ENCODING" | |
else | |
ENCODING="" | |
fi | |
if [ "$PHPCS_IGNORE_WARNINGS" == "1" ]; then | |
IGNORE_WARNINGS="-n" | |
else | |
IGNORE_WARNINGS="" | |
fi | |
# Copy contents of staged version of files to temporary staging area | |
# because we only want the staged version that will be commited and not | |
# the version in the working directory | |
STAGED_FILES="" | |
for FILE in $FILES_TO_CHECK | |
do | |
ID=$(git diff-index --cached HEAD $FILE | cut -d " " -f4) | |
# create staged version of file in temporary staging area with the same | |
# path as the original file so that the phpcs ignore filters can be applied | |
mkdir -p "$TMP_STAGING/$(dirname $FILE)" | |
git cat-file blob $ID > "$TMP_STAGING/$FILE" | |
STAGED_FILES="$STAGED_FILES $TMP_STAGING/$FILE" | |
done | |
OUTPUT=$($PHPCS_BIN -s $IGNORE_WARNINGS --standard=$PHPCS_CODING_STANDARD $ENCODING $IGNORE $STAGED_FILES) | |
RETVAL=$? | |
# delete temporary copy of staging area | |
rm -rf $TMP_STAGING | |
if [ $RETVAL -ne 0 ]; then | |
echo "$OUTPUT" | less | |
fi | |
exit $RETVAL |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment