Notícias do Suporte Direto
Incluir versão do SVN no Programa Delphi compilado
Autor: William D. Knak
Data: 19/10/2006
Links e imagens corrigidos - 12/01/2015
A seguir vou descrever a solução que implementei nos meus programas para compilar junto no executável o número da revisão do SVN no binário, bem como outras informações.
Isso é bastante útil pois se o seu cliente liga solicitando suporte você tem como identificar de imediato qual versão que o cliente possui em relação à versão que você está trabalhando.
Pra você que não está familiarizado com o SVN ou outro controle de versão, sugiro que faça uma pesquisa no Google e conheça essa maravilhosa ferramente, muito importante na organização dos seus projetos.
O número da revisão do SVN é incrementado sempre que uma atualização em um ou mais arquivos ou diretórios é enviada de volta para o repositório. Essa informação também fica oculta no diretório de trabalho, nas pastas ".svn".
A solução para obter essa versão e incluí-la no seu programa Delphi é relativamente simples, e na verdade não utiliza o SVN em si, mas sim um programa utilitário provido pelo TortoiseSVN, um aplicativo "cliente" do SVN, que também roda em estações com repositórios locais (na própria estação ou compartilhado na rede) sem necessidade do "servidor" SVN.
Esse programa é o "SubWCRev.exe" e encontra-se no diretório de instalação do TortoiseSVN.
No prompt do MS-Dos execute o programa sem parâmetro algum e você obterá o Help do programa, bem como as palavras-chave utilizadas para obter as informações do repositório (veja abaixo)
Linha de comando
O programa funciona como linha de comando, e os parâmetros são o seguintes:
SubWCRev diretorio_copia_trabalho arquivo_template arquivo_destino [-nmdf]
diretorio_copia_trabalho: o diretório da cópia de trabalho (onde você fez o "Obter/Checkout") que contém as informações do SVN, pode ser o diretório raiz, ou um subdiretório (verifique qual o mais adequado)
arquivo_template: você deverá criar um arquivo modelo ou "template" que vai possuir as palavras-chaves que você quer usar
arquivo_destino: o nome do arquivo que será gerado após rodar o SubWCRev
[-nmdf]: parâmetros extras, consulte o help do programa, por enquanto não o usaremos
A técnica
A técnica usada vai ser a de criar um arquivo Template com as palavras chaves, e apartir deste arquivo será gerado um arquivo .PAS com as informações do SVN em forma de constantes. Primeiro deve-se criar o arquivo modelo, eu criei o seguinte arquivo, "VERSION.TEMPLATE":
unit version; interface const SVN_Revision = '$WCREV$'; // número da última revisão do "diretorio_copia_trabalho" Build_Date = '$WCNOW$'; // data e hora atuais, não necessariamente do SVN SVN_Revision_Date = '$WCDATE$'; // data da última modificação feita na // revisão (enviada pro servidor) SVN_RevRange = '$WCRANGE$'; // interessante: no caso de você não ter enviado todas as atualizações // devolta pro repositório SVN, essa "tag" detecta dentro da pasta // a menor revisão e a maior SVN_Release = '$WCMODS?Teste:Oficial$'; // Se existem modificações pendentes, mostra a // primeira palavra senão mostra a segunda SVN_URL = '$WCURL$'; // a URL no repositório referente ao diretório de trabalho implementation end.
Dica: adicione o caminho do TortoiseSVN\Bin no seu Path (vou considerar que você fez isso, feche a abra o prompt de tiver feito isso com ele aberto)
De posse do arquivo VERSION.TEMPLATE, executaremos o seguinte comando:
C:\Projetos\TesteSVN\Src\> SubWCRev ..\. VERSION.TEMPLATE VERSION.pas
Onde "..\." é um diretório acima, no caso é o diretório "C:\Projetos\TesteSVN\Src", essa notação é útil pois você poderá ter a cópia de trabalho em locais diferentes, e deixando fixo "C:\Projetos\TesteSVN\Src" pode lhe atrapalhar.
Dica: não esqueça de adicionar o arquivo VERSION.TEMPLATE no seu repositório SVN para não perdê-lo!
Veja o arquivo VERSION.PAS que foi gerado:
unit version; interface const SVN_Revision = '3'; // número da última revisão do "diretorio_copia_trabalho" Build_Date = '2006/10/19 08:58:41'; // data e hora atuais, não necessariamente do SVN SVN_Revision_Date = '2006/10/19 09:35:36'; // data da última modificação // feita na revisão (enviada pro servidor) SVN_RevRange = '2:3'; // interessante: no caso de você não ter enviado todas as atualizações // devolta pro repositório SVN, essa "tag" detecta dentro da pasta // a menor revisão e a maior SVN_Release = 'Oficial'; // Se existem modificações pendentes, mostra a // primeira palavra senão mostra a segunda SVN_URL = 'file:///C:/svn/testesvn'; // a URL no repositório referente ao diretório de trabalho implementation end.
Depois de gerar o VERSION.PAS, basta você adicioná-lo ao seu projeto e começar a usár as constantes na sua aplicação.
Automatizando o processo
Para automatizar o processo de geração desse arquivo vamos fazer uso de um recurso do Delphi, até onde eu sei, pouco explorado. Com o seu projeto aberto no Delphi, clique no menu "View -> Project Manager". Na janela que abrir, clique em "New" e escolha Batch File.
Obs: Usei o Delphi 7, e aparentemente tem uma espécie de Bug quando salva o "Project Group" com o arquivo Bat, pois ele o remove as vezes.
Salve o arquivo Project2.BAT como por exemplo SVN_REVISION.BAT, e inclua ele no seu repositório se assim você desejar para não perdê-lo.
Salve também o Project Group e também o adicione no repositório. Em vez de abrir diretamente o ".DPR", você só precisará abrir o ".BPG" para trabalhar no seu projeto.
Se ao salvar o Project Group o arquivo .BAT for removido da lista, então deve ser o tal "bug" que citei. Proceda da seguinte forma:
* Feche o Delphi;
* Edite o arquivo SVN_Revision.BAT no Notepad, e deixe o conteúdo dele assim:
REM CommandInterpreter: $(COMSPEC) SubWCRev ..\. VERSION.TEMPLATE VERSION.pas
* Edite o arquivo do Projeto (BPG) também no notepad, e deixe-o da seguinte forma:
#------------------------------------------------------------------------------ VERSION = BWS.01 #------------------------------------------------------------------------------ !ifndef ROOT ROOT = $(MAKEDIR)\.. !endif #------------------------------------------------------------------------------ MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** DCC = $(ROOT)\bin\dcc32.exe $** BRCC = $(ROOT)\bin\brcc32.exe $** #------------------------------------------------------------------------------ PROJECTS = svn_revision.bat Project1.exe #------------------------------------------------------------------------------ default: $(PROJECTS) #------------------------------------------------------------------------------ svn_revision.bat: svn_revision.bat call $** Project1.exe: Project1.dpr $(DCC)
Adicione os trecho que relacionam o "svn_revision.bat" ao BPG. Salve o arquivo e grave-o no repositório, assim se ele sumir novamente você só precisa atualizá-lo (ainda vou investigar por que ele some). Observe também a ordem que coloquei, o .BAT antes do DPR, assim a ordem de compilação fica correta.
A partir de então, sempre que você quiser "liberar" uma versão com os dados do repositório SVN, basta que você faça um "Build All".
Resultado:
Delphi Package Tool
Para aqueles que querem outras formas de compilar os seus projetos, tem o programa Delphi Package Tools, eu ainda não vi direito, mas pode ser uma "mão-na-roda" para compilar vários projetos de uma vez: http://cc.borland.com/Item.aspx?id=22778
Projeto Exemplo
Clique aqui para baixar os fontes (Delphi 7) do projeto e arquivos que usei neste tutorial. (LINKS CORRIGIDOS)
Artigos relacionados:
Instalando o Trac+SVN no Windows

Veja mais:
![]() Em Santa Cruz do Sul a Sysconnect Engenharia atua na área elétrica prestando serviço de ... | ![]() Administrando o RoundCube em uma hospedagem Apache com vários sites - Virtual Hosts - me deparei com a ... | ![]() Amantes do bom e velho Winamp. Tem coisas que não mudam, Windows Media Player sem dúvida domina o mercado,... | ![]() Desenvolvemos uma UDF para envio de email pelo Firebird / Interbase. Veja mais em: www.suportedireto.com.... | ![]() Instalando o Trac+SVN no Windows Autor: William D. Knak Data: 23/10/2006 Artigo Original: http://trac.edgewall.... |