20. května 2013

Mercurial, jak nastavit P4Merge jako nástroj pro vizuální merge a diff

Mercurial je výborný distribuovaný verzovací systém (DVCS). Je free a má spoustu zajímavých vlastností. Perforce (P4) je centralizovaný verzovací systém. Má převážně komerční licenci a výborné nástroje na mergování a branchování. Co můžou mít tyto dva systémy společného?

P4Merge

P4Merge je grafický nástroj pro merge a diff. Je jednou ze silných zbraní P4. Já jsem ho vždycky rád používal. Jeho výhodou je, že akceptuje parametry z příkazové řádky, takže jej lze použít i mimo rámec P4 a to buď úplně samostatně, nebo jako externí nástroj z jiné aplikace. Třeba Mercurialu :-)

Diff pomocí P4Merge

Podle toho, kolik parametrů se zadá na příkazové řádce, se spustí buď diff (2 parametry), nebo merge (3-4 parametry). Každý parametr je cesta k porovnávanému souboru.

Parametry příkazové řádky P4Merge

P4Merge sice není open source, ale je free, takže nic nebrání jeho zakomponování do jiného nástroje.

Konfigurace Mercurialu

Mercurial neobsahuje nástroj na vizuální merge. Pokud je potřeba zmergovat konfliktní změny a žádný nástroj není nakonfigurovaný, tak Mercurial vloží do sloučeného souboru mergovací značky (takový to <<<<<<<<<<< something). To asi nechceme :-)

Mergovacích nástrojů existuje spousta, každý si určitě vybere. Já jsem si oblíbil P4Merge - přece jenom, když něco s oblibou používáte dva roky, tak vám to trochu přiroste k srdci. Jak teda Mercurialu podstrčíme P4Merge?

Konfigurace merge nástroje je v souboru ~/.hgrc v sekci [merge-tools]:
[merge-tools]
p4.priority = 60
p4.premerge = True
p4.executable = p4merge
p4.gui = True
p4.args = $base $other $local $output
p4.binary = False

[extensions]
hgext.extdiff =

[extdiff]
cmd.p4diff = p4merge
cmd.meld = meld
Jak je vidět, nastavil jsem si kromě merge nástroje i externí diff. Takže když pustím příkaz hg p4diff file1 file2, spustí se mi také P4Merge, tentokrát jako diff nástroj.

Merge pomocí P4Merge

Je to opravdu taková idyla?

Není. Abych byl maximálně spokojený, chybí mi (zatím) dvě věci. Jednak bych rád, abych mohl provést hromadný merge - Mercurial totiž dělá to, že pro každý mergovaný soubor sekvenčně spustí P4Merge. A já bych chtěl např. hromadně přijmout příchozí, nebo své změny. Což je věc, kterou P4 normálně umí. Ale asi je to zajištěno přes P4V klienta.

Druhá vada na kráse je, že P4Merge neumí diff více souborů (např. příkaz hg p4diff -r 12:tip). Takže ho nemůžu použít pro vizuální diff mezi revizemi. To je důvod, proč mám v souboru .hgrc jako další externí diff nástroj Meld, který diff adresářů umí.

Meld, vizuální diff mezi revizemi

Máte nějaké tipy na používání P4Merge, nebo jiného vizuálního nástroje na merge v Mercurialu? Budu rád, když se podělíte o své zkušenosti v komentářích.

Související články

6 komentářů:

  1. Odpovědi
    1. Meld moc neznám. Narazil jsem na něj až teď, když jsem potřeboval ty diffy mezi revizemi. Takže jsem si s ním trochu pohrál, ale používám ho jen občas - většinou si vystačím s komandlajnovým hg diff.

      Vymazat
  2. Na diff mam taky nejradsi prikazovou radku (hg diff). Za popis konfigurace vizualniho merge vsak diky!

    OdpovědětVymazat
  3. Zkoušel jsi použít: https://www.jetbrains.com/idea/webhelp/running-intellij-idea-as-a-diff-or-merge-command-line-tool.html

    Nejsem si jistý, jak dobře to bude fungovat v rámci této externí integrace, ale jinak se mi s Diff toolem uvnitř Idey pracuje dobře.

    OdpovědětVymazat
    Odpovědi
    1. To je, řekl bych, docela kuriozní možnost :-) pouštět IDE jako diff.

      IDE většinou mají plugin pro daný VCS a diff nástroj funguje v rámci něho. To bude asi tenhle případ, ne?

      Nicméně, vyzkoušel jsem a funguje to. Ale možná mám někde něco špatně nastavený - ten IDEA diff se spoští cca 10 sekund a navíc mi to na Ubuntu řve, že OpenJDK má "PERFORMANCE AND GRAPHICS ISSUES!" a chce to po mně zmáčnkout enter. :-/

      Vymazat
    2. Jinak ten původní záměr byl, mít něco na merge mimo IDE - dost často něco bastlím jen tak ve Vimu a komituju z komand lajny.

      Vymazat