Existe-t-il une meilleure façon d'écrire un hook de pré-commit git pour vérifier les erreurs d'analyse d'un fichier php dans un commit ?
-
09-06-2019 - |
Question
Ce que j'ai jusqu'à présent, c'est
#!/bin/sh
php_syntax_check()
{
retval=0
for i in $(git-diff-index --name-only --cached HEAD -- | grep -e '\.php$'); do
if [ -f $i ]; then
output=$(php -l $i)
retval=$?
if [ $retval -gt 0 ]; then
echo "=============================================================================="
echo "Unstaging $i for the commit due to the follow parse errors"
echo "$output"
git reset -q HEAD $i
fi
fi
done
if [ $retval -gt 0 ]; then
exit $retval
fi
}
php_syntax_check
La solution
Si la validation est une validation partielle (toutes les modifications dans l'arborescence de travail ne sont pas validées), alors cette validation donne des résultats incorrects puisqu'elle teste la copie de travail et non la copie intermédiaire.
Une façon de procéder pourrait être :
git diff --cached --name-only --diff-filter=ACMR | xargs git checkout-index --prefix=$TMPDIR/ --
find $TMPDIR -name '*.php' -print | xargs -n 1 php -l
Ce qui ferait une copie des images préparées dans un espace de travail, puis y exécuterait la commande de test.Si l'un des fichiers inclut d'autres fichiers dans la construction, vous devrez peut-être recréer l'intégralité de l'image intermédiaire dans l'arborescence de test, puis y tester les fichiers modifiés (voir : Hook de pré-commit Git :fichiers modifiés/ajoutés).
Autres conseils
Je suis désolé si c'est hors sujet, mais n'êtes-vous pas censé exécuter une sorte de tests automatisés (ce qui impliquerait que le code ne contient aucune erreur de syntaxe) avant de procéder à une validation ?
Si vous avez installé php5-cli, vous pouvez écrire votre pré-commit en PHP et utiliser la syntaxe que vous connaissez mieux.
Faites simplement quelque chose de plus semblable à.
#!/usr/bin/php
<?php /* Your pre-commit check. */ ?>
Mon implémentation PHP du hook de pré-commit vérifie si les fichiers modifiés dans git sont « sans erreur » et sont conformes à la norme PSR2 en utilisant soit « php-code-sniffer » ou « php-cs-fixer ».
#!/usr/local/bin/php
<?php
/**
* Collect all files which have been added, copied or
* modified and store them in an array - output
*/
exec('git diff --cached --name-only --diff-filter=ACM', $output);
$isViolated = 0;
$violatedFiles = array();
// $php_cs_path = "/usr/local/bin/php-cs-fixer";
$php_cs_path = "~/.composer/vendor/bin/phpcs";
foreach ($output as $fileName) {
// Consider only PHP file for processing
if (pathinfo($fileName, PATHINFO_EXTENSION) == "php") {
$psr_output = array();
// Put the changes to be made in $psr_output, if not as per PSR2 standard
// php-cs-fixer
// exec("{$php_cs_path} fix {$fileName} --rules=@PSR2 --dry-run --diff", $psr_output, $return);
// php-code-sniffer
exec("{$php_cs_path} --standard=PSR2 --colors -n {$fileName}", $psr_output, $return);
if ($return != 0) {
$isViolated = 1;
$violatedFiles[] = $fileName;
echo implode("\n", $psr_output), "\n";
}
}
}
if ($isViolated == 1) {
echo "\n---------------------------- IMPORTANT --------------------------------\n";
echo "\nPlease use the suggestions above to fix the code in the following file: \n";
echo " => " . implode("\n => ", $violatedFiles);
echo "\n-----------------------------------------------------------------------\n\n\n";
exit(1);
} else {
echo "\n => Committed Successfully :-)\n\n";
exit(0);
}