2010-08-10 15 views
6

Sto usando git con trac. Dopo spinta Voglio due cose da fare:più comandi non funzionano in git post-ricezione

  1. l'invio di email al team di sviluppo con diff
  2. Se c'è qualche frase speciale nel messaggio di commit (come "vedi # 1"), allora voglio il messaggio di commit da inserire nel ticket Trac.

La prima cosa è risolta da git-commit-notifier. Funziona perfettamente dopo ho creato post-ricezione gancio:

 
#!/bin/sh 

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

Il mio secondo requisito può essere risolto come descriverli a http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts. Funziona perfettamente anche con tale gancio post-ricezione:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 

Entrambi 2 cose funziona quando sono separati. Ma ho bisogno di combinarli. Così ho creato il gancio di post-ricezione:

 
#!/bin/sh 

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

È molto divertente, ma questo non funziona. I comandi funzionano perfettamente quando si esegue la corsa separatamente, ma solo il primo funziona quando sono inseriti nel gancio di post-ricezione.

Se ho hook:

 
#!/bin/sh 

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

faccio visualizza il seguente errore

 
/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 

Ma se cambio di ordine di questi 2 comandi non ricevo errori, ma solo la il primo comando funziona.

Apprezzerò qualsiasi aiuto. Sto cercando di risolvere questo problema da molto tempo e non ho idee.

+0

@bessarabov: sembra che il suo tentativo di leggere da STDIN, ma non può, presumibilmente perché la prima linea è una lettura tutto. – ngoozeff

+0

Se ngoozeff ha ragione, chiedi al tuo hook di copiare il suo stdout in un file temporaneo, quindi reindirizza il file temporaneo in ciascuno dei due comandi. – bstpierre

+0

@ngoozeff grazie! il tuo suggerimento è corretto al 100%. =) Con l'aiuto di @bstpierre tutto funziona ora! – bessarabov

risposta

5

Supponendo che il mio commento è corretta, e commit-updater sta mangiando tutto stdin, questo dovrebbe fare il trucco:

#!/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

Grazie! L'unica cosa che ho dovuto cambiare nel tuo script è di rimuovere le virgolette: FILE = mktemp E dopo che funziona perfettamente =) – bessarabov

+0

@bessarabov: rimosso i backtick. grazie – ngoozeff

+3

sono necessari i backtick, altrimenti si ottiene "mktemp" come nome file. – cweiske

1

ho trovato la soluzione di ngoozeff utile, ma ho dovuto fare alcune aggiunte. All'inizio, lo script dovrebbe fallire se uno dei due fallisce. Al secondo, alcuni hook potrebbero aspettarsi argomenti. Nel mio caso il gancio gitzilla era così.

Per me il seguente lavorato per combinare gitzilla e gitolite ganci:

#!/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 

Annotare il $ * e le dichiarazioni di uscita. Puoi anche utilizzare la variabile $ GIT_DIR. I file update.gitzilla e update.gitolite sono collegamenti simbolici.

1

Un'alternativa all'utilizzo di un file potrebbe essere:

#!/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 

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

+0

Questo non funzionerebbe bene con la spedizione, ad es. chiamando/usr/share/git-core/contrib/hooks/post-receive-email, perché viene creato un nuovo processo per ogni linea di input, in modo che possa creare il numero di e-mail. –

0

Poiché i dati di input non è poi così grande, si può andare senza file temporaneo e conservare i dati nella shell :

#!/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 
Problemi correlati