Emacs pro mírně pokročilé (4): Správa verzí souborů v Emacsu

3. 5. 2001
Doba čtení: 6 minut

Sdílet

Práce na větším projektu a spolupráce více autorů s sebou přináší nejeden problém. Jsou-li navíc lidé zapojení do takovéhoto projektu roztroušeni po celém světě, je problém o to větší. S řešením, jak jednotně uchovávat a spravovat soubory, přichází tzv. systém pro správu verzí. Jak s takovýmto softwarem spolupracuje Emacs, o tom bude řeč v dnešní části seriálu.

Minule jsme si ukázali, že Emacs velmi dobře spolupracuje s externími programy při kompilaci a hledání textu v souborech. Dnes se podíváme, že ani spolupráce a komunikace s programy pro správu verzí mu není cizí. „Systémy pro správu verzí (Version control systems)“ jsou programy, které dovedou zaznamenávat více verzí zdrojového souboru. Dovedou také uchovávat informace o historii, například kdy byla která verze vytvořena, kdo ji vytvořil a jak změny popsal. Komplexní popis jednotlivých systémů by jistě vydal na samostatný seriál a nebudeme jej zde příliš podrobně rozebírat. Rozhraní Emacsu pro komunikaci s těmito systémy se jmenuje VC (Version Control) a umožňuje práci se třemi systémy: RCS, CVS a SCCS.

Je-li soubor uložen v systému pro správu verzí, říkáme, že je „registrován“. Každý registrovaný soubor má odpovídající hlavní soubor (master file), který reprezentuje současný stav, historii, záznamy o změnách apod. a je obvykle uložen na nějakém serveru. Soubor, který je spravován v takovémto systému, se obvykle nazývá pracovní kopií (work file). Tento soubor lze běžným způsobem editovat a po provedení změn se tyto zaznamenají do systému (check in) spolu s popisem změn; nalézá se obvykle v pracovním adresáři uživatele. Systémy obsahují zpravidla mechanismus, jak reagovat v případě, že chce soubor měnit zároveň více uživatelů (zamykání souborů u SCCS a RCS, slučování změn ve chvíli vkládání do systému). Jak už jsem uvedl, podrobný popis mechanismu ukládání je skutečně nad rámec tohoto seriálu.

Podívejme se nyní na to, jak se soubory registrovanými v nějakém takovémto systému pracuje Emacs. Pokud otevřeme soubor, který je zaregistrovaný v některém z těchto systémů, Emacs nás o tom informuje na stavové řádce (mode line), například CVS-1.13, tedy jméno použitého systému a pomlčkou oddělené číslo verze (znak mezi jménem a verzí může být také ‚ :‘, což značí uzamčený nebo modifikovaný soubor). Příkazy módu VC jsou v jistém smyslu univerzální, kokrétní akce (zamknutí souboru, přidání změn do systému, …) je tedy vybírána na základě aktuálního stavu souboru. Klávesové zkratky C-x C-q a C-x v v  provádějí logicky následující operaci v systému na aktuálním souboru. Přesněji řečeno je funkce vc-next-action namapována pouze na zkratku C-x v v, přesný význam příkazu C-x C-q je poněkud jiný a je více závislý na použitém systému.

Základní rozlišení při použití módu VC souvisí úzce s použitým backendem, tedy systémem pro správu verzí, a to s použitím zamykání a bez zamykání. První možnost je standardní pro systémy RCS a SCCS, zatímco druhá pro CVS. Logické kroky v případě použitého systému se zamykáním tedy jsou: zamknutí souboru, pokud již není uzamčený; je-li námi uzamčený a obsahuje změny, pak je to poslání změn do systému; pokud je námi uzamčený, ale neobsahuje žádné změny, je následujícím krokem znovuodemčení souboru; pokud je soubor zamknutý někým jiným, zeptá se Emacs, zda chcete toto uzamčení „ukrást“. Tyto kroky jsou platné i v případě, kdy je zamykání použito se systémem CVS. V druhém případě, kdy není použito zamykání, nabídne C-x C-q sloučení změn v případě, že jsou v systému obsaženy změny nezahrnuté v naší aktuální pracovní kopii; pošle změny do systému v případě, že žádné takové změny nenalezne. Existuje možnost, jak chování následujícího kroku rozšířit, přidáme-li prefix C-u  před příkaz, lze pomocí parametru například ovlivnit číslo další verze apod. Při posílání změn do systému je nejprve zobrazen tzv. *VC-Log* buffer, který slouží pro zapsání změn. Změny jsou odeslány po stisku C-c C-c, pokud změny odeslat nechceme, jednoduše tuto posloupnost nezadáme. V tomto bufferu lze také procházet pomocí příkazů M-n, M-p, M-s a M-r (podobně jako např. v bashi) historií zadaných logovacích zpráv.

Jednou z mnoha výhod systémů pro správu verzí je, že umožňují vracet se ke starším verzím, to je prohlížet, porovnávat apod. Zadáme-li v bufferu obsahující pracovní kopii souboru registrovaného v jednom ze systémů C-x v ~ VERZE, kde VERZE je číslo námi požadované verze souboru, otevře se v Emacsu příslušná verze ze systému. Pomocí C-x v = porovnáme aktuální obsah bufferu s poslední verzí odpovídajícího souboru v systému. Předřadíme-li navíc tomuto příkazu prefix C-u, můžeme přímo zadat dvě konkrétní čísla verzí k porovnání. Příkaz C-x v g je zkratka pro CVS annotate, který zobrazí aktuální stav souboru s popisem, kdy a kým byl který řádek editován. Dalšími užitečnými příkazy jsou registrování (ještě nezaregistrovaného souboru) do systému ( C-x v i), zobrazení aktuální stavu a výpis zaznamenaných změn ( C-x v l), a mnoho dalších, jejichž podrobný popis je uveden v manuálu. Významné je, že mód VC lze použít ve spojení s tzv. Dired módem (o kterém bude podrobněji řeč v některém z následujících dílů). Stručně řečeno umožňuje tento mód práci s více soubory najednou. Posloupnost C-x v d vytvoří právě takovýto VC Dired Mode, kde lze nejen získat informaci o aktuálním stavu všech souborů zaregistrovaných v systému, ale zároveň s nimi pracovat. Čtenářům znalým práce s Dired módem prozradíme, že příkaz v v ( vc-next-action) operuje s označenými soubory, ostatní si budou muset počkat na příslušný díl seriálu.

Práce se systémy pro správu verzí je u větších projektů často složitá a my jsme si zde nastínili pouze základní, ale zároveň nejužívanější příkazy. Popis práce s větvemi a další podrobnosti nebudeme dále rozebírat, ale zaměříme se ještě alespoň částečně na související problém, kterým je řešení konfliktů. Jedná se tedy o situaci, kdy jsme provedli změny na pracovní kopii souboru, který se mezitím v systému pro správu změnil. V Emacsu je možné pro řešení takovéto situace použít tzv. Emerge. Kompletní popis by byl bohužel zdlouhavý a příliš obsáhlý a vzhledem ke své obecnosti by si zasloužil samostatný článek. S ohledem na souvislost s použitím výše popisovaného módu pro správu verzí si jej zde alespoň stručně popíšeme. Emerge zobrazuje porovnávání změn ve třech bufferech, „A buffer“ a „B buffer“ a tzv. „merge buffer“. První dva obsahují původní soubory a třetí je výsledkem spojení.

V daném momentě je v prostředí Emerge pozornost soutředěna na jeden konkrétní tzv. „vybraný“ rozdíl. Tento rozdíl je v každém ze dvou původních bufferů označen pomocí v a ^, tedy například takto:

bitcoin školení listopad 24


vvvvvvvvvvvvvvvvvvvv
TEXT, KTERÝ SE LIŠÍ
^^^^^^^^^^^^^^^^^^^^

Emerge

umožňuje pohybovat se po jednotlivých rozdílech vpřed (klávesa n) či vzad (klávesa p); vybírat verzi obsaženou v prvním (A) (klávesa a) či v druhém (B) souboru (klávesa b); odskakovat na n-tý rozdíl ( C-u N j) apod. Především ovšem rozlišuje práci ve dvou módech: rychlém (fast) a editovacím (edit). Rychlý mód slouží pouze pro slučování rozdílů výběrem jedné z variant (a pro tento mód slouží uvedené zkratky). Mód editační umožňuje navíc běžné upravování souboru (zmiňované akce zde mají potom předponu C-c C-c). Přepínání mezi módy je namapováno na počáteční písmena jejich názvů, tedy f pro rychlý a e pro editační. Opuštění emerge je možné dvěma způsoby: příkazem emerge-quit (klávesa q), který uloží sloučené změny do souboru zadaného jména, nebo pomocí C-], který přeruší prováděné slučování. Příkazů pro práci s emerge je, jak bylo řečeno, celá řada, snad alespoň tento stručný přehled poslouží jako počáteční berlička při řešení problémů vzniklých během práce s módem pro správu verzí.

Příští díl bude věnovaný tzv. TAGům a jejich použití v prostředí editoru Emacs. Bude se jednat o poslední ryze programátorský díl, následující budou opět určeny širší Emacsovské komunitě.