Les gens qui travaillent avec moi savent que je suis un "Syntax nazi". Je ne supporte pas quand le code ne suit pas les conventions. Ainsi, pour éviter de rager quand j'update mes sources, j'ai décidé de créer un hook SVN pour valider les commits des fichiers PHP.
Vous l'aurez donc compris, il s'agit ici de valider les uniquement les fichiers PHP suivant la norme PSR2. Par ailleurs, je ne m'attarde que sur le code de l'équipe de développement. Il s'agit donc de tout ce qui se trouve dans le répertoire "src" des applications symfony2 que nous développons.
Un hook SVN est un script qui sera exécuté à un instant donné et qui, suivant le code d'erreur, va valider ou non l'action en cours. Dans le cas de commit SVN, le hook est "pre-commit". Il se place dans le répertoire "hooks" du dépôt SVN et se nomme "pre-commit". Vous y trouvez d'ailleurs des fichiers .tmpl donnant quelques exemples.
Mon script s'appuie sur PHP_CodeSniffer (phpcs) que j'ai installé via composer. En effet, il existe un paquet Debian pour phpcs mais le standard PSR2 n'est pas pris en charge dans celui de la Wheezy (version de Debian du serveur SVN).
Voici le contenu du script :
#!/bin/sh
SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/local/src/phpcs/vendor/bin/phpcs
STANDARD=PSR2
SEVERITY=1
FINAL_REPORT=
for FILE in `$SVNLOOK changed -t "$2" "$1" | egrep -v '^D' | cut -b 5- | egrep '^src.*\.php$'`; do
REPORT=`$SVNLOOK cat -t "$2" "$1" "$FILE" | $PHPCS --standard=$STANDARD -n --report=full --error-severity=$SEVERITY | sed 's,STDIN,'$FILE','`
if [ -n "$REPORT" ]; then
FINAL_REPORT="$FINAL_REPORT$REPORT\n\n"
fi
done
if [ -n "$FINAL_REPORT" ]; then
echo "$FINAL_REPORT" >&2
exit 1
fi
exit 0
Voici un exemple de sortie lorsque la validation échoue :
Envoi src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
Envoi src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
Envoi src/FooBar/Bundle/PacteBundle/Controller/TeamController.php
Transmission des données ..svn: E165001: Échec de la propagation (commit), détails :
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
FILE: src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
18 | ERROR | Spaces must be used to indent lines; tabs are not allowed
18 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
18 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
19 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
32 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------
FILE: src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
15 | ERROR | Spaces must be used to indent lines; tabs are not allowed
15 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
15 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
16 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
18 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------
Édit : mise à jour du code qui plantait lors de la suppression d'un fichier.

Expiration de certificats SSL
Fin avril dernier, j'ai publié un projet qui génère un récapitulatif de la date d'expiratio…

Outil de création d’un espace web Apache et PHP
Dans mon activité personnelle et professionnelle, je suis amené à créer des espaces d’héber…

API pour récupérer le contenu Open Graph d'une page web
Pour la fonctionnalité de partage de liens sur ce blog, j'ai développé un script qui récupé…