Správa zdrojových kódov s Darcs

Chcete pri vývoji softvéru bez obáv experimentovať a stále mať možnosť vrátiť sa k staršej verzii? Chcete pracovať na projekte v skupine a jednoducho synchronizovať zdrojové kódy? Potom potrebujete revision control systém (RCS). V tomto článku vás zoznámim s jedným z takýchto systémov – s Darcsom.

Trochu histórie

Dlhu dobu bol najpožívanejším systémom v tejto oblasti CVS. Neskôr sa objavil jeho nástupca – Subversion, ktorý riešil viacero nedostatkov CVS. Obidva tieto systémy ale boli centralizované. To znamená, že existuje centrálny server, kde sú uložené súbory projektu a ich história. Takéto úložisko sa volá „repository“. Aby ste urobili nejaké zmeny, potrebujete stiahnuť si súbory pomocou príslušného nástroja a potom ich novú verziu nahrať späť na server.

Inú skupinu tvoria tzv. distribuované systémy na správu revízii. Tie nie sú závislé na jednom centrálnom repository, ale každý vývojár má vlastné repository v ktorom nahráva svoje zmeny. Väčšinou projekt má aj centrálne repository, s ktorým sa potom ostatní vývojári synchronizujú. Tento prístup je v súčasnosti dosť populárny a Darcs patrí tiež do tejto skupiny.

Darcs

Darcs (David‘s Advanced Revision Control System) je pomerne netradičný v porovnaní s ostatnými RCS. V Darcse hlavným objektom nie sú súbory a adresáre na ktorých sa robia zmeny, ale samotné zmeny, ktorých postupnou aplikáciou vznika určitý stav súborov. Tato koncepcia umožňuje riešiť niektoré problémy elegantnejšie a jednoduchšie. Teoretickým základom pre fungovanie Darcsu je takzvaná teória patchov.

Začíname

Najprv si potrebujete Darcs nainštalovať. Inštalačné súbory a návod na inštaláciu pre rôzne operačné systémy nájdete na stránkach projektu.

Použitie Darcsu ukážem na jednoduchom príklade. Vytvoríme si program, ktorý vypisuje frázu „Hello world“ alebo niečo podobné. Najprv potrebujeme vytvoriť adresár pre náš projekt. Povedzme, že sa bude volať helloworld. Tam si uložíme aj prvú verziu nášho programu (hello.c), ktorá bude vyzerať takto:

#include <stdio.h>
int main() {
    printf("Hello world\n");
    return 0;
}

Teraz chceme začať používať Darcs a zaznamenať si túto prvú verziu. Darcs sa ovláda pomocou príkazového riadku (ako väčšina RCS). Najprv prejdeme do adresára, kde mame zdrojové kódy projektu a potom tu vytvoríme repository:

cd helloword
darcs initialize

Všimnite si, že sa v adresári vytvoril podadresár _darcs. Tam sa budu ukladať zaznamenávané zmeny a iné pomocné informácie. Teraz povieme Darcsu aby sledoval zmeny v súbore hello.c:

darcs add hello.c

A nakoniec zaznamenáme prvú verziu:

darcs record -a

Darcs sa najprv opýta na vašu e-mailovú adresu. Tú bude používať ako identifikátor autora zmien. Zadáva sa v tvare „Meno Autora <emailova@adresa>“. Potom sa opýta na názov zmeny (zadáme napríklad „Prva verzia“) a či chcete zadať dlhší komentár (zatiaľ stačí ak stlačíte „n“).

Teraz máme zaznamenanú prvú zmenu. Môžeme si to overiť príkazom:

darcs changes

Mali by ste vidieť niečo takéto:

Thu Nov 22 18:58:28 CET 2007  Moje Meno <example@example.com>
  * Prva verzia

Ďalšie zmeny

Poďme si upraviť náš program. Nech sa po spustení opýta na meno používateľa a pozdraví ho osobne. Výsledok môže vyzerať tak:

#include <stdio.h>
int main() {
    char name[20];
    printf("What's your name?");
    scanf("%s", name);
    printf("Hello %s\n", name);
    return 0;
}

Pozrime sa ako sa súčasna verzia líši od zaznamenanej:

darcs whatsnew

Odpoveď bude vyzerať takto:

{
hunk ./hello.c 3
-    printf("Hello world\n");
+    char name[20];
+    printf("What's your name?");
+    scanf("%s", name);
+    printf("Hello %s\n", name);
}

Je to popis zmeny vo formáte Darcsu. „hunk“ znamená zmenu textu súboru. Za tým nasleduje názov súboru a číslo riadku, kde sa zmena začína. Ďalej je samotný zmenený text – odstránené riadky (označené s „-“) a pridané riadky („+“).

Ak sme s týmito zmenami spokojní, môžeme ich zaznamenať:

darcs record

Pre každú zmenu sa nás Darcs bude pýtať či ju chceme zaznamenať (pokiaľ nepoužijeme parameter „-a“ – all). Teraz je to len jedna zmena, takže odpovieme „y“ a potom zadáme názov patcha (napríklad „Zadavanie mena pouzivatela“). Na otázku o dlhom komentári môžeme znovu odpovedať „n“.

Ak teraz zadáme darcs changes zobrazí sa nám aj tento nový patch.

Mazanie nezaznamenaných zmien

Teraz predstavme, že sme sa rozhodli pýtať od používateľa nášho programu okrem mena aj priezvisko. Výsledok bude vyzerať takto:

#include <stdio.h>
int main() {
    char name[20];
    char surname[20];
    printf("What's your name?");
    scanf("%s", name);
    printf("What's your surname?");
    scanf("%s", surname);
    printf("Hello %s %s\n", name, surname);
    return 0;
}

Po čase si ale uvedomíme, že to nebol najlepší nápad a chceme všetko vrátiť do pôvodného stavu – k naposledy zaznamenanej verzii. Na to slúži príkaz darcs revert. Po spustení sa nás Darcs bude pýtať či chceme odstrániť jednotlivé čiastkové zmeny. Vyzerať to bude približne takto:

hunk ./hello.c 4
+    char surname[20];
Shall I revert this change? (1/?)  [ynWsfqadjkc], or ? for help: y
hunk ./hello.c 7
-    printf("Hello %s\n", name);
+    printf("What's your surname?");
+    scanf("%s", surname);
+    printf("Hello %s %s\n", name, surname);
Shall I revert this change? (2/?)  [ynWsfqadjkc], or ? for help: y
Do you really want to revert these changes? y
Finished reverting.

Teraz už viete zaznamenávať zmeny v zdrojových kódoch pomocou Darcsu a viete sa vrátiť k naposledy zaznamenanej verzii. Je to síce len časť toho, čo Darcs dokáže ale aj toto je dosť užitočné a väčšinou pri práci nič viac nepotrebujem. Ak sa chcete o Darcse dozvedieť viac, môžete si pozrieť Darcs Manual alebo Darcs Wiki.