sábado, janeiro 12, 2008

Controle de Versões: Tão importante quanto o compilador!

Se tu desenvolves software, independente de qual seja a linguagem, então deves fazer o controle das modificações de algum modo.

Quando estava iniciando na programação, o controle que eu fazia era bem primitivo. Se eu tivesse apenas um arquivo, após finalizar as alterações, eu salvava uma cópia do mesmo com o seguinte formato: <nome>.<extensão><anomêsdia_horaminuto>.

Por exemplo, se eu tivesse um arquivo chamado meu arquivo.c e tivesse finalizado uma alteração do arquivo no dia 10/01/2008 às 18:30h, a cópia do mesmo teria o nome arquivo.c_20081001_1830.

Se por acaso fossem vários arquivos correlacionados, ao invés de copiar os arquivos em si, eu aplicava este método à pasta.

Por exemplo, se eu tivesse uma pasta chamada meuprograma e dentro desta pasta eu tivesse os arquivos meu_fonte.c, meu_fonte.h e LEIAME.TXT, após concluir as alterações nestes arquivos,supondo que elas tivessem ocorrido no dia 11/01/2008 às 09:30h, seria gerada uma cópia da pasta chamada meuprograma_20080111_0930.

Com o passar do tempo este tipo de controle torna-se ineficiente.

- Por quê? Porque eu não conseguia saber, por exemplo, que modificações foram feitas em que versão das cópias. Se eu tivesse um trabalho compartilhado com um ou mais colegas, tornava-se difícil dividir as tarefas e depois unir os trabalhos.

Procurando uma solução para estes problemas, encontrei o CVS. Durante anos ele foi uma ferramenta indispensável no meu trabalho. O CVS não evolui como deveria e, com o tempo, foi substituído com muitas vantagens pelo Subversion.

O Subversion, bem como o CVS e outros programas de controle de versão, possuem um repositório centralizado. Isto tem inumeras vantagens.

Um dia desses, meu amigo Wanderley me falou de um sistema de controle de versões (SCM) com repositório distribuído.

- Repositório distribuído? - Perguntei espantado. - Isso deve ser uma m...

Após ouvir atentamente (mesmo achando que seria perda de tempo), mudei de idéia e resolvi experimentar este programa. Afinal, o Wanderley é um programador muito experiente e não iria dar seu aval para uma solução meia-boca.

O Mercurial (este é o seu nome) é um sistema de controle de versões muito leve e ocupa pouco espaço disco.

Em SCMs com repositório centralizado, todos os arquivos ficam em um único local (servidor), sendo que os desenvolvedores baixam uma cópia dos mesmos para o seu diretório de trabalho. Certamente isto não é novidade para ti.

O Mercurial, por usar repositório distribuído, não possui um servidor central. Cada desenvolvedor tem ao mesmo tempo o repositório e o diretório de trabalho.

- Não parece nem seguro, nem prático. E qual a vantagem disso?

É seguro. O projeto já está bem estável e a cada release vários bugs são corrigidos .

É prático, pois por meio de comandos simples de exportação e importação podemos sincronizar nosso repositório com o repositório de outros desenvolvedores.

Além disso, o Mercurial possui várias extensões / contribuições da comunidade que ampliam e facilitam seu uso. Por exemplo, sua integração com o Bugzilla.

A vantagem de se utilizar o repositório distribuido verifica-se quando tu tens arquivos ou projetos que desenvolves na tua casa, no trabalho, nos computadores da faculdade, etc e não tens como instalar o Subversion, por exemplo, para controlar a versão dos mesmos (ou não tens acesso à rede).

Usando o Mercurial, podes manter o controle de versões onde for necessário, sem problemas. Não é preciso nem do acesso à rede. É só executares uma exportação / importação das modificações e pronto.

Isso sem abrir mão de controle de versões, habilidade de efetuar os diffs, ver logs, uso de tags, entre outras coisas que já nos acostumamos com o Subversion.

Já estou utilizando o Mercurial em 3 projetos (faz menos de um mês que comecei a usá-lo) e estou completamente satisfeito.

Estou pensando em traduzir para o Português os tutorias que se encontram no site oficial como uma forma de ajudar a ampliar o seu número de usuários.

Se tu usas o Subversion, o CVS ou outro sistema de versões, experimente o Mercurial. Com toda a certeza vais gostar muito de trabalhar com ele.

E se tu ainda não usas nenhum sistema destes, já passou da hora de começares. Vá no site do Mercurial e comece a utilizá-lo. Com o tutorial fornecido, em menos de 20 minutos já estarás dominando o programa.

Tu não vais te arrepender.

4 comentários:

Thiago disse...

Opa, fala seu Márcio.

Cara, já tinha ouvido falar a respeito de SCM's distribuídos mas não cheguei a testar. Já que você resolveu ser boi de piranha. :) Tenho umas dúvidas, coisa simples:

* O import/export é um arquivo tipo "patch" para o seu repositório? Onde eu exporto o meu repositório e você faz um merge com o seu?
* Resolução de conflitos?
* É possível fazer uma sincronização On-line de N respositórios se baseando em um repositório base?

[]´s

Thiago

Marcio Andrey Oliveira disse...

Thiago, obrigado pela visita.

Por ordem:
- O comando export gera o header e os diffs das modificações realizadas no repositório.

Posteriormente, o comando import utiliza estas informações para sincronizar os repositórios.

- A resolução de conflitos é semehante ao que ocorre com o Subversion / CVS. Se der para realizar o merge sozinho, o Mercurial o fará. Se não der, cabe ao desenvolvedor resolvê-lo.

- A sincronização com um repositório base é possível. Cada desenvolvedor poderia submeter suas modificações para este repositório.

De modo semelhante, todos podem baixar as modificações deste repositório base via ssh, http e https, por exemplo.

Sergio disse...

A opinião do Thiago, quando ele dize que você foi boi de piranha, me leva a uma reflexão. A esmagadora maioria das inovações, que após um tempo são classificadas como coisa genial, passam desapercebidas por muita gente devido a um mal maior do que o risco de usar algo "instável". Tomemos como exemplo o paradoxo python, que ilustra a inovação direitinho.

Marcio Andrey Oliveira disse...

Essa possibilidade de interação que os blogs permitem (a gente escreve, lê e está sempre a um clique de outros artigos) são um estímulo.

Obrigado pelo comentário. E obrigado por postar o link sobre o paradoxo python. Achei muito interessante o ponto de vista do autor.

[]s,

mao