Pergunta

Na minha aplicação web eu tenho um arquivo que contém o número da revisão atual via $Rev$.Isso funciona bem, exceto que, se eu não fizer nenhuma alteração nesse arquivo, ele não será confirmado.

Existe alguma maneira de forçar um único arquivo a ser sempre confirmado no servidor SVN?

Estou usando o TortoiseSVN para Windows, então qualquer código ou instruções passo a passo seriam úteis.

Foi útil?

Solução

Se você tiver o TortoiseSVN instalado, também terá a ferramenta SubWCRev disponível.Use essa ferramenta para obter a revisão em vez de usar indevidamente a palavra-chave $REV$.

  1. crie um arquivo de modelo que contenha suas definições, talvez algo como

    const longo WC_REV = $WCREV$;

    em um arquivo chamado version.h.tmpl

  2. em cada compilação, chame SubWCRev para criar o arquivo 'real' que você pode usar em sua aplicação:

    Caminho SubWCRev\para\workingcopy caminho o\version.h.tmpl caminho o\version.h

Isto criará o arquivo version.h a partir de version.h.tmpl, com o texto $WCREV$ substituído pela revisão em que sua cópia de trabalho está atualmente.

O documentos para SubWCRev pode ajudar também.

Outras dicas

Basicamente, você quer a saída do svnversion comando em um arquivo.

Esses arquivos geralmente são mantidos fora do repositório e criados automaticamente por um script de construção.Eu sugiro que você faça o mesmo.Se você não constrói, mas apenas para um svn up no lado do servidor, basta ligar svnversion depois svn up ou crie um script de shell para executar as duas ações.

Se você ter por outro lado, mantê-lo no repositório, chamando svnversion em um gancho de pré-confirmação seria sua melhor aposta.

Acho que você pode não estar entendendo como funciona a flag $Rev$.O objetivo do sinalizador Rev não é ter esta revisão sempre comprometida no repositório do Subversion.O objetivo é que em uma atualização a flag Rev seja sempre a mesma da revisão. Você não deve precisar colocar código no Subversion que contenha a revisão. O Subversion é muito bom em acompanhar essas informações para você.

O que você provavelmente perdeu é que você precisa definir uma propriedade no arquivo para que a palavra-chave Revisão seja processada corretamente.

svn propset svn:keywords "Revision" file.txt

Isso garantirá que sempre que você fizer uma atualização, o $Rev:O sinalizador xxx$ será atualizado com a revisão atual.Você não precisa se preocupar em como ele será confirmado no repositório.

@gatekiller:Parece que o TortoiseSVN suporta Ganchos do lado do cliente.

Isso funciona bem, exceto que, se eu não fizer nenhuma alteração nesse arquivo, ele não será confirmado.

Se o arquivo nunca muda, por que você precisaria que ele fosse confirmado todas as vezes?

Editar] @sean = Entendo o que ele está tentando fazer, mas se o arquivo nunca estiver sendo atualizado por meio de um gancho ou algum outro processo e, portanto, nunca muda, o SVN nunca o pegará.

Sugiro mudar a abordagem, submeter um arquivo sempre significa manter implicitamente o número de revisão global nesse arquivo.O usuário pode precisar de outra palavra-chave, Chave Global, cuja inexistência é explicada aqui Na verdade, eu não usei mencionado svnversão no entanto, isso pode levar você a uma solução.

O arquivo do número de revisão poderia ser alterado por um script que implanta seu site do SVN no servidor web?

Não tenho certeza sobre o Windows, mas usando um script bash, eu faria algo como ..

$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt

Então /tmp/staging/version.txt conteria "Revisão:1" (ou qualquer que seja o número de revisão mais alto).

É claro que você poderia substituir algum identificador em um arquivo, como $Rev$ (em vez de criar version.txt conforme o exemplo acima)

Dependendo do seu cliente, alguns deles oferecem um gancho de pré-confirmação que você pode implementar algo que simplesmente "toca" no arquivo e sinaliza-o como alterado.Se você estiver usando algo como o Visual Studio, poderá criar uma tarefa pós-compilação que "toque" no arquivo, mas precisará certificar-se de fazer uma compilação antes de confirmar as alterações.

@gradonmantank:Porque ele deseja que o arquivo seja atualizado com o número de revisão mais recente.Você leu a pergunta dele completamente?

O gancho de pré-confirmação pode funcionar.

Eu costumava ter uma maneira manual de fazer isso.Eu executaria um script que usaria sed para substituir um comentário pelo carimbo de data/hora atual em meu arquivo $Rev$.Dessa forma, o conteúdo do arquivo mudaria e o Subversion o submeteria.

O que não fiz foi levar isso para a próxima etapa:usando Ganchos de repositório do Subversion para automatizar o processo.O problema é que não tenho certeza se você tem permissão para alterar o conteúdo do arquivo nos ganchos.A documentação parece sugerir que você não pode.

Em vez disso, acho que você precisaria de um pequeno script para executar no lugar do svn commit comando que primeiro atualiza o carimbo de data/hora e depois executa o commit normal.

Enviar o arquivo não faria nenhum bem.O arquivo não é confirmado com a versão completa, ele é substituído apenas pela palavra-chave.Se você olhar o arquivo dentro do repositório, verá isso.

Como tal, você precisa forçar a atualização do arquivo de alguma forma.

Se você estiver na plataforma Windows, poderá usar a ferramenta SubWCRev, distribuída com o TortoiseSVN.Documentação aqui.

Você pode usar svn pre-commit-hooks para fazer isso.
A ideia geral que tenho em mente é criar uma que antes do commit coloque o novo número de revisão no arquivo (obtenha-o usando o svnlook) ou talvez altere uma propriedade falsa no arquivo (ela precisa ser alterada ou o SVN irá ignorá-la).

Para obter mais informações sobre ganchos de pré-commit que encontrei esta página útil.

Acho que a melhor abordagem para garantir que haja um arquivo em seu aplicativo da web que tenha o número de revisão SVN é não ter um arquivo que você submeta, mas sim extraí-lo como parte de seu script de construção.

Se você usa maven, você pode fazer isso com o plugin maven-buildnumber.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top