When reviewing code, a simple first step in checking that it doesn’t include any errors is to run a syntax check. In this post, I outline how to set up tools to scan all the code in a directory for syntax errors, and how to run this scan automatically when committing your code to git. For simplicity’s sake I am assuming that you are running Ubuntu, but the principles apply to any development environment.
PHP
The command line version of PHP (package php7.x-cli
) allows you to syntax check a single file:
php -l /path/to/file.php
I use a wrapper script around this to scan a whole directory:
#!/bin/sh if [ $# -eq 0 ] then DIR=. elif [ -d "$1" ] then DIR="$1" else echo Usage: "$0" \[directory\] exit 1 fi find "$DIR" -type f -iname "*.php" | while read i do php -l "$i" | grep -v No\ syntax\ errors\ detected\ in\ \. done exit 0
Save this script to a suitable location, e.g. /usr/local/bin/phplint
and make it executable with chmod +x /usr/local/bin/phplint
. You can now scan all PHP files in the current directory by running phplint
, or all of the PHP files in another directory by running phplint /path/to/dir
. If you don’t see any output, that means there are no errors.
JavaScript
Similarly to PHP, you can syntax check a single JavaScript file by installing package nodejs
and then running:
node -c /path/to/file.js
You can use this wrapper script around this to scan a whole directory:
#!/bin/sh if [ $# -eq 0 ] then DIR=. elif [ -d "$1" ] then DIR="$1" else echo Usage: "$0" \[directory\] exit 1 fi find "$DIR" -type f -iname "*.js" | while read i do node -c "$i" done
Save this script to a suitable location, e.g. /usr/local/bin/jslint
and make it executable with chmod +x /usr/local/bin/jslint
. (Note: this name might conflict with other packages – try running jslint
before you set up this script, to see if you already have another executable with the same name on your path.) As with the PHP script, if you don’t see any output, that means there are no errors.
Python
You can syntax check a single Python file by compiling it to bytecode:
python3 -m py_compile file.py
This will create a folder __pycache__
in the current directory containing the compiled version of the file. If there are any syntax errors in the file, it will warn about them on the command line. No output means no errors were found. It’s not necessary to write a wrapper script for this, as Python on Ubuntu ships with a handy tool to byte-compile all files in a directory:
py3compile /path/to/files
Integrating with Git hooks
If you want to automatically code for syntax errors before each git commit, simply add one or more of the above scans to the pre-commit hook in .git/hooks/pre-commit
. Remember to include a shebang at the top and make the hook executable with chmod +x .git/hooks/pre-commit
. For example:
#!/bin/sh py3compile . phplint jslint