Notícias do Suporte Direto

19/Oct/2006 - 15:35
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

Tags: Incluir versão do SVN no Programa Delphi compilado

Veja mais:

Sysconnect Engenharia - Syseng
Em Santa Cruz do Sul a Sysconnect Engenharia atua na área elétrica prestando serviço de ...
RoundCube - Um Logotipo para cada VirtualHost
Administrando o RoundCube em uma hospedagem Apache com vários sites - Virtual Hosts - me deparei com a ...
WinampTweet - As músicas que você curte no Winamp, agora também no Twitter
Amantes do bom e velho Winamp. Tem coisas que não mudam, Windows Media Player sem dúvida domina o mercado,...
UDF para envio de E-mail pelo Firebird
Desenvolvemos uma UDF para envio de email pelo Firebird / Interbase. Veja mais em: www.suportedireto.com....
Instalando o Trac+SVN no Windows
Instalando o Trac+SVN no Windows Autor: William D. Knak Data: 23/10/2006 Artigo Original: http://trac.edgewall....