O script pós-compromisso SVN é executado na linha de comando, mas não ao cometer arquivos (s) para SVN
-
23-09-2019 - |
Pergunta
Eu tenho um gancho pós-comprometimento no SVN que corre bem na linha de comando quando eu corro
env - ./foo.sh /path/to/svn/repos/ 12345
Mas quando o script é chamado do SVN, ele não parece funcionar.
O que estou basicamente fazendo é verificar os arquivos comprometidos e, se um arquivo específico for modificado, faço uma exportação de SVN para um compartilhamento de rede. Funciona bem a partir da linha de comando.
O script pós-comprometimento é o seguinte:
#!/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
Existe uma maneira de produzir alguma mensagem de erro para um arquivo quando o script é executado, ou especificamente a linha de exportação SVN (onde acho que pode haver um problema)?
Solução
A saída padrão de um script de gancho é descartada, mas o erro padrão remonta ao cliente, pelo menos nas versões recentes de subversão. Eu pensei que era assim por um tempo, mas o livro SVN 1.4 diz que a saída é descartada, então você pode verificar se está executando uma versão atualizada do servidor-vendo o erro padrão O fluxo é uma boa maneira de obter um aviso precoce de tipos comuns de erro.
Para enviar a saída de um comando para um arquivo e incluir a saída de erro padrão no arquivo também para manter tudo em um só lugar, faça
command >/path/to/logfile 2>&1
Usar >>
ao invés de >
Para anexar o arquivo:
command >>/path/to/logfile 2>&1
Como a saída de erro padrão é enviada de volta ao cliente SVN, você também pode passar as informações da saída padrão de volta dessa maneira, seja para um único comando,
command 1>&2
ou para todo o roteiro, colocando
exec 1>&2
no topo do script.
À primeira vista, vejo um problema com o seu script: assumindo que as backtotes na linha de exportação SVN não sejam um artefato da marcação, você deve removê -las. (Eles executarão o comando de exportação que você escreveu e, em seguida, pegará sua saída e executará essa saída como outro comando - quase certamente não o que você pretendia.)
if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi
(Eu não sabia sobre a sintaxe do teste duplo quadrocete em Bash, essa é uma nova e agradável descoberta para mim!)