quinta-feira, 9 de julho de 2009

Gerenciando plugins em um repositório separado com svn:externals.

Se temos um código que queremos usar em dois projetos, mas por algum motivo, não queremos manter em um lugar centralizado e usar o "include_path" do php. Podemos criar um repositório só para este código e gerencia-lo como um novo projeto.

Este recurso é muito útil para plugins que são usados em mais de um projeto. Procurando na net é um tanto fraca a documentação a respeito de como usar o recurso svn:externals. No svn book ele mostra as informações fragmentadas e não o processo todo.

Neste texto eu descrevo o processo de criar um novo repositório, exportar os arquivos para ele e então gerar o link do externals apontando para o novo repositório. Vou descrever boa parte destas tarefas considerando o uso do tortoise no lado do cliente, mas a parte do externals também vou colocar a linha de comando, visto que a documentação no livro é muito fragmentada.

1 - Exportar o arquivos para uma nova pasta.

Usando o tortoise, escolhemos a pasta e selecionamos "export". Isso irá criar uma nova pasta não versionada, com tudo o que tinha ali dentro. Não versionada quer dizer sem aquele monte de .svn que ele cria.


2 - Criar o repositório no servidor.

svnadmin create jsCallPlugin

Neste ponto é importante verificar se a pasta tem permissões para ser alterada pelo usuário do svn. Existem várias maneiras de se fazer isso, mas uma que pode ser utilizada é atribuir ao diretório um grupo compartilhado por todos os usuários do svn.


3 - Fazer um check out do repositório na sua máquina.

com o tortoise, é só clicar na pasta e então escolher o checkout, colocar o endereço e pronto.


4 - Mandar os arquivos pro novo repositório.

Lembra aqueles arquivos que fizemos export. Pois é, estes arquivos devem ser copiados para o repositório. Veja que é uma boa prática criar as pastas trunk, branches e tags. Neste caso podemos copiar nossos arquivos para dentro da trunk. Depois é só fazer o "commit" normalmente.

Este é o método que considero mais simples, mas você também pode, tendo os arquivos no servidor, usar um import para coloca-los no novo repositório.


5 - Definir o externals.

Finalmente o que interessa.

O svn:externals é uma propriedade que atribuimos a um diretório na nossa cópia de trabalho. Esta propriedade será enviada para o servidor quando fizermos o commit. Esta propriedade indica que, ao se atualizar uma cópia de trabalho, o svn deverá buscar, para colocar dentro do diretório ao qual atribuimos a propriedade, dados de um outro repositório. Então precisamos entender 3 coisas nessa configuração:

a) o diretório que tem a propriedade (diretório local)
b) o caminho do repositório
c) o nome do novo diretório que será criado (diretório externo)

Sabendo destes elementos fica fácil não cair em erros comuns que vemos pelos foruns da net.

Então, para fazer o externals do jeito mais difícil (no dos) usamos o seguinte comando:

svn propedit svn:externals . --editor-cmd edit

O ponto é o endereço do diretório local ao qual atribuimos a prop. (que pode ser trocado, é claro)

O comando --editor-cmd indica que vamos usar o edit.bat para editar as propriedades.

bom, dentro deste arquivo precisamos colocar os nomes dos diretórios externos e seus respectivos repositórios:

dir1 http://repos/plugin1/trunk
dir2 http://repos/plugin2/trunk

e depois é só salvar o arquivo normalmente. No próximo update, o svn vai buscar destes repositórios e criar as pastas dir1 e dir2, trazendo o conteúdo de plugin1 e plugin2 respectivamente.

Bom, e do jeito mais fácil ?

No tortoise, basta clicar sobre o diretório local e escolher o comando properties (dentro dos comandos do tortoise, é claro). Com isso vai aparecer uma lista das propriedades e suas configurações. Adicione a propriedade svn:externals com uma linha com "[nomedodiretorio] [urldorepositorio]" para cada externals