aragost Trifork: Mercurial Kick Start Exercises


Spolupráce se Subversion

Extenze hgsubversion mění Mercurial na klienta Subversion. To nám umožňuje používat lokální (offline) komit a všechny ostatní pěkné nástroje Mercurialu a posílat (push) changesety zpět do Subversion.

Obsah

Instalace

Extenze vyžaduje pojítka (bindins) Python-Subversion. Ve Windows jsou součástí aplikace TortoiseHg, v Linuxu musíte vyhledat paket python-subversion ve správci paketů.

Samotné extenze instalujete spuštěním:

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

Nyní zadejte:

[extensions]
hgsubversion = path/to/hgsubversion

do svého konfiguračního souboru pro načtení extenze. Pokud jste instaloval extenzi s použitím svého správce paketů, potom byla nejspíše již vložena do proměnné PYTHONPATH a potřebujete pouze přidat:

[extensions]
hgsubversion =

Použijte hg help subversion abyste si ověřili, že extenze byla úspěšně povolena

Klonování Subversion

Připravili jsme repozitář Subversion s malým programem Hello World pro několik skupin. Pro každou skupinu je určen repozitář, označený jako hello1hello5:

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

Poznámka

Pokud vám nechodí URL adresa http(s):// , zkuste svn+http(s)://. Tím by mělo být jednoznačně uvedeno, že chcete provést klon ze Subversion.

Alenka zkontroluje repozitář příkazem thg log aby viděla, že byly tagy řádně definovány:

clone.png

Závěrečná revize Subversion přiřadí vlastnost svn:ignore k hello proto, aby byl kompilovaný binární soubor ignorován. V Mercurialu jsou vzory pro ignorování spravovány v nadřízeném souboru .hgignore. Tento soubor lze generovat příkazem:

alice$ hg svn genignore

Normálně bychom soubor .hgignore komitovali, abychom zajistili jeho sdílení s každým, kdo použije repozitář. Protože je ale Subversion této sestavě nadřízena, není nutné tento soubor posílat zpátky. Z toho důvodu ignoruje generovaný soubor .hgignore sám sebe. Občas jej lze regenerovat příkazem hg svn genignore --force.

Posílání do Subversion

Alenka nyní může editovat soubory a komitovat je v Mercurialu:

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." 

Změna se dosud na server Subversion nedostala, jako obvykle, musíme provést příkaz push. Posílání changesetu zahrnuje jeho přepsání. To proto, že server Subversion je nadřízený (master) a když v něm provádíme komit, sám rozhoduje o jménu uživatele a označení času přináležející k revizi. Na straně Mercurialu je changeset přepsán aby reflektoval aktualizovaná metadata:

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

Vidíme následující aktualizovaný changeset:

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.

Všimněte si změny jména uživatele a časového záznamu poté, co Subversion tyto údaje aktualizoval. Protože jsou changesety přepisovány, neměly by se provádět další klony původního klonu. Pokud tak učiníte, musíte ručně odtrhnout starší verze changesetů od changesetů, posílaných do Subversion.

Stahování ze Subversion

Alenka provede ve svém klonu několik lokálních změn:

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.

Mezitím se změnil repozitář v Subversion:

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)

Nová revize vytváří rozbočku (fork) v historii:

pull.png

Když Alenka provede push, její oba changesety (7d780c6154fb a 12445668eefc) se automaticky přeskupí k revizi, kterou právě stáhla ze 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

Toto je nezbytné, protože Subversion je přísně lineární systém. Nová historie vypadá takto:

pushed.png

Shrnutí

Extenze hgsubversion nám umožňuje používat Mercurial jako klienta systému Subversion. To nám přináší následující výhody oproti normálnímu klientovi Subversion:

Extenzi hgsubversion lze také použít ke konverzi k Mercurialu. Ten obsahuje speciální extenzi pro konverzi ale je známo, že hgsubversion konvertuje některé repozitáře lépe a přesněji.

Hlavním problémem při konverzi ze Subversion (nebo vlastně z každého staršího systému) k Mercurialu je nedostatek pružnosti starého systému. Subversion nemá tagy ani větve, pouze (velmi) přísnou konvenci, která říká že kopie z trunk/ do branches/foo naznačuje vytvoření větve s názvem “foo”. Nic však nebrání kopírovat polovinu trunk do branches/foo, nebo provedení komitu, který mění soubory v trunk a v branches/foo současně.

Tento druh "strusky" nelze vždy v Mercurialu prezentovat rozumným způsobem, nicméně extenze hgsubversion je při interpretaci dobrým pomocníkem.