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.
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.
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 |
É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
#!/bin/sh
if [ "$1" == "commit" ]; then
tla push-mirror lord@emf.net--2003-example \
lord@emf.net--2003-example-MIRROR;
fi
#!/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
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