Il est facile d’ajouter des fichiers invalides dans un système de contrôle de version si on ne fait pas attention. Un des moyens d’éviter ça, c’est d’utiliser les hooks de git.
On peut « s’accrocher » à un événement, et exécuter du code à ce moment. Git permet de le faire à peu près n’importe quand : avant un commit, avant un push, après un checkout… La liste complète des possibilités est dans la doc.
Pour cela, il suffit d’ajouter un script shell dans le répertoire .git/hooks d’un dépôt git. On peut d’ailleurs y trouver quelques exemples (inactifs, il faut les renommer pour les « activer »).
Pour éviter de soumettre des fichiers à la syntaxe invalide, on peut donc écrire un hook pre-commit en creant le fichier pre-commit dans ce répertoire. Ce script s’exécutera avant que le commit soit réalisé lorsque l’on exécute la commande commit.
Voici son code :
#!/bin/sh<br />
modifiedFiles=git diff --cached --name-only --diff-filter=ACM
;<br />
error=false;</p>
<p>for file in $modifiedFiles; do<br />
if [[ $file =~ ..php ]]; then<br />
result=php -l $file 2>&1
;<br />
if [[ $result =~ .‘Parse error’.* ]];<br />
then<br />
echo $file;<br />
echo $result;<br />
error=true;<br />
fi;<br />
fi;<br />
done</p>
<p>if [ $error != false ]; then<br />
# En cas d’erreur on empêche le commit<br />
echo “Erreur de syntaxe dans l’un des fichiers”;<br />
exit 1;<br />
fi;<br />
</code>
Le code est simple et commenté, le comprendre ne devrait pas poser de problème (l’écrire a demandé quelques coups de main à google ceci-dit. bash, quelle galère…). La vérification de syntaxe se fait avec php -l, le linter de PHP, en parsant le texte de sortie car il n’y a pas de code de retour qui permette de déduire une erreur de syntaxe. En cas d’erreur, on interrompt le commit et on affiche les fichiers à corriger. Simple et efficace.
On pourrait bien sûr faire d’autre vérifications : validation de la syntaxe des fichiers JavaScript avec jslint, assurer le bon respect des règles de codage avec PHPCS…
Plus d’informations sur les hooks dans la documentation.