Le gestionnaire de source Subversion a une fonctionnalité trés intéressante appelée « Hooks »
Un hook (littéralement crochet) permet de lancer un programme personnalisé au moment précis où le programme principal à la tâche de l’exécuter. Dans le cas de svn les hooks sont applicables sur les évènements de contrôle de version( commit , changement de révision, lock). On peut le comparer à la notion de trigger en sql.
Les différents évènements possibles
Deux types de « Hooks » sont possibles . On a tout d’abord ce qu’on appelle les « pre hooks » qui vont être éxécutés en amont de l’opération choisie. Ils permettent de prévenir d’un évènement ( exemple : on ne veut committer que les fichiers qui n’ont pas de commentaire vide). Le second type de hooks est appelé « post hooks » qui quant à eux vont être lancés en aval d’une opération. Le « post hooks » est souvent utilisé à des fins statistiques ou de reporting.
Subversion permet 4 types d’opérations avec les deux types de hooks pour chacun :
- pre-lock : est exécuté lorsqu’un utilisateur essaye de locker un fichier ou répertoire du repositery svn. Ce hook est souvent utilisé pour gérer les droits d’accés sur les locks au niveau utilisateur.
- post-lock : notification lors du succès d’un lock. Souvent utilisé pour envoyer un email lors d’un lock.
- pre-unlock : Ce hook permet la même intéraction que le hook pre-lock à la seule différence qu’ici on agit sur l’évènement unlock.
- post-unlock : De même que précédemment.
- pre-commit : est executé avant la transaction de commit. Généralement utilisé pour contrôlé le ou les fichiers committés ( message de commit obligatoire).
- post-commit : notification du succés de la transaction de commit. Généralement utilisé pour envoyer un mail à un administrateur.
- pre-revprop-change : est exécuté lors de changement de révision d’une propriéte svn . Contrairement aux autres hooks, celui-ci a pour but d’interdire le changement.
- post-revprop-change : notification d’un changement de propriétés. Ce hook ne peut fonctionner que si le hook pre-revprop-change est lui aussi mis en place.
- start-commit : cet évènement est un peu particulier. En effet, il est appelé avant même que l’opération de commit ne soit créée. Il sert la plupart du temps à vérifier les droits d’un utilisateur.
Mise en place et fonctionnement
La mise en place est très facile, il suffit d’enregistrer les scripts utilisés sous le nom des différents hooks utilisés dans le répertoire VOTRE_DEPOT_SVN/hooks
et de le rendre éxécutable.
Subversion founit un template(.tmpl) de chaque type d’événement, ce qui permet d’avoir un aperçu de son utilisation et de voir quel paramètre les scripts peuvent récupérer.
Voici les paramètres les plus fréquemment utilisés :
- Le path du repository
- Le nom de l’utilisateur authentifié
- Le nom de la transaction du commit
- Le numéro de version
Toutes ces variables ne sont pas accessibles depuis tous les hooks((Pour de plus amples informations et détails sur les hooks, vous pouvez consulter la documentation svn : hooks.)).
Exemple d’utilisation
Pour finir cet article , nous allons vous présenter un exemple concret de hook svn avec un hook « pre-commit » permettant de vérifier la syntaxe des fichiers php((Ce script à été crée par David Grant et est disponible sur son blog.)). Il est souvent utile dans un projet php de pouvoir vérifier que l’exécution des fichiers soient syntaxiquement avant le commit des fichiers.
# !/bin/bash #récupération du path du repositery REPOS="$1" #récupération du nom de la transaction TRANS="$2" # Définition des paths des différents binaires SVNLOOK=/usr/bin/svnlook PHP=/usr/bin/php # Pour chaque fichier modifiés for FILE in $($SVNLOOK changed -t "$TRANS" "$REPOS" | cut -b 5-) ; do #on vérifie que le fichier se termine bien par une extension php if [ "${FILE: -4}" == '.php' ] ; then # on récupère le contenu du fichier et on analyse sa syntaxe # avec la commande "php -l" $SVNLOOK cat -t "$TRANS" "$REPOS" "$FILE" | $PHP -l # On regarde le code exit d execution de la commande PHP if [ $? != 0 ] ; then # On sort en cas d erreur echo "Transaction annulée : des erreurs PHP sont présentes dans le fichier $FILE" 1>&2 exit 1 fi fi done # tout est bien passé on peut committer exit 0
Les hooks sont donc une bonne façon d’automatiser des tâches de gestion concernant le maniement des sources.
Vous pouvez aller voir d’autres exemples de hooks sur ces différents sites :
Ou bien prolonger votre savoir sur les fonctionnalités de svn :
Ludovic Gasc (GMCL2)
17 juillet 2007
post-commit est également très utile pour lancer la mise à jour d’un serveur de test pour l’application web.
En effet, il est de temps en temps nécessaire de mettre aussi à jour la base de données en plus des fichiers, ce qu’on peut faire facilement grâce à post-commit et un script sql.
Luc
26 février 2010
si ca peut intéresser quelqu’un, j’ai justement fait un script qui utilise le post-hook pour mettre à jour un site de développement/test après un commit : http://envrac.blogdns.net/shellscripts/export-automatique-d-un-projet-subversio
jeanmonod
11 juillet 2011
Voici un autre petit projet qui pourrait intéresser les développeurs PHP: http://jeanmonod.github.com/php-svn-hook/
Denis
28 juin 2012
Bonjour,
Est-ce que quelqu’un a déjà écrit un hook post-commit sur windows qui s’occupe de mettre à jour la base de donnée locale à partir d’un fichier sql ? Merci d’avance de vos réponses.