<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Agile on Rails &#187; Mercurial</title>
	<atom:link href="http://blog.siverti.com.br/category/mercurial/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.siverti.com.br</link>
	<description>Liberte-se, Comunique-se, Desenvolva-se</description>
	<lastBuildDate>Tue, 11 May 2010 13:12:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Git Bazaar ou Mercurial?</title>
		<link>http://blog.siverti.com.br/2008/11/14/git-bazaar-ou-mercurial/</link>
		<comments>http://blog.siverti.com.br/2008/11/14/git-bazaar-ou-mercurial/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 00:28:29 +0000</pubDate>
		<dc:creator>alexandre</dc:creator>
				<category><![CDATA[Bazaar]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[controle de versão]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vcs]]></category>

		<guid isPermaLink="false">http://blog.siverti.com.br/?p=165</guid>
		<description><![CDATA[Este artigo já estava na minha todo-list já faz algum tempo, visto que os projetos em que trabalho já estão utilizando controle de versão descentralizado desde o início de 2008, mas agora depois de reler o artigo do Akita resolvi tirar esta pendência do meu to-do. Por quê mudar para um controle descentralizado? Bom já [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo já estava na minha todo-list já faz algum tempo, visto que os projetos em que trabalho já estão utilizando controle de versão descentralizado desde o início de 2008, mas agora depois de reler o <a href="http://www.akitaonrails.com">artigo do Akita</a> resolvi tirar esta pendência do meu to-do.</p>
<p><strong>Por quê mudar para um controle descentralizado?</strong></p>
<p>Bom já faz algum tempo que o <a href="http://www.infoq.com/articles/dvcs-guide">controle de versão descentralizado</a> está em alta em detrimento às opções que acredito serem mais utilizadas ainda hoje que são o SVN e o CVS. Quero dizer que o SVN e outras ferramentas centralizadas que utilizamos solucionaram o problema para nossa equipe durante muito tempo, No início quando programava em Delphi era utilizado um controle de de versão integrado a IDE chamado FreeVCS, que depois se tornou o JediVCS, resolvia o problema e o workflow utilizado era o de dar o CheckOut do arquivo a trabalhar (isso travava o arquivo no servidor e ninguém poderia alterá-lo) fazia-se as alterações necessárias em em seguida executava o CheckIn aplicando as alterações no repositório principal e liberando o arquivo para outros desenvolvedores, Um bom começo.</p>
<p>Um dia precisamos tratar branches e coisas do gênero, e surpresa o nosso amigo Jedi não suportava (acho que ainda não suporta), então a solução foi migrar. O escolhido para a migração foi o SVN, provavelmente os descentralizados já existiam, mas os na época qualquer pesquisa no Google sobre controle de versão devolvia toneladas de links para SVN. Tudo bem até ai, e como nenhum usuário de Windows gosta de usar o promt de comando acabei desenvolvendo um plugin para o Delphi que se comportava mais ou menos como o JediVCS mas com o SVN, daí em diante muitos projetos no SVN, em seguida migração de plataforma (Hoje utilizamos Linux embora os servidores já fossem Linux desde a migração para SVN). Mas às vezes era necessário levar parte da equipe para outro local (longe dos servidores internos), geralmente no cliente, onde eram feitas alterações no sistema. A solução não era muito prática, fazer o setup de um servidor SVN temporário para o desenvolvimento no local, depois pegar as revisões gerar um diff gigante das alterações e aplicar no repositório na empresa e resolver os conflitos com o que os desenvolvedores internos fizeram neste meio tempo. Quando um dia decidi que precisávamos de um controle de versão onde pudéssemos realizar algum trabalho desconectados do servidor interno e depois fosse menos trabalhoso juntar tudo novamente, além de, manter o histórico de cada um dos commits realizados.<br />
Foi então que comecei a minha jornada em busca de um<em> controle de versão distribuído</em><span style="color: #ff0000;">*</span> é claro que fosse OpenSource, a lista é grande, onde podemos citar alguns como <a href="http://codeville.org/">Codeville</a>, <a href="http://darcs.net/">Darcs</a>, <a href="http://monotone.ca/">Monotone</a>, <a href="http://selenic.com/mercurial/wiki/">Mercurial</a>, <a href="http://git.or.cz/">Git</a> e <a href="http://bazaar-vcs.org/">Bazaar</a> além de mais alguns que não cheguei nem a pesquisar. Desta lista poucos minutos de pesquisa me levaram a considerar apenas o <strong>Bazaar</strong> o <strong>Git</strong> e o <strong>Mercurial</strong>, e fazendo alguns testes percebi que todos poderiam satisfazer minhas necessidades usando Linux. Então vamos às necessidades:</p>
<ol>
<li> Ser multiplataforma, afinal ainda tenho ainda hoje código fonte para manter em Delphi <img src='http://blog.siverti.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> .</li>
<li> Possuir um modo de converter meus repositórios Subversion.</li>
<li> Ter uma curva de aprendizado pequena em relação ao SVN.</li>
<li> Tivesse como integrar com alguma ferramenta estilo Trac ou Redmine.</li>
</ol>
<h3>Primeira Tentativa:<strong> Mercurial</strong></h3>
<p>No primeiro quesito, à primeira vista ele se encaixa pois grande parte do seu código é escrito em Python, tem um instalador para Windows (que não me parece ser oficial). Mas esperem, eu sou fissurado por usar a Ultima versão da ferramenta que o Desenvolvedor disse que está estável, logo, não me interessa muito usar o instalador da versão Windows, que na época dos meus testes instalava algo em torno de 0.9 e a versão oficial já era a 1.0 (Março de 2008). Bom escrito em Python pensei eu, vamos ao easy_install&#8230;&#8230;</p>
<pre>c:\easy_install mercurial...... bam!</pre>
<p>Erro, claro, não havia um compilador C. vamos lá instalei toda a <a href="http://www.mingw.org/">MingW</a>, <a href="http://www.mingw.org/wiki/msys">MSyS</a> etc, easy_install denovo, compilou, instalou beleza!. <em>Não</em>, o comando hg não funciona, bom vamos la, eu crio um hg.bat que chama o script do mercurial, jogo na pasta Scripts e tudo certo&#8230;. Também <em>não</em>, mais algumas tentativas depois consegui rodar o hg e ter um resultado. Bom, pra mim morreu aqui, não quero uma coisa que cada vez que tenho que instalar tenha que&#8230; Instalar um compilador C que os meus desenvolvedores Windows nao vão ter na máquina e fazer mais um monte de gambiarras pra ter versão &#8220;<em>featured</em>&#8221; do sistema. Enfim o Mercurial possui uma ferramenta de conversão de repositórios SVN e outros e tem integração com algumas ferramentas, inclusive o Netbeans, que por sinal, Surpresa!, também <strong>não funciona no Windows</strong> mesmo tenho o Mercurial funcionando no promt instalado via easy_install, acho que só funciona se for via installer mesmo. A curva de aprendizado dele é bem grande se formos levar em conta que sempre temos usuários <em>bitolados</em>, ei, eu disse bitolados?, eu quis dizer &#8220;acostumados&#8221; com o SVN e seu set de comandos, mal e porcamente.</p>
<p>Já é um caos fazer as pessoas entenderem o conceito de controle distribuído.</p>
<h3><strong>Segunda Tentativa: Bazaar</strong></h3>
<p>Bom eu já estava desanimado mas tinha que continuar, Uma olhada no site, cheio de tutoriais e extensiva documentação, Boa! documentação parece pelo menos ser bem melhor que a do Mercurial, embora eu tenha encontrado muitos posts em blogs dizendo o contrário, então só posso supor que, se a documentação do Mercurial é boa, ela está bem escondida em algum lugar do Wiki deles, bom blames à parte, Já vi um instalador para Windows e&#8230; hum, vamos tentar do velho e bom modo&#8230;</p>
<pre>c:\easy_install bazaar ...</pre>
<p>E instalou sem nenhum erro&#8230; bom eu já tinha um compilador C instalado, seria por causa disso? Vamos desinstalar tudo e ver o que acontece. Após remover todas as parafernalhas do MingW e Cia Ltda e remover o egg<strong><span style="color: #ff0000;">**</span></strong> do Bazaar e tentar novamente&#8230; vamos lá&#8230;</p>
<pre>c:\easy_install bazaar</pre>
<p>E funcionou novamente!, bom o Bazar é completamente escrito em Python, o que explica a tamanha portabilidade. o comando bzr já saiu funcionando, e, por curiosidade vou até a pasta Scripts, e&#8230; lá está um arquivo bzr.bat mais ou menos como o meu workarround, porém, <em>out-of-the-box</em>. Tudo funcionando agora vamos ver uma ferramenta de conversão, na época utilizei o svn2bzr, que funcionou perfeitamente, mas não importou as tags e relações dos branches, mas a história Linear do Subversion veio funcionando 100%. Hoje tem o <a href="http://bazaar-vcs.org/BzrForeignBranches/Subversion">bzr-svn</a> que é um plugin para trabalhar diretamente com repositórios svn utilizando o bzr, e esta sim importa as tags referências de branches, merges etc. Ok curva de Aprendizado&#8230; uma estudada na documentação e, show de bola, não só tem praticamente todos os comanos similares aos do SVN, como também permite trabalhar com <a href="http://bazaar-vcs.org/Workflows">vários Workflows</a>, inclusive o modelo Centralizado igual ao SVN. Então uma pequena busca por integração com os issue trackers, e, existiam plugins para <a href="http://www.bugzilla.org/">bugzilla</a>, <a href="http://trac.edgewall.org/">Trac</a>, <a href="http://www.redmine.org">Redmine</a> e outros. eu na época estava utilizando o Trac e estava pensando em migrar para o Redmine, boa oportunidade para dar uma testada nele&#8230; Instalei testei e funcionou 100%, inclusive com aqueles comandos de commit, do tipo: bzr commit -m &#8220;This commit fixes #772&#8243; para fechar o ticket numero 772. Perfeito.</p>
<h3>Terceira Tentativa: Git</h3>
<p>Já mais contente mas minha jornada ainda não estava finalizada, uma pequena pesquisada e achei um instalador do Git para windows, que não era exatamente a última versão, mas vamos dar um desconto, o Git é escrito em uma carrada de linguagens, uma parte em C outra em Perl outra em Shell Script e por ai vai, fazer isso integrar, e pior, Funcionar no Windows não deve ser das mais fáceis tarefas. Bem, feita a instalação, ele instalou um shell bem similar ao do Cygwin que praticamente dá a leve sençassão de estar em um terminal Linux,  e mais algumas ferramentas, ele utiliza o <a href="http://www.mingw.org/">MingW</a>, <a href="http://www.mingw.org/wiki/msys">MSyS</a> e outras bibliotecas para fazer a mágica de funcionar no Windows, Instalado fazer alguns testes, e gostei, segundo o próprio instalador e documentação afirma, alguns comandos não estão disponíveis pois <em>falta ambiente<span style="color: #ff0000;">***</span></em>, mas para o uso diário geral show de bola. A curva de aprendizado&#8230;.. hummm um <em>pouco pior que a do Mercurial</em>, porque por exemplo o comando<em><strong> checkout </strong></em>parece não ter nada haver com o que o SVN faz, embora para mim faça sentido, em fim, quando eu falei que era possível trocar de <em>branch</em> dentro da mesma cópia de trabalho com apenas um comando, ninguém entendeu nada, afinal totalmente fora deste planeta SVN. Continuando a conversão dos repositórios SVN também funcionou lindamente (bastante similar ao que hoje é o <em>bzr-svn </em>do Bazaar), e Integrou bonitinho com o Redmine, com uns pequenos probleminhas que não me recordo, mas, bastante usável.</p>
<p><strong>Bom vejamos minha tabela de pontuação:</strong></p>
<pre>+----------+----------+-----------+----------+------------+
|          |Multiplat |SVN/Import | CurvaApr | Integracao |
+----------+----------+-----------+----------+------------+
|Mercurial |     5    |    ??     |     7    |    ??      |
+----------+----------+-----------+----------+------------+
|Bazaar    |    10    |     9     |    10    |     10     |
+----------+----------+-----------+----------+------------+
|Git       |     9    |    10     |    5     |     9      |
+----------+----------+-----------+----------+------------+</pre>
<p>Bom tinhamos um vencedor, agora vamos fazer algumas pesquisas e comparativos para ver o que o<em> Povo acha</em>&#8230; e, <em><strong>Blames</strong></em><span style="color: #ff0000;">****</span> está cheio!<br />
bom na opinião geral e também por mim constatada, o Git é o Mais Rápido para a Maioria das operações, Seguido do Mercurial e por Último o Bazaar, mas a maioria desses artigos falam em 100000 arquivos de 10000 linhas cada um, e fazem um monte de testes com 10000 revisões etc&#8230; claro algo escrito basicamente em C seria obviamente mais rápido que algo escrito parcialmente em C e Python do que algo Totalmente em Python, mas nos meus testes de uso geral, a diferença de performance é praticamente irrisória, mesmo trabalhando com árvores grandes.<br />
Agora vamos ver quem utiliza cada uma destas ferramentas. Bem o Git foi contruído pelo Linus para manter o Kernel do Linux, e fora o Kernel temos outros projetos grandes utilizando. Já o Mercurial tem o pessoal da OpenJDK do Netbeans entre outros projetos Java<span style="color: #ff0000;">*****</span> . O Bazaar quem principalmente usa é a Canonical para manter grande parte do Ubuntu, li em algum lugar (quando eu lembrar posto no final do artigo) que vai utilizar só o Bazaar para manter o Ubuntu, afinal de contas a Canonical é a mantenedora do próprio Bazaar, além dela alguns outros projetos grandes como o MySQL também utilizam.</p>
<p>Outras ferramentas que podem ser citada são os hostings Free que cada uma das ferramentas possui.</p>
<p>O Mercurial tem o <strong><a href="http://freehg.org/">FreeHg</a></strong>, que não cheguei a testar mas parece-me que é totalmente gratuíto e deve ser destinado a projetos OpenSource.</p>
<p>O Git tem o <a href="http://gitorious.org/">Gitorious</a> e o mais recente <a href="http://github.com/">Github</a>, este último bastante utilizado por toda a comunidade <a href="http://www.rubyonrails.org">Ruby On Rails</a>, desde que o Próprio Rails foi hospedado lá, além de o próprio Github ser desenvolvido em Rails. <span style="text-decoration: line-through;">é uma Pena que o Github não tenha um gerenciamento de bugs (Bug Tracker) integrado a ele</span>, e a opção que foi adotada inclusive pelo Rails o <a href="http://lighthouseapp.com/">Lighthous</a><a href="http://lighthouseapp.com/">e</a>, eu particularmente não me agradei, sinceramente eu preferia o Trac ou o Próprio Redmine que também é Feito em Rails.<br />
o Bazaar tem o <a href="https://launchpad.net/">Launchpad</a>, que é totalmente gratuíto, destinado a projetos Opensource, possui um ótimo Issue Tracker integrado e mais um monte de coisas legais como os Blueprints e sistema para auxílio a internacionalização, é uma Excelente ferramenta, que na minha opinião melhor de todas aqui citadas, porém eu mesmo acho ele um pouco lento <em>às vezes</em> se comparado com o Github. Mas se formos levar em conta que o Github tem (no momento da escrita deste artigo) um limite de 100Mb por conta de usuário para projetos Pessoais/Públicos (Provavelmente isso deve poder ser negociado com o Pessoal do Github) Launchpad continua melhor, pois não possui limite, entretanto eu realmente gostaria que o pessoal da Canonical criasse a possibilidade de ter <strong><em>Contas Premium</em></strong> para projetos privados no Launchpad (que eu nunca vi mas pode até ser que exista, pois o launchpad em si não é OpenSource, embora partes dele sejam).</p>
<p><strong>Final da história</strong></p>
<p><em><strong>Meu escolhido foi o Bazaar</strong></em>. Se eu já utilizasse apenas Linux e não tivesse mais desenvolvedores para ter que botar na cabeça todos os comandos, talvez eu tivesse optado pelo Git, embora hoje em dia depois de utilizar os dois no dia a dia acho o Bazaar realmente melhor que o Git, além do mais o Bazaar vem evoluindo rapidamente inclusive no quesito da performance que <em>seria</em> o seu ponto mais fraco. Em todo caso <em>se as coisas um dia ficarem realmente lentas</em> eu sempre terei a opção de <em>migrar para o Git</em>.</p>
<p>Hoje em dia eu particularmente utilizo o Git com bastante frequência assim como o <a href="http://carlosantoniodasilva.wordpress.com/">Carlos</a>, e assim provavelmente vamos continuar fazendo, quando se tratar de algo relacionado ao Ruby On Rails, em contrapartida nossos projetos da Empresa e pessoais, além de outros tipos de controle de versão de documentos e arquivos binários eu vou continuar utilizando o Bazaar.</p>
<p>Em breve estarei postando um how to, bastante <strong><em>sem criatividade</em></strong> pois pretendo refazer o <a href="http://www.akitaonrails.com/2008/4/3/micro-tutorial-de-git">artigo do Akita</a> utilizando o Bazaar para exemplificar o uso, semelhanças e diferenças, além de mostrar que é possível trabalhar com o Bazaar em um modelo bastante aproximado, senão idêntico ao Git.</p>
<p><strong><em>Todos os testes foram realizados em aproximadamente umas 3 semanas, não foram apenas testes de 5 minutos em cada opção de ferramenta.</em></strong></p>
<p><strong><em><span style="color: #0000ff;">Tudo que eu escrevi aqui está diretamente relacionado ao meu cenário de trabalho e experiências, provavelmente para outros cenários e pontos de vista uma das outras ferramentas citadas ou mesmo não citadas se encaixam melhor.</span><br />
</em></strong></p>
<p><span style="color: #ff0000;">*</span> Veja mais sobre controle de versão distribuído <a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">neste link</a> (Em Inglês) e não deixe de assistir o vídeo.<span style="color: #ff0000;"><br />
**</span> Os pacotes em Python são chamados de Eggs, seriam equivalentes aos Gems do Ruby ou mesmo aos pacotes Deb ou RPM do linux.<br />
<span style="color: #ff0000;">***</span> O Ambiente Windows não é preparado para desenvolvedores<br />
<span style="color: #ff0000;">****</span> Conversa sem sentido onde dois ou mais grupos que não tem o que fazer, discutem incansávelmente para provar que sua ferramenta é melhor que a do outro<br />
<span style="color: #ff0000;">*****</span> Grande Ironia, Um dos maiores causadores de Blames que eu já vi foram comparativos entre Java e Python, e os Javeiros Inteligentes passam a usar uma ferramenta em Python&#8230; já os outros&#8230;. devem estar chorando.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.siverti.com.br/2008/11/14/git-bazaar-ou-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
