logo chat

Contact/Email

printImpression

Valid XHTML 1.0!

william dodé

Traduction du tutoriel Arch de Thomas Lord

Automatiser certaines procédures avec les crochets (hooks)

Dans certaines circonstances, il est très utile d'attacher des actions lors de la détection de changements dans une archive. Par exemple, vous voudrez envoyer un email de notification lorsqu'une nouvelle révision est archivée.

Ce processus est possible avec arch au moyen de crochets. Chaque fois que arch exécute une commande qui modifie une archive, arch va lancer ~/.arch-params/hook, qui doit être exécutable.

Arguments envoyés aux crochets

Lorsque arch exécute une commande qui affecte une archive, il va lancer le crochet avec comme premier argument le nom de l'action effectuée. Si un utilisateur lance une commande (telle que make-archive) le crochet va être appelé plusieurs fois avec de multiples arguments (tels que make-archive, make-category, make-branche, et make-version).

Les arguments susceptibles d'être vus sont :

commit, import, make-archive, make-branch, make-category, make-version,
precommit et tag.

Toutes ces commandes sont appelées après que la commande en question ait été exécutée avec succès -- excepté pour precommit. Le crochet precommit, comme son nom le suggère, est lancé avant chaque commit, et s'il renvoi un non-zéro en sortie, le commit est annulé. Ainsi il peut être utilisé pour accepter les commits sous condition tels que la possibilité de compiler, le succès de tests unitaires, etc.

Variables d'environnement passées aux crochets

tla passe certaines variables aux crochets lorsque c'est approprié. Les variables passées par tla sont préfixées avec ARCH_. Les variables susceptibles d'être passées sont :

Nom Description Vue par Exemple
ARCHIVE Archive involved all lord@emf.net--2003-example
CATEGORY Name of category created make-category hello-world
BRANCH Name of branch created make-branch mainline
VERSION Name of version created make-version 0.1
REVISION Name of revision involved import,tag,commit patch-6
LOCATION Location of archive make-archive ~/{archives}/2003-example
TREE_ROOT Root of working arch tree commit,import ~/wd
TAGGED_ARCHIVE Archive being tagged off tag lord@emf.net--2003-example
TAGGED_REVISION Revision being tagged off tag tla--devo--1.2--patch-1

Crochets spécifiques aux archives

Étant donné que les crochets tels que precommit peuvent être spécifiques aux archives et mis à jour en fonction de chaque archive, il est recommandé de faire un script ~/.arch-params/hook tel que celui-là :

#!/bin/sh
hook="$ARCH_TREE_ROOT/{arch}/=hook"
if [ -x "$hook" ] ;  then
   "$hook" $@
fi

Un exemple d'utilisation de crochets

#!/bin/sh

if [ "$1" == "commit" ]; then
   tla push-mirror lord@emf.net--2003-example \
      lord@emf.net--2003-example-MIRROR;
   fi

Un exemple plus complexe d'utilisation des crochets

#!/bin/sh

case "$1" in
   commit)
      case "$ARCH_CATEGORY" in
         hello-world)
            case "$ARCH_BRANCH" in
              mainline)
                   RELEASETYPE="stable"
              ;;
              devel)
                 RELEASETYPE="unstable"
              ;;
             )
              
            echo "The $RELEASETYPE version of Hello, World been upgraded. \
               New versions are available at ftp.hello.com" |\
               mailto hello-users@hello.com -s "Hello upgraded"
         ;;
         goodbye-world)
            case "$ARCH_BRANCH" in
              mainline)
                   RELEASETYPE="stable"
              ;;
              devel)
                 RELEASETYPE="unstable"
              ;;
                 RELEASETYPE="[unknown]"
             )
            esac;
            echo "The stable version of Goodbye, Cruel World been upgraded. \
               New versions are available at ftp.hello.com" |\
               mailto goodbye-users@hello.com -s "Goodbye upgraded"
         ;;
       esac
   ;;
esac

Problème de fiabilité avec les crochets

Malheureusement, quelques lois de la physique fondamentale de l'univers font qu'il est impossible à arch de garantir qu'un crochet va être appelé une seule fois seulement pour chaque nouvelle catégorie, branche, version ou révision. Une interruption (normalement rare) au mauvais moment ou un problème du système peut entraîner une notification plusieurs fois pour une même opération sur l'archive.

En conséquence, les actions des crochets doivent être étudiées pour être robustes face à cette éventualité.

De plus, si arch a été lancé plusieurs fois simultanément, les crochets vont être lancés simultanément également. Cela signifie que les projets utilisant des crochets doivent faire attention à ce que ces derniers puissent être lancés simultanément.

Version du 31/05/2004 21h18 : wilk@flibuste.net--libre   docs-tla--fr--1.0     patch-99 ... base-0