Pergunta

Estou usando o Git com Trac. Depois do push, quero que duas coisas sejam feitas:

  1. Enviando email para a equipe de desenvolvimento com diff
  2. Se houver alguma frase especial na mensagem de confirmação (como "Veja #1"), quero que a mensagem de confirmação seja colocada no ticket trac.

A primeira coisa é resolvida por Git-Commmit-Notifier. Funciona perfeitamente depois que eu criei o gancho pós-recepção:

#!/bin/sh

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

Meu segundo requisito pode ser resolvido como descrito em http://trac-hacks.org/wiki/gitplugin#post-receivehookscripts. Também funciona perfeitamente com esse gancho pós-recebimento:

#!/bin/sh

/var/trac/testgit/commit-updater

Ambas as duas coisas funcionam quando são separadas. Mas eu preciso combiná -los. Então, eu criei o gancho pós-recebimento:

#!/bin/sh

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

É muito engraçado, mas isso não está funcionando. Os comandos correm perfeitamente bem quando a corrida separadamente, mas apenas o primeiro funciona quando são colocados em gancho pós-recepção.

Se eu tenho esse gancho:

#!/bin/sh

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

Eu recebo o seguinte erro

/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

Mas se eu mudar para a ordem desses 2 comandos, não recebo erros, mas apenas o primeiro comando funciona.

Agradeço qualquer ajuda. Estou tentando resolver esse problema por um longo tempo e não tenho idéias.

Foi útil?

Solução

Assumindo que meu comentário está correto e commit-updater está comendo tudo stdin, isso deve fazer o truque:

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

Outras dicas

Achei a solução de Ngoozeff útil, mas tive que fazer algumas adições. No começo, o script deve falhar se um dos gancho falhar. Em segundo, alguns ganchos podem esperar argumentos. No meu caso, o gancho Gitzilla era assim.

Para mim, o seguinte funcionou para combinar ganchos Gitzilla e 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

Observe o $* e as instruções de saída. Você também pode usar a variável $ git_dir. Os arquivos Update.Gitzilla e Update.Gitolite são links simbólicos.

Uma alternativa ao uso de um arquivo seria:

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

Como os dados de entrada não são tão enormes, você pode ficar sem arquivo temporário e manter os dados no 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top