· Tech watch

Utilisation des « Hooks » avec subversion

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 :

  1. 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.
  2. post-lock : notification lors du succès d’un lock. Souvent utilisé pour envoyer un email lors d’un lock.
  3. 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.
  4. post-unlock : De même que précédemment.
  5. 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).
  6. post-commit : notification du succés de la transaction de commit. Généralement utilisé pour envoyer un mail à un administrateur.
  7. 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.
  8. 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.
  9. 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 :

4 commentaires

  1. Ludovic Gasc (GMCL2)

    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.

  2. 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

  3. Voici un autre petit projet qui pourrait intéresser les développeurs PHP: http://jeanmonod.github.com/php-svn-hook/

  4. 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.

Les commentaires sont désormais fermés.