aragost Trifork: Mercurial Kick Start Exercises


Interagindo com o Subversion

A extensão hgsubversion torna o Mercurial em um cliente do Subversion. Isto permiteque você faça consolidações offline e todas as outras funcionalidades legais do Mercurial até que você empurre os changesetes de volta ao Subversion.

Contents

Instalação

A extensão precisa das ligações do Python Subversion. As ligações são fornecidas com o TortoiseHg para Windows. No Linux, você precisa procurar por um pacote chamado python-subversion no seu gerenciador de pacotes.

Instale a extensão através do comando:

$ hg clone https://hgsubversion.googlecode.com/hg/ hgsubversion

Acrescente:

[extensions]
hgsubversion = path/to/hgsubversion

no seu arquivo de configuração para carregar a extensão. Se você tiver instalado a extensão pelo gerenciador de pacotes, então é praticamente certo que o caminho já está no PYTHONPATH e basta adicionar:

[extensions]
hgsubversion =

Use hg help hgsubversion para verificar se a extensão está habilitada.

Clonando o Subversion

Nós preparamos um repositório do Subversion com um programa Hello World. Há um repositório para cada grupo, chamado hello1, hello2, …, hello5. Por favor, clone aquele correspondente ao número do seu grupo:

alice$ hg clone http://mercurial.aragost.com/svn/helloX hello-hg 
[r1] mg: Created initial layout.
[r2] mg: First known version by Brian Kernighan, 1974.
[r3] mg: Include stdio.h.
[r4] mg: Output newline.
[r5] mg: Version 1.0.
[r6] mg: Capitalized!
[r7] mg: Comments are good.
[r8] mg: Added README.
[r9] mg: Added Makefile.
[r10] mg: Ignore compiled program.
pulled 9 revisions
updating to branch default
4 files updated, 0 files merged, 0 files removed, 0 files unresolved
alice$ cd hello-hg

Note

If a http(s):// URL doesn’t work for you, then try with svn+http(s):// instead. That should tell Mercurial in unambiguous terms that you’re cloning from Subversion.

Ela inspeciona o repositório com thg log para ver quais rótulos foram definidos corretamente:

clone.png

A revisão final do Subversion define a propriedade svn:ignore para hello para ignorar o binário compilado. No Mercurial, padrões a serem ignorados são controlados pelo arquivo .hgignore que fica na raiz da cópia de trabalho. Este arquivo pode ser gerado pelo comando:

alice$ hg svn genignore

Normalmente, alguém pode consolidar o arquivo .hgignore para compartilhar com os outros usuários do repositório. Contudo, uma vez que o Subversion ainda é o controle de versão mestre, você não vai querer por o arquivo .hgignore de volta lá. Por essa razão, este arquivo deve ignorar a si meso. Você pode gerá-lo de tempos em tempos com o comando hg svn genignore --force.

Empurrando para o Subversion

Alice pode editar os arquivos e consolidá-los com o Mercurial:

alice$ echo "/* The End. */" >> hello.c
alice$ hg diff
diff -r e3314036fa9f hello.c
--- a/hello.c   Fri Mar 12 10:20:45 2010 +0000
+++ b/hello.c   Fri Mar 12 21:20:10 2010 +0000
@@ -7,3 +7,4 @@
        printf("Hello, World!\n");
        return 0;
 }
+/* The End. */
alice$ hg commit -m "Added footer." 

A mudança ainda não está no servidor do Subversion — hg push ainda é necessário. Isto acontece porque o servidor do Subversion é o mestre e quando ele recebe uma consolidação é estabelecido um nome de usuário e timestamp para a revisão. No lado do Mercurial, o changeset é reescrito para refletir o metadado atualizado:

alice$ hg outgoing 
comparing with http://mercurial.aragost.com/svn/helloX
changeset:   9:2dc661f0cdc8
tag:         tip
user:        Alice <alice@example.net>
date:        Fri Mar 12 21:20:15 2010 +0000
summary:     Added footer.
alice$ hg push 
pushing to http://mercurial.aragost.com/svn/helloX
searching for changes
[r11] alice: Added footer.
pulled 1 revisions
saved backup bundle to $HOME/hello-hg/.hg/strip-backup/2dc661f0cdc8-backup.hg

Você pode ver o changeset atualizado dessa maneira:

alice$ hg tip
changeset:   9:a545b3d1c21d
tag:         tip
user:        alice@66d5687c-2042-4ccc-9f0a-7e74790c38a1
date:        Fri Mar 12 21:25:00 2010 +0000
summary:     Added footer.

Note como o autor e o timestamp mudaram devido à atualização do servidor do Subversion sobre o metadado. Como os changesets são reescritos, você não pode fazer clones adicionais do Mercurial a partir do seu clone original. Se fizer, terá que retirar manualmente as versões antigas dos changesets que foram empurrados ao Subversion.

Puxando do Subversion

Alice faz mais algumas mudanças locais no seu clone:

alice$ hg outgoing 
comparing with http://mercurial.aragost.com/svn/helloX
changeset:   10:9a6e43d86b16
user:        Alice <alice@example.net>
date:        Fri Mar 12 21:26:00 2010 +0000
summary:     Express greater joy!

changeset:   11:f3bd093438f1
tag:         tip
user:        Alice <alice@example.net>
date:        Fri Mar 12 21:27:00 2010 +0000
summary:     Added simple MIT license header.

Enquanto isso, o repositório do Subversion mudou:

alice$ hg incoming 
incoming changes from http://mercurial.aragost.com/svn/helloX

revision:    12
user:        alice
date:        2010-03-12T21:26:30.0Z
message:     List email address for bug reports.
alice$ hg pull 
pulling from http://mercurial.aragost.com/svn/helloX
[r12] alice: List email address for bug reports.
pulled 1 revisions
(run 'hg update' to get a working copy)

A nova revisão causou uma bifurcação no histórico:

pull.png

Quando Alice empurrar, seus dois changesets (7d780c6154fb e 12445668eefc) automaticamente serão recolocados no topo da revisão que ela puxou do Subversion (2099057558d2):

alice$ hg push 
pushing to http://mercurial.aragost.com/svn/helloX
searching for changes
[r13] alice: Express greater joy!
pulled 1 revisions
saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg
[r14] alice: Added simple MIT license header.
pulled 1 revisions
saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg

De novo, isto é necessário porque o Subversion tem um histórico estritamente linear. O novo histórico fica assim:

pushed.png

Resumo

A extensão hgsubversion permite que você use o Mercurial como um cliente do Subversion. Isto fornece imediatamente as seguintes vantagens comparadas com um cliente normal do Subversion:

A extensão hgsubversion também pode ser usada para converter para o Mercurial. O Mercurial já vem com uma extensão de conversão chamada convert, mas o hgsubversion é famoso por converter melhor alguns repositórios e de modo mais preciso.

O principal problema ao se converter do Subversion (ou realmente, qualquer sistema legado) para o Mercurial é a falta de rigor dos sistemas antigos. O Subversion não tem realmente rótulos e ramos, usa uma convenção rígida que diz que a cópia de trunk/ para branches/foo indica a criação de um ramo chamado “foo”. Mas nada impede que alguém copie metade do trunk/ para branches/foo, ou que faça uma consolidação que modifique arquivos em trunk/ e branches/foo simultaneamente.

Este tipo de “prática” não pode ser representada sempre em um modo significativo no Mercurial, mas o hgsubersion ainda faz um bom trabalho interpretando as intenções dos desenvolvedores.