CVS pro každého (3) - dokončení

20. 5. 2002
Doba čtení: 5 minut

Sdílet

Dnes se dozvíme více o dalších příkazech a popíšeme si speciální soubory v pracovním adresáři a v repozitáři. Na závěr si povíme o zvláštnostech kompilace z CVS.
Další příkazy

Příkaz add slouží k přidávání souborů do repozitáře.

Příkaz tag umožňuje nakládat s větvemi a značkami.

Příkaz import vloží do CVS adresář z ne-CVS projektu.

Příkaz export vykopíruje žádanou verzi z repozitáře bez speciálních adresářů CVS.

Pokročilým uživatelům slouží příkaz admin. Ten umožňuje např. určit, zda se bude se souborem nakládat jako s binárními daty, zlikvidovat z repozitáře záznam o některých verzích apod.

Příkaz init zakládá nový CVS server.

Existuje ještě několik dalších příkazů. Jejich stručný popis získáme pomocí cvs –help commands a cvs –help příkaz.

Speciální soubor .cvsignore

V adresářích se mohou nacházet soubory .cvsignore. Ty, jak název napovídá, zařídí, že některé soubory a adresáře, byť se na nich provádějí změny, nebudou uloženy do repozitáře. Tato vlastnost je velmi užitečná – pokud stažený adresář používáme přímo ke kompilaci, cvs se vyhne generovaným souborům. Může obsahovat například (pro projekty generované automake):

Makefile
Makefile.in
aclocal.m4
config.cache
config.h
config.h.in
config.log
config.status
configure
*.o
*.lo
*.a
.libs

Speciální adresář v pracovním adresáři – CVS

Jak jsme si již řekli, v každém pracovním adreáři se nachází podadresář CVS. Za normálních okolností do těchto souborů nemusíme nahlížet, ale je užitečné vědět, co v nich je. Přesný popis souborů najdeme v dokumentaci.

Soubor Root

Soubor, kde je uložena adresa repozitáře. Pokud se celý repozitář přestěhuje na jiný server nebo pokud chceme přejít z anonymního zrcadla na neanonymní repozitář, můžeme se vyhnout stahování celého pracovního adresáře právě hromadnou záměnou tohoto souboru (samozřejmě riskujeme, že pokud repozitáře nejsou shodné, získáme zkomolená data).

Soubor Repository

Tento soubor obsahuje odkaz do podadresáře v repozitáři. Podíváme-li se na zmíněné Glib2, zjistíme, že pro adresář glib je to

/cvs/gnome/glib (absolutní odkaz do repozitáře), pro glib/glib/lib­charset je to glib/glib/lib­charset (relativní odkaz do podadresáře modulu glib), ale pro build projektu Glib2 je to build (je to proto, že tento adresář pochází z jiného modulu – viz ukázka v minulém dílu)

Soubor Entries

Je nejzajímavějším souborem adresáře. Jsou v něm uloženy informace o všech souborech daného adresáře. Položky jsou odděleny lomítky. Na ukázku uvedu několik řádků z projektu Glib2:

D/glib////
/.cvsignore/1.23/Mon Mar 18 22:27:41 2002//Tglib-2-0
/AUTHORS/1.8/Mon Mar 11 18:29:18 2002//Tglib-2-0
/COPYING/1.2/Tue Aug  4 14:26:17 1998//Tglib-2-0
/ChangeLog/1.1085.2.11/Wed May 15 19:23:29 2002//Tglib-2-0

Pokud je první písmeno na řádku D, druhá položka udává jméno podadresáře.

Pokud je první písmeno na řádku /, je formát následující:

/soubor/verze/čas nebo konflikt/volby/značka, datum nebo větev

Čas je v UTC, jako ostatně všechny časy v CVS, a udává časové razítko souboru v pracovním adresáři. Informace Result of merge udává, že se jedná o výsledek spojení změn v repozitáři a pracovním adresáři, který ještě nebyl zapsán do repozitáře. Volby například udávají, že jde o binární soubor.

Není vhodné upravovat záznamy na řádcích. Pokud ale chceme nějaký adresář smazat z pracovního adresáře, vymazání příslušného řádku z tohoto souboru zajistí, že příkaz update bez voleb jej nedotáhne zpět. To se hodí před některými příkazy checkout do existujícího adresáře, pokud je cvs zmateno přítomností adresářů z různých modulů i větví zároveň (u projektů Gnome se to často stává s adresářem

macros).

Soubor Entries.static

Pokud po provedení příkazu checkout vznikne v některém adresáři tento soubor, znamená to, že příkaz úmyslně nenačetl celý adresář. Následné příkazy update budou aktualizovat jen to, co je již staženo. Pokud zadáme update -d, zrušíme toto omezení a stáhnou se i všechny podadresáře. Pokud pouze smažeme tento soubor, příkaz update dotáhne všechny soubory jen v pracovním adresáři.

Soubory Entries.log Entries.Backup

Jsou pracovními soubory programu cvs. Pokud cvs skončí korektně, soubor Entries.Backup by neměl existovat a Entries.log by měl obsahovat pouze záznamy o prázdných adresářích, které nejsou stahovány.

Speciální adresář v repozitáři – CVSROOT

V repozitáři existuje adresář CVSROOT, který obsahuje několik speciálních souborů. Ty určují chování serveru – například správu modulů, akce spouštěné při každém zápisu a podobně. S adresářem se pracuje pomocí standardních CVS příkazů checkout, update

a commit (pokud server nevhodným nastavením nevyřadíme z činnosti).

Zvláštnosti kompilace z CVS

Není vhodné, aby se na CVS nacházel jakýkoliv generovaný soubor, protože různí vývojáři se mírně liší svým vybavením; do repozitáře by tak byly neustále ukládány nepodstatné změny v generovaných souborech.

Proto bývá na CVS uložena tzv. hackerská verze. Ta neobsahuje žádný generovaný soubor a k její kompilaci potřebujeme všechny pomocné nástroje, které použili vývojáři. Na CVS většinou existuje jeden speciální soubor, který tyto soubrory generuje. Většinou se jmenuje autogen.sh a po vygenerování souborů rovnou spouští se svými parametry skript

configure. Jiní tvůrci jej pojmenovávají Build.sh, cvsbuild apod. Jeho funkce není pevně určená.

Zjednodušíme-li tento soubor, může jeho typický obsah vypadat asi takto:

gettextize
automake -a
autoconf
configure --enable-maintainer-mode "$@"

Protože příkaz update nastavuje u aktualizovaných souborů aktuální datum, můžeme používat stejný pracovní adresář pro CVS i pro kompilaci, aniž by to narušilo funkci CVS nebo časovou posloupnost souborů pro

make. Tak si snadno můžeme jakoukoliv změnu před odesláním vyzkoušet.

Bývá zvykem, že při vydání každé nové verze udělá správce projektu v repozitáři značku. Díky tomu si můžeme i z CVS stáhnout totéž, co z balíčků.

Je nepsaným pravidlem, že větve se od značek odlišují velikostí písmen. V tom, zda se velkými písmeny pojmenovávají větve, či značky, však shoda nepanuje.

Úspora datového toku na lince

Pro ty, kteří chtějí pracovat s CVS na pomalých a vytáčených linkách, je důležité minimalizovat datový tok resp. dobu komunikace se serverem. Již dříve jsme si řekli, že úsporu lze ovlivnit vhodným nastavením komprese.

CVS je interaktivní a náročný protokol, a proto ke stažení kompletního pracovního adresáře je vždy výhodné použít alternativní metody, jsou-li k dispozici – např. rsync, CVSup nebo stažení snímku pracovního adresáře v běžném komprimovaném archivu. První dvě metody lze použít i pro aktualizaci, pokud nebudeme v pracovním adresáři provádět žádné změny.

Když se stahují data pro existující soubor, používá se formát diff. Ten je výhodný, pokud od poslední aktualizace došlo k malému množství změn. Pokud jsou však verze velmi odlišné, může se snadno stát, že objem potřebných dat převýší cílovou velikost souboru, a to i značně. Pak je vhodné velmi odlišné adresáře smazat. Jako příklad mohu uvést přechod z CVS Mozilly 0.99.9 na 1.0RC1, který si vyžádal zhruba 5 h přenosu, zatímco ke stažení snímku adresáře by stačily 2 h.

Odkazy

bitcoin_skoleni

Pro ty, kteří chtějí s CVS pokročit dále, doporučuji výborný článek Miloslava Ponkráce Správa projektů pomocí CVS, který vyšel v Linuxových novinách.

Vyčerpávajícím popisem je pak několikasetstrán­kový manuál k CVS, který je součástí CVS. Druhý manuál pak popisuje serverovou komunikaci.

Autor článku