-
-
Save mariovalney/174760f2e4387bdeb4ade32986294cfb to your computer and use it in GitHub Desktop.
| #!/bin/sh | |
| ######################### | |
| # # | |
| # Initializing # | |
| # # | |
| ######################### | |
| ## | |
| # You should add all tools as composer dependencies or change this path | |
| # | |
| # composer require phpmd/phpmd | |
| # composer require squizlabs/php_codesniffer | |
| ## | |
| PHPCS_BIN=./vendor/bin/phpcs | |
| PHPCBF_BIN=./vendor/bin/phpcbf | |
| # Check for PHPCS / PHPCBF | |
| if [ ! -x $PHPCS_BIN ]; then | |
| echo "[PRE-COMMIT] PHP CodeSniffer is not installed locally." | |
| echo "[PRE-COMMIT] Please run 'composer install' or check the path: $PHPCS_BIN" | |
| exit 1 | |
| fi | |
| if [ ! -x $PHPCBF_BIN ]; then | |
| echo "[PRE-COMMIT] PHP Code Beautifier and Fixer is not installed locally." | |
| echo "[PRE-COMMIT] Please run 'composer install' or check the path: $PHPCBF_BIN" | |
| exit 1 | |
| fi | |
| PHPMD_BIN=./vendor/bin/phpmd | |
| # Check for PHPMD | |
| if [ ! -x $PHPMD_BIN ]; then | |
| echo "[PRE-COMMIT] PHP Mess Detect is not installed locally." | |
| echo "[PRE-COMMIT] Please run 'composer install' or check the path: $PHPMD_BIN" | |
| exit 1 | |
| fi | |
| ######################### | |
| # # | |
| # Starting # | |
| # # | |
| ######################### | |
| # All files in staging area (Added | Created | Modified | Renamed) | |
| PROJECT=$(git rev-parse --show-toplevel) | |
| FILES=$(git diff --cached --name-only --diff-filter=ACMR HEAD | grep .php) | |
| if [ "$FILES" != "" ] | |
| then | |
| # Coding Standards | |
| echo "[PRE-COMMIT] Checking PHPCS..." | |
| # You can change your PHPCS command here | |
| $PHPCS_BIN -n $FILES | |
| if [ $? != 0 ] | |
| then | |
| echo "[PRE-COMMIT] Coding standards errors have been detected." | |
| echo "[PRE-COMMIT] Running PHP Code Beautifier and Fixer..." | |
| # You can change your PHPCBF command here | |
| $PHPCBF_BIN -n $FILES | |
| echo "[PRE-COMMIT] Checking PHPCS again..." | |
| # You can change your PHPCS command here | |
| $PHPCS_BIN -n $FILES | |
| if [ $? != 0 ] | |
| then | |
| echo "[PRE-COMMIT] PHP Code Beautifier and Fixer wasn't able to solve all problems." | |
| echo "[PRE-COMMIT] Run PHPCS manually to check and fix all errors." | |
| exit 1 | |
| fi | |
| echo "[PRE-COMMIT] All errors are fixed automatically." | |
| git add $FILES | |
| else | |
| echo "[PRE-COMMIT] No errors found." | |
| fi | |
| # Mess Detector | |
| echo "\n[PRE-COMMIT] Checking PHPMD...\n" | |
| for FILE in $FILES | |
| do | |
| # You can change your PHPMD command here | |
| $PHPMD_BIN $PROJECT/$FILE text phpmd.xml | |
| if [ $? != 0 ] | |
| then | |
| echo "\n[PRE-COMMIT] Fix errors before commit." | |
| exit 1 | |
| fi | |
| done | |
| fi | |
| exit $? |
Great hook but I have a difficulties trying to detecting changed files in line
FILES=$(git diff --cached --name-only --diff-filter=ACMR HEAD | grep core/ | grep .php)
I don't know why maybe it's a operation system issue I tryin launch it on CLI interface in ubuntu 21.04
For me it's work fine when I changed line to
FILES=$(git diff --name-only --diff-filter=ACMR HEAD | grep \\.php )
Like already mentioned it's a great hook. But like Oleg mentioned I also have issues with grep core/ because then it fetches no files.
Removing that works for me as well then.
Why do you @mariovalney use that part in the first place, just curious?
You can check explanation here.
This hook is like a default in my projects and when I published this I copied from a old project when all code were placeded in "core" directory. My mistake. I should copied from a version without this standard.
FILES=$(git diff --cached --name-only --diff-filter=ACMR HEAD | grep .php)
Great! Thank you for explanation.
Download and put into
.git/hooksdirectory.You can do:
cp pre-commit .git/hooks/pre-commitThen, make it executable:
chmod +x .git/hooks/pre-commit