2010-08-10 43 views
6

J'utilise git avec trac. Après poussée, je veux deux choses à faire:plusieurs commandes ne fonctionnent pas dans git post-receive

  1. l'envoi d'e-mail à l'équipe de développement avec diff
  2. S'il y a une phrase spéciale commettre un message (comme « voir # 1 »), je veux que le message de commit être placé dans le billet de trac.

La première chose est résolue par git-commit-notifier. Il fonctionne parfaitement après avoir créé après réception crochet:

 
#!/bin/sh 

/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

Ma deuxième exigence peut être résolu que discribed à http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts. Il fonctionne également parfaitement avec un tel crochet post-réception:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 

Les 2 choses fonctionnent quand elles sont séparées. Mais j'ai besoin de les combiner. J'ai donc créé un hook post-réception:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

C'est très marrant, mais ça ne marche pas. Les commandes fonctionnent parfaitement bien quand elles sont exécutées séparément, mais seule la première fonctionne lorsqu'elles sont placées dans un hook post-réception.

Si j'ai tel crochet:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

Je reçois l'erreur suivante

 
/var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError) 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load' 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19 

Mais si je change d'ordre de ces deux commandes, je ne reçois pas d'erreur, mais seulement la la première commande fonctionne.

J'apprécie toute aide. J'essaie de résoudre ce problème depuis longtemps et je n'ai aucune idée.

+0

@bessarabov: ressemble à son essayant de lire STDIN, mais ne peut pas, sans doute parce que la première ligne est tout lecture. – ngoozeff

+0

Si ngoozeff a raison, demandez à votre hook de copier son fichier stdout dans un fichier temporaire, puis de rediriger ce fichier temporaire dans chacune des deux commandes. – bstpierre

+0

@ngoozeff merci! Votre suggestion est 100% correcte. =) Avec l'aide de @bstpierre tout fonctionne maintenant! – bessarabov

Répondre

5

En supposant que mon commentaire est correct, et commit-updater est en train de manger tous stdin, cela devrait faire l'affaire:

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | /var/trac/testgit/commit-updater 
cat $FILE | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
rm $FILE 
+0

Merci! La seule chose que j'ai dû changer dans votre script est de supprimer des guillemets: FICHIER = mktemp Et après cela cela fonctionne parfaitement =) – bessarabov

+0

@bessarabov: enlevé les guillemets. Merci – ngoozeff

+3

les backticks sont nécessaires, sinon vous obtenez "mktemp" comme nom de fichier. – cweiske

1

Je trouve la solution de ngoozeff utile, mais je devais faire quelques ajouts. Au début, le script devrait échouer si l'un des hooks échoue. Au second, certains hooks peuvent s'attendre à des arguments. Dans mon cas, le crochet Gitzilla était comme ça.

Pour moi qui suit travaillé pour combiner des crochets gitzilla et gitolite:

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | $GIT_DIR/hooks/update.gitzilla $* || exit 1 
cat $FILE | $GIT_DIR/hooks/update.gitolite $* || exit 1 
rm $FILE 

Notez le * de $ et les états de sortie. Vous pouvez également utiliser la variable $ GIT_DIR. Les fichiers update.gitzilla et update.gitolite sont des liens symboliques.

1

Une alternative à l'utilisation d'un fichier serait:

#!/bin/sh 

while read oldrev newrev refname 
do 
    echo $oldrev $newrev $refname | /var/trac/testgit/commit-updater 
    echo $oldrev $newrev $refname | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
done 

Source: http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-hook/

+0

Cela ne fonctionnerait pas bien avec le publipostage, par ex. en appelant/usr/share/git-core/contrib/hooks/post-receive-email, car un nouveau processus est créé pour chaque ligne d'entrée, ce qui permet de créer autant d'e-mails. –

0

Les données d'entrée ne sont pas tout ce que grand, vous pouvez aller sans fichier temporaire et conserver les données dans la coquille :

#!/bin/sh 

refs=$(cat) 
/var/trac/testgit/commit-updater <<END 
$refs 
END 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml <<END 
$refs 
END