Estou utilizando o Bazaar VCS a algumas semanas, tanto para avaliar sua eficácia quanto para implementar em projetos que já estou trabalhando. Na minha atuação no Projeto GNU, sempre utilizei o CVS e acostumei com sua maneira de ser. Tinha coisas que não gostava, como o fato de ser apenas cliente servidor. Em outros projetos eu resolvi adotar o Subversion (SVN) e até então era meu sistema de controle de versão favorito.

Com o fato da distribuição Ubuntu utilizar amplamente o Bazaar, fiquei bastante curioso em testá-lo e ver quais eram as principais diferenças com o SVN. Logo no início já gostei de alguns pontos, como:

  1. O Bazaar é todo feito em Python;
  2. Tem o apoio da Canonical e é utilizado pelo Ubuntu no Launchpad;
  3. Possui praticamente todos os recursos do SVN e CVS, só que alguns pontos são melhores;
  4. Pode ser utilizado no esquema cliente-servidor ou apenas localmente no seu projeto, sem precisar de servidor;
  5. Possui vários plugins que facilitam o trabalho e administração de código;
  6. É possível interagir facilmente com as libs Python e escrever suas próprias extensões;
  7. É possível integrar o Trac;
  8. Possui o Olive, um frontend gráfico para o Bazaar e fácil de mexer;
  9. Ao usar remotamente, é possível escolher qual protocolo de transferência, como ssh, sftp, http, ftp, http, etc;
  10. A maioria das distribuições já têm o pacote para o Bazaar, assim como plataformas Macintosh e Windows.

Mas também tem alguns pontos negativos, como ainda não ter suporte para a maioria dos IDEs. Eu mesmo não consegui fazer o Emacs funcionar corretamente com o Bazaar, mas confesso que não testei todos os módulos elisp que encontrei na internet.

O seu uso é bastante simples, veja:

anderson@yoda:~/tmp/teste$ touch arquivo1.txt
anderson@yoda:~/tmp/teste$ touch arquivo2.txt
anderson@yoda:~/tmp/teste$ touch arquivo3.txt
anderson@yoda:~/tmp/teste$ bzr init
anderson@yoda:~/tmp/teste$ bzr add
added arquivo1.txt
added arquivo2.txt
added arquivo3.txt
anderson@yoda:~/tmp/teste$ bzr commit -m ‘Primeiro import’
Committing to: /home/anderson/tmp/teste/
added arquivo1.txt
added arquivo2.txt
added arquivo3.txt

Committed revision 1.

Explicando: Criei um diretório (teste), dentro dele criei 3 arquivos vazios. Dentro do diretório, dei um bzr init para criar o repositório, depois adicionei todo conteúdo do diretório (bzr add) e por último, um commit para registrar como primeiro import ao sistema de controle de versões.

Dessa forma é possível trabalhar localmente com um projeto e tê-lo dentro de um sistema de controle de versões. O resto é praticamente idêntico aos outros VCS, sempre que finalizar uma alteração basta dar um commit, veja:

anderson@yoda:~/tmp/teste$ echo “Alteracao em um arquivo” >> arquivo1.txt
anderson@yoda:~/tmp/teste$ bzr status
modified:
arquivo1.txt
anderson@yoda:~/tmp/teste$ bzr diff arquivo1.txt
=== modified file ‘arquivo1.txt’
— arquivo1.txt        2008-04-24 23:05:14 +0000
+++ arquivo1.txt        2008-04-24 23:09:51 +0000
@@ -0,0 +1,1 @@
+Alteracao em um arquivo

E por último, um commit:

anderson@yoda:~/tmp/teste$ bzr commit -m “Mudancas na estrutura do arquivo1.txt”
Committing to: /home/anderson/tmp/teste/
modified arquivo1.txt
Committed revision 2.

Veja o log de alterações:

anderson@yoda:~/tmp/teste$ bzr log
————————————————————
revno: 2
committer: Christiano Anderson <anderson@gnu.org>
branch nick: teste
timestamp: Thu 2008-04-24 20:10:24 -0300
message:
Mudancas na estrutura do arquivo1.txt
————————————————————
revno: 1
committer: Christiano Anderson <anderson@gnu.org>
branch nick: teste
timestamp: Thu 2008-04-24 20:05:14 -0300
message:
Primeiro import

Se quiser colocar o conteúdo desse repositório em algum servidor para que outras pessoas trabalhem, mas utilizando o sftp, basta:

bzr push sftp://usuario@servidor/path/para/repositorio

Depois para outras pessoas fazerem o checkout:

bzr co sftp://usuario@servidor/path/para/repositorio

e a partir daí trabalhar normamente com os bzr update e bzr commit para mandar novamente para o servidor. É possível também fazer commits offline de pois fazer um merge com o branch do servidor, para isso basta um

bzr commit –local

Fica a dica! 🙂