• [SVN] Être averti en temps réel des commits envoyés

    Quand on travaille sur un projet avec plusieurs personnes et qu'on utilise SVN, il peut être utile d'être averti en temps réel des commits qu'envoient les autres collaborateurs.

    Je me suis inspiré de l'idée de Metrokid et du script de Christophe-Marie pour faire un petit script de notification par Cron.

    Nous aurons besoin de la commande notify-send disponible dans le paquet libnotify-bin. Si vous ne l'avez pas, installez le :

    $ sudo aptitude  install libnotify-bin
    [code=bash]$ sudo aptitude  install libnotify-bin[/code]

    Et voilà notre petit script, que nous nommerons .svn-monitor.sh et que nous placerons dans le dossier home de l'utilisateur courant ($HOME) :

    #!/bin/bash
     
     # Pour que cron sache sur quel moniteur afficher la notification
     DISPLAY=:0.0
     
     # Fichier dans lequel on stocke la date de dernière révision testée
     LOGFILE=$HOME/.svn-monitor
     # URL du dépôt SVN
     SVNPATH=http://url-du-depot
     # Nom d'utilisateur dont les révisions ne seront pas affichées
     USERNAME=Skreo
     # Icône utilisée dans la fenêtre de notification
     ICON='/usr/share/icons/gnome/32x32/status/dialog-information.png'
     # Durée d'affichage de la fenêtre de notification
     DURATION=5000
     
     # Révision à vérifier
     if test -f $LOGFILE ; then
        REV=$(( `cat $LOGFILE` +1 ))
     else
        REV=HEAD
     fi
     
     # Récupération du log de la dernière révision
     TEXT=`svn log $SVNPATH -r $REV:HEAD | sed -r "s/^-+$/---/" | sed -r "s/^r([0-9]+) \| ([^ ]+) \| [^(]*\(([^)]+)\).*$/rév \1 par \2 le \3/"`
     
     # Si on obtient un résultat, on l'affiche
     if test "$TEXT" != "" ; then
     
        # Détermination de la dernière révision
        LASTREV=`echo -e "$TEXT" | sed -r "s/^(.*rév ([0-9]+) .*|.*)$/\2/" | awk NF | sort -nr | head -1`
     
        # Suppression de l'affichage des révisions faîtes par $USERNAME
        TEXT=`echo "$TEXT" | sed -r "s/$USERNAME/-/g"`
        TEXT=`echo "$TEXT" | sed -r ':a;N;$!ba;s/---\nrév [0-9]+ par - .*\n---/---/g'`
     
        # Suppression de la première et de la dernière ligne, et suppression des lignes vides
        TEXT=`echo "$TEXT" | sed '1d' | sed '$d' | awk NF`
     
        # Affichage de la notification
        notify-send -t $DURATION -i "$ICON" "SVN" "$TEXT"
     
        # Et on l'enregistre dans le fichier
        echo $LASTREV > $LOGFILE
     fi
    [code=bash]#!/bin/bash

    # Pour que cron sache sur quel moniteur afficher la notification
    DISPLAY=:0.0

    # Fichier dans lequel on stocke la date de dernière révision testée
    LOGFILE=$HOME/.svn-monitor
    # URL du dépôt SVN
    SVNPATH=http://url-du-depot
    # Nom d'utilisateur dont les révisions ne seront pas affichées
    USERNAME=Skreo
    # Icône utilisée dans la fenêtre de notification
    ICON='/usr/share/icons/gnome/32x32/status/dialog-information.png'
    # Durée d'affichage de la fenêtre de notification
    DURATION=5000

    # Révision à vérifier
    if test -f $LOGFILE ; then
        REV=$(( `cat $LOGFILE` +1 ))
    else
        REV=HEAD
    fi

    # Récupération du log de la dernière révision
    TEXT=`svn log $SVNPATH -r $REV:HEAD | sed -r "s/^-+$/---/" | sed -r "s/^r([0-9]+) \| ([^ ]+) \| [^(]*\(([^)]+)\).*$/rév \1 par \2 le \3/"`

    # Si on obtient un résultat, on l'affiche
    if test "$TEXT" != "" ; then

        # Détermination de la dernière révision
        LASTREV=`echo -e "$TEXT" | sed -r "s/^(.*rév ([0-9]+) .*|.*)$/\2/" | awk NF | sort -nr | head -1`

        # Suppression de l'affichage des révisions faîtes par $USERNAME
        TEXT=`echo "$TEXT" | sed -r "s/$USERNAME/-/g"`
        TEXT=`echo "$TEXT" | sed -r ':a;N;$!ba;s/---\nrév [0-9]+ par - .*\n---/---/g'`

        # Suppression de la première et de la dernière ligne, et suppression des lignes vides
        TEXT=`echo "$TEXT" | sed '1d' | sed '$d' | awk NF`

        # Affichage de la notification
        notify-send -t $DURATION -i "$ICON" "SVN" "$TEXT"

        # Et on l'enregistre dans le fichier
        echo $LASTREV > $LOGFILE
    fi[/code]

    Il ne reste ensuite plus qu'à l'exécuter par cron toutes les 5 minutes par exemple.
    Pour modifier les tâches cron :

    $ crontab -e
    [code=bash]$ crontab -e[/code]

    Lignes à ajouter dans le cron :

    DISPLAY=:0.0
    LANG=fr_FR.UTF-8
    */5 * * * *     sh $HOME/.svn-monitor.sh
    [code=bash]
    DISPLAY=:0.0
    LANG=fr_FR.UTF-8
    */5 * * * *     sh $HOME/.svn-monitor.sh
    [/code]


    Tags Tags : , , , ,
  • Commentaires

    1
    Mercredi 23 Décembre 2009 à 18:56
    Jon (aka Metrokid)
    Super !! Divarvel se posait la question pour porter le script sous Linux, et tu l'as fait.

    Ta solution m'intéresse beaucoup, surtout la partie DISPLAY=:0.0 dans cron, je ne savais pas que l'on pouvait faire ça sous. Sous Mac, Quartz, l'équivalent de X11 est au courant du contexte graphique courant, donc ...

    Tu as une idée pour une version dégradée qui afficherai la même chose mais dans les points de terminaux ouverts ? (à la shutdown
    par exemple)
     
    2
    Mercredi 23 Décembre 2009 à 19:18
    Mettre le log dans fichier et l'ouvrir dans un éditeur à partir du script en cron, ça doit être à peu près pareil qu'avec ce script. Mais dans un terminal ouvert... aucune idée !
    3
    Mercredi 23 Décembre 2009 à 22:33
    Le point qui me gêne le plus dans cette histoire, ça reste quand même le cron.

    Après c'est sûr que c'est plus simple de contacter le serveur SVN à partir du poste client, mais bon, c'est bourrin quand même...

    Faudrait faire du push, et utiliser le système de hooks de SVN, mais ça devient un peu violent pour un petit script.
    4
    Mercredi 23 Décembre 2009 à 23:27
    Une requête "svn log" n'est coûteuse ni en ressources ni en BP, je vois pas trop où est le problème. Alors évidemment, ça sera du "temps réel" à + ou - 1 minute au maximum, mais c'est largement suffisant pour cette utilité.
    Un système de push serait bien sûr idéal, mais là ça devient beaucoup plus compliqué, et il faut avoir l'accès total au serveur SVN, ce que n'ont pas toujours les collaborateurs de plus ou moins vastes projets...
    5
    Groumph
    Jeudi 14 Janvier 2010 à 19:16
    il vaut mieux se servir des hooks plutôt qu'un cron. SVN est déjà prévu pour des script sur différentes actions, notament en post ou même en précommit.
    Quand tu crées ton repo, SVN te mets des examples de scripts dans le répertoire hooks qui peuvent servir de base de travail. Ensuite, google est ton ami, il y a plein d'exemples dispo partout.
    Au bureau, j'ai réussi à setter un script qui envoie un mail à une liste de distribution restreinte avec toutes les infos sur le commit qui vient d'être fait: fichier modifiés, auteur du commit, commentaire. On s'en sert pour aligner nos répertoires de travail entre la France, Singapour, la Malaisie et l'Italie. Les updates sont faits par des administrateurs locaux qui sont en copie des mails.
    6
    Jeudi 14 Janvier 2010 à 23:48
    Yep faudrait que je teste les commit hooks. Mais là je voulais tester un truc sans toucher au serveur. Dans certain projets, notamment des projets open-source, on peut très bien être commiter sans avoir accès à la configuration du serveur. Et dans ce cas il n'y a pas tellement d'autres alternatives.
    7
    Mardi 16 Mars 2010 à 23:08
    Christophe-Marie
    @Jon: tu dois pouvoir utiliser la commande "wall" (non testé)
    Suivre le flux RSS des commentaires de cet article


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :