Pular para o conteúdo principal

Mercurial: o que as versões 3.7 e 3.8 trouxeram de novo

O Mercurial (controle de versão distribuído equivalente ao Git, só que mais fácil) já lançou este ano as versões 3.7 e 3.8, trazendo melhorias importantes em desempenho e escalabilidade. Várias melhorias foram apresentadas por colaboradores de peso como Facebook, Mozilla e Google, que usam o Mercurial em seus projetos internos.

Mercurial 3.7

A primeira grande funcionalidade desta versão é a mudança no formato de compressão do histórico para GeneralDelta. Antes da versão 3.7, o histórico era armazenado comparando cada revisão com a revisão anterior, o que é eficiente para os casos de projetos com poucos ramos, mas para projetos com muitos ramos, o delta pode acabar se tornando grande se a revisão anterior for de outro ramo e toda a diferença entre os ramos precisar ser armazenada. A partir da versão 3.7, novos changesets usam a estratégia GeneralDelta, em que o delta é calculado em relação à revisão-pai e não mais em relação à revisão anterior. Dependendo do projeto, pode haver uma melhoria de até 10x no tamanho do histórico com essa mudança.

Não é necessário nenhuma ação para usar essa nova estratégia, que passa a ser automática a partir da versão 3.7. Os repositórios já existentes também não precisam ser modificados porque o histórico com a estratégia anterior conviverá com a nova estratégia de compressão. No entanto, se você quiser converter toda a compressão do histórico do repositório antigo, use o seguinte comando para fazer um novo clone:

hg clone -U --config format.generaldelta=1 --pull originalrepo generaldeltarepo

A segunda funcionalidade importante desta revisão é dirigida aos servidores de repositórios através da extensão chamada clonebundles. Por padrão, a clonagem faz com que o servidor compacte todo o conteúdo do repositório em um bundle e o envie ao cliente. Não há cache e todo o processo precisa ser repetido a cada requisição de clonagem. Para servidores com repositórios muito grandes ou com grande volume de clonagens, o processo se torna bastante pesado. O que a extensão clonebundles faz é permitir o uso de um bundle previamente criado para atender às requisições de clonagem, resultando em tempos de resposta mais rápidos e menor carga no servidor, que pode chegar a menos de 1% da original. Mais detalhes podem ser obtidos na página de ajuda:

hg help clonebundles

Algumas outras melhorias da versão 3.7 são:

  • Consolidação interativa (hg commit -i) e emenda (hg commit --amend) agora podem ser usados ao mesmo tempo.
  • Agora é possível executar hg histedit sem parâmetros. O Mercurial usará automaticamente como revisão base o primeiro ancestral que está na fase draft e não tem descendentes que são mesclagens.

Mercurial 3.8

Um dos destaques desta versão é a inclusão do cHg, um cliente Linux para o command server do Mercurial, que torna mais rápida a execução dos comandos hg. O Mercurial é feito em Python e a cada comando o interpretador é acionado, o que adiciona aproximadamente 100ms à execução. Não é um tempo perceptível para operações cotidianas. De qualquer modo, o chg evita esse atraso inicial porque é um cliente escrito em C que usa um daemon do servidor de comandos Mercurial para executar os comandos hg. Ao invés de iniciar o Python a cada comando do Mercurial, o chg inicia uma aplicação C que se comunica diretamente com o servidor de comando do Mercurial. Um exemplo da diferença nos tempos de execução é mostrado abaixo:

$ time hg --version
real    0m0.118s
user    0m0.100s
sys     0m0.015s

$ time chg --version
real    0m0.012s
user    0m0.000s
sys     0m0.004s

Outra funcionalidade interessante é a detecção automática de cópias e renomeações antes da consolidação feita pela extensão automv, sugerida pelo Facebook. Desse modo, mesmo que você faça uma cópia ou renomeação por uma IDE ou pelo sistema operacional, o Mercurial detectará essa operação antes do commit.

Outra extensão produzida pelo Facebook e introduzida na versão 3.8 é o fsmonitor, que integra o Mercurial com programa de monitoramento de arquivo Watchman para produzir resultados mais rápidos de alguns comandos como hg status, hg diff e hg commit. Ao invés de procurar por mudanças em cada arquivo do projeto, a extensão faz com que os comandos verifiquem apenas os arquivos que realmente foram modificados. Para projetos muito grandes, com milhares de arquivos, a redução de tempo é considerável de até 4x.

Outras melhorias e mudanças estão listadas na página da versão 3.8

Referências

Comentários

Comments powered by Disqus