Created
October 24, 2018 17:11
-
-
Save carlbennett/f4d7f4a9703845a7e028c76cc9c28e30 to your computer and use it in GitHub Desktop.
Checks for PHP syntax errors in a git pre-commit hook
This file contains hidden or 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 | |
# Load the PHP environment so we can use php. | |
source /opt/remi/php72/enable | |
if [ -z "$PHP_BIN" ] | |
then | |
PHP_BIN=php | |
fi | |
if [ "$(echo -e test)" = test ] | |
then | |
echo_e="echo -e" | |
else | |
echo_e="echo" | |
fi | |
# necessary check for initial commit | |
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 | |
errors="" | |
if ! which "$PHP_BIN" >/dev/null 2>&1 | |
then | |
echo "PHP Syntax check failed:" | |
echo "PHP binary does not exist or is not in path: $PHP_BIN" | |
exit 1 | |
fi | |
# dash does not support $'\n': | |
# http://forum.soft32.com/linux2/Bug-409179-DASH-Settings-IFS-work-properly-ftopict70039.html | |
IFS=' | |
' | |
# get a list of staged files | |
for line in $(git diff-index --cached --full-index $against) | |
do | |
# split needed values | |
sha=$(echo $line | cut -d' ' -f4) | |
temp=$(echo $line | cut -d' ' -f5) | |
status=$(echo $temp | cut -d' ' -f1) | |
filename=$(echo $temp | cut -d' ' -f2) | |
# file extension | |
ext=$(echo $filename | sed 's/^.*\.//') | |
# only check files with php extension | |
if [ "$ext" != "php" ] | |
then | |
continue | |
fi | |
# do not check deleted files | |
if [ "$status" = "D" ] | |
then | |
continue | |
fi | |
# check the staged file content for syntax errors | |
# using php -l (lint) | |
result=$(git cat-file -p $sha | "$PHP_BIN" -n -l -ddisplay_errors\=1 -derror_reporting\=E_ALL -dlog_errrors\=0 2>&1) | |
if [ $? -ne 0 ] | |
then | |
# Swap back in correct filenames | |
errors=$(echo "$errors"; echo "$result" | grep ':' | sed -e "s@in Standard input code on@in $filename on@g") | |
fi | |
done | |
unset IFS | |
if [ -n "$errors" ] | |
then | |
echo "!! PHP Syntax check failed !!" | |
$echo_e "$errors" | |
echo "" | |
exit 1 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment