SVN post-commit atualizando para a versão incorreta

2

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.

    
por andrewsi 12.06.2013 / 21:56

1 resposta

1

Por que não executar uma tarefa cron a cada alguns minutos para atualizar a cópia de trabalho. Ele contornará o problema que você está tendo ao fazer isso como um hook de post commit e isso salvará os desenvolvedores do problema de ter que esperar que uma atualização de svn seja completada toda vez que eles cometerem.

    
por 17.06.2013 / 21:12

Tags