V našem krátkém seriálu se nebudeme snažit popsat všechny detaily systému CVS, ale naučíme se stáhnout si program, přecházet mezi větvemi, zkompilovat, případně odeslat do CVS drobné opravy či překlad.
CVS je zkratka z názvu Concurrent Versions System, což lze snad přeložit jako „systém souběžných verzí“. Tím chtěli autoři naznačit asi tolik, že v systému CVS jsou uloženy všechny verze zdrojového kódu a v případě potřeby se lze ke kterékoliv starší verzi vrátit. Zároveň to znamená, že souběžně může pracovat se zdrojovým kódem více programátorů, aniž by se jim cokoli navzájem přepisovalo, a CVS pomáhá okamžitě sdílet jejich výsledky.
Repozitář a pracovní adresář
Repozitář je zvláštní struktura, do které si CVS ukládá své soubory. Pro běžnou práci s CVS naprosto nepotřebujeme znát jeho strukturu, stačí, když známe jeho síťovou adresu. Ta může vypadat třeba takto:
:pserver:anonymous@anoncvs.gnome.org:/cvs/gnome
Repozitář obsahuje všechny verze souborů ve zvláštním formátu.
Pomocí programu cvs získáme z repozitáře kopii souborů v určité verzi – to je pracovní adresář. Ten poznáme podle toho, že má v každém adresáři podadresář CVS, který obsahuje několik speciálních souborů. S pracovním adresářem můžeme nakládat různými způsoby – použít ho ke kompilaci, jako podklad pro získání jiné verze z CVS, nebo jako pracovní kopii pro editaci zdrojového kódu. Máme-li zápisové právo do repozitáře, můžeme do něj změny uložit.
Větve a značky
Aby bylo možné vytvořit dvě vývojové větve téhož programu nebo si označit některou z konečných verzí, jsou v CVS k dispozici značky (tags) a větve (branches).
Pokud vývojář dojde k závěru, že nějaká verze je zralá k vydání, provede označkování souborů. CVS si zaznamená stav, ve kterém se nacházejí soubory projektu – udělá si u tohoto stavu značku. Každý si může nahrát přesně tuto verzi a může se k ní kdykoliv vrátit.
U složitějších projektů běží často souběžný vývoj dvou verzí – stabilní, ve které se provádějí pouze opravy chyb, a vývojové, kde si programátoři mohou dovolit větší změny. I to CVS umí. Slouží k tomu větve. V určitém okamžiku se vývoj zdrojového kódu rozštěpí a tyto větve spolu nadále nekomunikují. Zůstávají však součástí téhož repozitáře.
Větvení je možné opakovat. U velmi složitých projektů, jakým je například Mozilla, se vytváří vývojová větev před každou vydanou verzí (viz tento obrázek).
Moduly
U velkých projektů se často stává, že část kódu se opakuje v různých projektech. Aby jí nebylo nutné udržovat v několika kopiích, nabízí CVS moduly. Při stažení projektu se nám v pracovním adresáři tyto moduly složí a vytvoří společnou strukturu.
Anonymní CVS
Mnohé projekty nabízejí anonymní CVS s přístupem pouze pro čtení. Pro přístup k aktuálnímu kódu pak nepotřebujeme žádné povolení –
stačí si jej stáhnout. U velkých projektů existují i anonymní CVS servery – ty bývají většinou zhruba o hodinu opožděné oproti vyvojářskému CVS.
Pokud nechcete na stránkách dokumentace hledat heslo, pak vězte, že nejčastější hesla pro přístup k anonymnímu CVS jsou: prázdný řetězec, anonymous, anoncvs, guest a cvs.
Program cvs
K práci s CVS slouží stejnojmenný program, pracující na příkazové řádce. Existují i GUI a WWW rozhraní, ale nikdy jsem po nich nepátral, neboť si s příkazovou řádkou plně vystačím.
Zadáváme-li příkazy pro CVS, je přeba pamatovat, že argument příkazu cvs sestává ze tří částí (v tomto pořadí): obecné volby, název příkazu, volby příkazu a jméno adresáře, modulu či souboru. Obecnými volbami jsou hlavně určení repozitáře a volba komprese, příkaz udává akci, kterou chceme provést (viz cvs –help commands) a volby příkazu jsou volby pro zadaný příkaz (např. větev, rekurzivita apod. – viz
cvs –help příkaz).
Správná volba komprese nám může ušetřit kapacitu linky a čas. V praxi se osvědčila následující metoda: U málo navštěvovaných projektů je vhodná maximální komprese -z9. U velmi zatížených projektů bývá vhodné kompresi snížit, např. na -z3 nebo až
-z1, protože poměrně malý zisk z nižšího zatížení linky při vyšší kompresi vykoupíme o mnoho vyšším požadavkem na strojový čas serveru, a tedy i pomalejší odezvou.
Běžně používané volby si můžeme zaznamenat do souboru ~/.cvsrc, abychom je vždy nemuseli vypisovat do příkazového řádku. Ten může vypadat například takto:
cvs -z3
Ukázka praktické práce s CVS
V naší ukázce si krok po kroku ukážeme kompilaci knihovny Glib, která je nejzákladnější knihovnou projektu GNOME/GTK.
Ukázka zdaleka nepokrývá všechny možnosti CVS, ale pouze základní použití.
Nejdříve musíme určit, s jakým repozitářem budeme pracovat. Lze to udělat dvěma způsoby: definicí proměnné CVSROOT a parametrem -d u novějších verzí CVS.
CVSROOT=:pserver:anonymous@anoncvs.gnome.org:/cvs/gnome export CVSROOT
Příkaz login
Při vůbec prvním přístupu k repozitáři je třeba se přihlásit příkazem login:
cvs login
Nyní zadáme heslo (prázdný řetězec). Program si jej zaznamená do souboru ~/.cvspass, a proto se příště již nemusíme přihlašovat. Pokud jsme paranoidní, můžeme po skončení práce použít příkaz logout. Ten heslo ze souboru ~/.cvspass vymaže.
Příkaz checkout
Slouží ke stažení zadaného pracovního adresáře nebo souboru.
Užitečné volby:
-A: Převede všechny soubory v adresáři na soubory určené větve nebo značky (není-li určena, použije hlavní větev (viz dále). Je vhodná zvláště pro složitější projekty, kde různé verze mají různou strukturu.
-P: Nevytváří prázdné adresáře (adresáře, které v dané verzi neexistují). Bez této volby vytvoří prázdné adresáře, ve kterých je pouze speciální adresář CVS.
-r: Volí větev nebo značku. Bez této volby bude použita hlavní vývojová větev (HEAD), která existuje vždy.
-D: Volí určité datum. Bez této volby se použije nejnovější verze. Lze kombinovat s označením větve.
Zkratky: co, get
Nyní provedeme vlastní stažení pracovního adresáře. Příkaz bude vypadat asi takto:
cvs checkout glib
Nic nezkazíme, použijeme-li při operaci checkout volby -A a -P. Tedy:
cvs checkout -AP glib
Ti, kteří si nenastaví kompresi do souboru ~/.cvsrc ani repozitář do proměnné CVSROOT, mohou příkaz zadat jako:
cvs -z3 \ -d :pserver:anonymous@anoncvs.gnome.org:/cvs/gnome \ checkout -AP glib
(stejné volby platí i pro login, volba -z3 pak i pro ostatní příkazy, a proto je již nebudu opakovat)
Takový příkaz bude skutečně fungovat. Při prozkoumání stažených dat zjistíme, že se jedná o větev pro novou verzi projektu Glib2. Předpokládejme, že chceme stáhnout starší, ale široce používanou větev Glib1.
Máme několik možností:
1) Celý pracovní adresář smazat a nahrát správnou větev (tou je větev označená glib-1–2).
cvs checkout -AP -r glib-1-2 glib
2) Pracovní adresář si ponechat a převést ho na správnou větev. Možná tím ušetříme nějakou kapacitu linky, protože CVS přenáší pouze rozdíly (alespoň v novějších verzích):
cvs checkout -AP -r glib-1-2 glib
3) Použít příkaz update. O něm se dozvíme příště.
Další výhodou CVS oproti tarballům nebo rpm je, že si můžeme z CVS nahrát jediný soubor. Následující příkaz nahraje změnový soubor ChangeLog z větve glib-1–2 aktuální k tomuto okamžiku:
cvs checkout -AP -r glib-1-2 glib/ChangeLog
Tímto známe vše, abychom si dokázali stáhnout libovolná data z CVS. CVS však umí mnohem více. Ale o tom až příště.