Temos um problema estranho com o SVN e seu gancho post-commit.
Temos vários sites, e esse problema afeta apenas um (pelo menos que eu encontrei). Há um gancho post-commit com este código:
#!/bin/sh
REPOS="$1"
REV="$2"
WC=/srv/www/sites/sitename
date | tee -a $REPOS/hooks/log.txt
cd $WC && svn update 2>&1 >> $REPOS/hooks/log.txt
echo | tee -a $REPOS/hooks/log.txt
O gancho é executado quando eu me comprometo; o diretório existe; e o usuário é executado como tem as permissões corretas para acessar o diretório (eu ajustei o código para o gancho para ecoar ambos para o arquivo de log para verificar).
Quando eu sugo para o usuário, e mudo para o diretório, posso executar svn update
- ele será atualizado com a revisão mais recente. Quando eu faço através do gancho, não vai.
Fiz algumas cutucões e descobri que quando o gancho é executado, svn update
é acionado; mas não está fazendo nada com a nova revisão que acabou de ser confirmada. Eu removi um arquivo do diretório de destino e confirmei uma alteração - o arquivo foi restaurado, mas de uma revisão anterior - a última revisão que eu atualizei manualmente, na verdade.
Há claramente algo estranho acontecendo, mas não consigo descobrir o que. A configuração do repositório parece OK, mas eu não sei o suficiente sobre o SVN para reduzi-lo ainda mais. Eu apreciaria qualquer dica que alguém pudesse ter sobre onde procurar em seguida.
Editar
svn info
me dá:
URL: file:///srv/svn/repos/sitename/trunk
Repository Root: file:///srv/svn/repos/sitename
Repository UUID: 8f30e7d8-358c-4aa0-ba90-4bb80c6b434e
Revision: 132
Node Kind: directory
Schedule: normal
Last Changed Author: authorname
Last Changed Rev: 132
Last Changed Date: 2013-06-17 09:47:46 -0400 (Mon, 17 Jun 2013)
A saída do arquivo de log não é útil; quando eu acabo de enviar arquivos, estou vendo:
Mon Jun 17 10:05:08 EDT 2013
Qual foi a hora em que o commit foi feito pela última vez. svn update
não está transmitindo nada para o arquivo de log.
Acabei de criar uma nova revisão - adicionei um novo arquivo à minha cópia local do repositório e excluí README
do diretório de destino. Isso me dá o seguinte no arquivo de log:
Mon Jun 17 10:11:44 EDT 2013
Restored 'README'
A revisão que acabei de confirmar foi 134. Não há sinal do novo arquivo, e svn info
me diz que o último registro alterado ainda é 132.
Editar, novamente
Adicionei alguns códigos de depuração ao gancho, conforme solicitado:
echo $@ >> /tmp/tempfile;
env | tee -a /tmp/tempfile;
Isso dá:
/srv/svn/repos/sitename 150
OLDPWD=/
PWD=/srv/www/sites/sitename
150 é a revisão que acabei de adicionar.
Editar, novamente
Como solicitado. O primeiro é de quando eu fiz uma mudança e cometi (nada foi atualizado); a segunda é depois que eu apaguei um arquivo e confirmei novamente (o arquivo foi restaurado, mas de uma versão anterior)
/srv/svn/repos/sitename 153
OLDPWD=/
PWD=/srv/www/sites/sitename
/srv/svn/repos/sitename 154
OLDPWD=/
PWD=/srv/www/sites/sitename
Editar, novamente,
Eu criei um novo diretório de trabalho, enquanto logado como www-data. Eu fiz o checkout inicial como o mesmo usuário; e depois comprometido. E svn update
não fez nada.
Tenho a certeza de que este não é um erro óbvio de permissão de arquivo. O gancho está definitivamente executando o comando svn update
, porque quando eu excluo um arquivo do diretório de trabalho e executo um commit, ele está restaurando o arquivo que eu deletei.
É como se o svn não estivesse vendo a nova versão. O comando que estou usando no momento é:
REPOS="$1"
REV="$2"
WC=/srv/www/sites/sitename
/usr/bin/svn update -r $REV "$WC" 2>&1
$1
é o nome correto do repositório. $2
é o número da versão mais recente e correto. $WC
é o diretório correto.
- Quando eu envio um arquivo, o gancho é executado, mas não é atualizado (mesmo com o sinalizador -r definido).
- Quando executo
svn commit
como o usuário certo, no diretório correto, ele é atualizado corretamente
- Quando eu excluir um arquivo do diretório de trabalho e confirmar, esse arquivo será restaurado, mas a partir da revisão mais recente será executada manualmente.
E, no interesse do preenchimento, também tentei usar versões mais antigas do número de revisão. Quando eu fiz /usr/bin/svn update -r 10 "$WC" 2>&1
[há cerca de 140 revisões], ele não fez alterações - nada foi excluído, nada foi adicionado.
Atualize o quinto
Adicionar o svn update
ao cron foi exatamente o mesmo de quando foi iniciado pelo gancho post-commit; ele atualizaria para a última versão em que eu executei svn update
, mas as revisões mais recentes seriam omitidas. Se não houvesse diferenças entre o diretório de trabalho e a última versão, isso não faria nada. E sim, o cron estava sendo executado. Eu tentei isso tanto como o usuário correto, e como root, sendo um pouco frustrado nesse ponto.
Além disso, acabei de recriar o repositório e o diretório de trabalho. Eu adicionei o conteúdo do meu diretório de trabalho local ao novo repositório, e ele está se comportando exatamente da mesma maneira. Mesmo que a configuração seja idêntica a um site de desenvolvimento diferente que eu configurei esta manhã.
Então eu estou desistindo neste momento. O incômodo envolvido na tentativa de corrigir isso adequadamente supera a inconveniência de ter que atualizá-lo manualmente ocasionalmente. Obrigado a todos por lerem isto e pelas suas sugestões.