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.

Prispôsobenie hodín v Gnome

Hodiny na panele Gnome skrývajú niekoľko zaujímavých možnosti nastavení. Takže poďme si ich prispôsobiť.

Nastavenia hodín

Konfiguračný dialóg hodín na panele v Gnome je jednoduchý, ako je to bežné v tomto prostredí. Nastavenia, ktoré ponúka väčšinou aj celkom stačia. Ale ak predsa chcete prispôsobiť vzhľad hodín viac potrebujete Editor konfigurácie GConf. Ak ho náhodou nemáte, pravdepodobne sa dá nainštalovať pomocou správcu balíkov vašej distribúcie. Väčšinou je názov balíka rovnaký ako názov programu – „gconf-editor“.

Ďalej potrebujete nájsť potrebný kľúč prislúchajúci hodinám. Nastavenia apletov na panele sa v databáze GConf nachádzajú v adresáre /apps/panel/applets/. Tam to už začína byť zložitejšie. Podľa toho čo ste robili s vašim panelom, môže tam byť množstvo nastavení rôznych apletov, aj tých, ktoré už dávno nepoužívate. Takže asi jediná možnosť je prechádzať všetky a kontrolovať, kde má kľúč bonobo_iid hodnotu „OAFIID:GNOME_ClockApplet“. Ak takýchto záznamov mate viac, asi budete musieť vyskúšať všetky.

Gconf Editor

Samotné nastavenia apletov je v podadresáre „prefs“. Tam potrebujete nastaviť kľúč format na hodnotu „custom“ a do kľúča custom_format zapísať v akom tvare chcete mať zobrazený čas. Ako sa spomína v dokumentácii k tomuto kľúču, môžete používať prepínače pre funkciu strftime(), takže podrobnosti získate pomocou

man 3 strftime

Hodiny

Zaujímavou a nezdokumentovanou vlastnosťou je možnosť zmeniť vzhľad textu pomocou značiek podobných HTML. Popis týchto značiek nájdete v dokumentácii ku knižnici Pango, ktorá sa v Gnome používa na zobrazovanie textov. Ja používam takéto nastavenie: %a %e %b, <b>%H:%M</b>. Jeho výsledok môžete vidieť na obrázku.

phpDarcsView 0.5

Darcs je vynikajúci nástroj na správu zdrojových kódov. Existuje preň aj niekoľko nástrojov na prezeranie repository cez webové rozhranie, ale všetky vyžadujú, aby bol Darcs nainštalovaný na serveri a pripadne ešte aj možnosť spúšťať CGI skripty. Hosting kde by vám to dovolili, a ešte k tomu zadarmo, asi len tak ľahko nenájdete. Darcs však našťastie ukladá všetky informácie do textových súborov s jednoduchou štruktúrou, takže nie je ťažké napísať skript v PHP, ktorý by napríklad zoznam patchov získal z týchto súborov a nepotreboval by na to volať Darcs. A práve toto som aj urobil a teraz vydávam jeho prvú verziu.

phpDarcsView, ako sa tento skript volá, dokáže zobraziť aktuálne verzie súborov v repository a tiež zoznam patchov. Ak sa bojíte, že sa e-mailové adresy autorov patchov dostanú ľahko do rúk spamerom, tak buďte pokojní – e-mailové adresy sa v zozname patchov nezobrazujú. Pozrieť sa dá aj konkrétny obsah patchov. Pri zobrazovaní zdrojových kódov dokáže skript farebne zvýrazňovať syntax v spolupráci s FSHL (ten musíte nainštalovať samostatne).

Ako vyzerá tento skript v akcii si môžete pozrieť na mojich darcs repositories a stiahnuť si ho môžete na jeho domovskej stránke.

Skript na kompilovanie (skoro) hocičoho

Mnohé textové editory ponúkajú možnosť pomocou nejakej klávesovej skratky spustiť make v adresári s editovaným súborom. Je to pomerne pohodlné, ale nie vždy chcem na kompilovanie používať make. Preto som napísal jednoduchý shell skript, ktorý dokáže podľa typu súboru rozhodnúť ako ho skompiluje.

Tu je samotný skript build.sh:

#!/bin/bash

function run() {
    echo $@
    $@
}

function build_tex() {
    LATEX_ARGS=-halt-on-error
    FILENAME=$1

    MASTER=`grep -oP '(?<=%% master:) [-_\.\w]*' $FILENAME`
    if [ -n "$MASTER" ]
        then FILENAME=$MASTER
    fi

    if grep -Fq $'\usepackage{slovak}\n\usepackage{czech}' $FILENAME
        then run cslatex $LATEX_ARGS $FILENAME
        else run latex $LATEX_ARGS $FILENAME
    fi
}

FILENAME=$1
if [ -f Makefile -o -f makefile ]
    then run make
elif [ -f SConstruct ]
    then run scons -Q
else
    EXT=${FILENAME##*.}
    case "$EXT" in
    "tex")
        build_tex $FILENAME
        ;;
    "java")
        run javac $FILENAME
        ;;
    "c")
        run gcc -Wall -o ${FILENAME%.c} $FILENAME
        ;;
    *)
        echo "I don't know how to build your file"
        ;;
    esac
fi

Zatiaľ nepodporuje veľa typov súborov. Pokiaľ je v aktuálnom adresári súbor Makefile, tak spusti make, pokiaľ je tam súbor SConstruct – spusti scons. Ak žiaden z týchto súborov nenájde, rozhoduje sa podľa názvu súboru, ktorý dostane ako argument. Vie skompilovať program v C a v Jave, alebo spracovať dokument v LaTeXe. Pridanie podpory pre ďalšie typy súborov je veľmi jednoduché, takže každý si to môže prispôsobiť podľa vlastných potrieb.

Ešte sa zastavím pri spracovávaní dokumentov v LaTeXe. Skript vie rozpoznať či sa má použiť csLaTeX alebo obyčajný LaTeX. Tiež podporuje dokumenty rozdelené do viacerých súborov: stačí do súborov dať komentár v tváre

%% master: názov_hlavného_súboru

a spracovávať sa bude hlavný súbor namiesto toho, ktorý skript dostal ako argument.

Dúfam, že tento skrípt bude pre niekoho užitočný.

Jednoduchá inštalácia vlastného rozloženia klávesnice

Napísal som jednoduchý shell skript, ktorý inštaluje nové rozloženie klávesnice do X Window systému. Ako takéto rozloženie vytvoriť si môžete prečítať v mojom staršom článku.

Ten skript vyzerá tak:

#!/bin/sh

XKBDIR=/usr/share/X11/xkb

DIR=$PWD
cp $1 $XKBDIR/symbols/
cd $XKBDIR/rules/
sed -e "/<layoutList>/r $DIR/$1.xml" -i.bak xorg.xml
sed -e "/! layout/r $DIR/$1.lst" -i.bak xorg.lst

K tomu, aby správne fungoval, umiestnite do jedného adresára tieto súbory:

  1. definíciu rozloženia klávesnice (napríklad sk_sergejx)
  2. súbor s opisom rozloženia, ktorý sa má „vsunúť“ do xorg.xml. Tento súbor musí mať rovnaký názov ako súbor č. 1, ale s príponou .xml (napríklad sk_sergejx.xml)
  3. súbor s opisom rozloženia, ktorý sa má „vsunúť“ do xorg.lst. Tak isto musí mať rovnaký názov ako súbor č. 1, ale s príponou .lst (napríklad sk_sergejx.lst)

Potom treba skript spustiť v adresári s týmito súbormi a ako parameter mu dať názov súboru s rozložením. Napríklad takto:

./install.sh sk_sergejx

Samozrejme musíte ho spúšťať ako root, aby mohol zapisovať do príslušných konfiguračných súborov. Skript vytvára zálohu súborov xorg.xml a xorg.lst s príponou .bak pre prípad, že by ste ich chceli vrátiť do pôvodného stavu. Skript bol testovaný s X.org verzie 7.0, ale po menšej úprave by mal fungovať aj so staršími verziami.

Pripravil som aj balík s mojim rozložením klávesnice, ktorý obsahuje tento inštalačný skript.