2010-03-31 4 views
0

J'ai un crochet post-commit svn qui fonctionne bien à partir de la ligne de commande lorsque je lancescénario commit post-svn passe de la ligne de commande, mais pas lorsque le fichier commiting (s) à svn

env - ./foo.sh /path/to/svn/repos/ 12345 

mais Lorsque le script est appelé depuis svn, il ne semble pas fonctionner. Ce que je fais essentiellement est de vérifier les fichiers validés et si un fichier particulier est modifié, je fais une exportation svn de celui-ci vers un partage réseau. Fonctionne très bien à partir de la ligne de commande.

Le script post-commit est la suivante:

#!/bin/sh 

REPOS="$1" 
REV="$2" 

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"` 
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip" 
DEST="/mnt/build/somefile-r$REV.zip" 

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]] 
then 
     `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST` 
fi 

exit 0 

est-il un moyen de sortie des messages d'erreur dans un fichier lorsque le script est exécuté, ou plus précisément la ligne d'exportation de svn (où je pense qu'il pourrait y avoir un problème)?

+0

pour les curieux, j'ai découvert que le script, lorsqu'il est invoqué par svn, est lancé en tant qu'utilisateur qui a vérifié dans le fichier (s). Passer de l'utilisation du schéma svn + ssh: // à un fichier: // à la place l'a corrigé – funkadelic

Répondre

1

La sortie standard d'un script hook est supprimée, mais l'erreur standard revient au client, au moins dans les versions récentes de Subversion. Je pensais que cela avait été comme ça pendant un moment, mais le livre svn 1.4 dit que la sortie est rejetée, donc vous pourriez vouloir vérifier que vous exécutez une version à jour du serveur - voir l'erreur standard flux est un bon moyen d'obtenir un avertissement précoce des types communs d'erreur.

Pour envoyer la sortie d'une commande dans un fichier, et comprennent la sortie d'erreur standard dans le fichier trop pour le garder en un seul endroit, faire

command >/path/to/logfile 2>&1 

Utilisez >> plutôt que > à ajouter à la fichier:

command >>/path/to/logfile 2>&1 

Parce que la sortie d'erreur standard est envoyée au client svn, vous pouvez également transmettre les informations de la sortie standard de retour de cette façon, que ce soit pour une seule commande,

command 1>&2 

ou pour le script entier, en mettant

exec 1>&2 

en haut du script. En un coup d'œil, je vois un problème avec votre script: en supposant que les backquotes sur la ligne d'export svn ne sont pas un artefact du balisage, vous devriez les supprimer. (Ils exécutera la commande d'exportation que vous avez écrit, puis prendre la sortie, et d'exécuter cette sortie comme une autre commande -. Presque certainement pas ce que vous aviez l'intention)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]] 
then 
     /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2 
fi 

(je ne sais la syntaxe de test du double-carré dans bash, c'est une belle nouvelle découverte pour moi!)

+0

merci! J'ai fini par ajouter "exec >> /tmp/foo.log" en haut de mon script. – funkadelic

Questions connexes