CVS samotné není produkt nějak zvlášť bohatý na všemožné featurky, proto se v pravém UNIXovém duchu objevila řada různých utilitek, které nám práci s ním snad trochu zpříjemní a zefektivní. Tento článek samozřejmě nemůže pokrýt celou škálu různých rozšíření CVS. Snažil jsem se vybrat ta nejpraktičtější, nejzajímavější a nejlepší, ovšem určitě jsem zapomněl na něco, co bych určitě zmínit měl. Nechť tedy laskavý čtenář promine a pokud možno ostatním představí svoji oblíbenou utilitku v diskusi pod článkem. V minulých dílech mi měl ostatně možnost svůj tip sdělit ;-).
Proč ten shon?
Asi nejčastěji si projekty rozšiřují CVS nějakým mechanismem pro oznamování commitů, případně různých dalších akcí v repository. Nejčastěji se tak děje rozesíláním emailů, ovšem možné je i využití IRC či webového rozhraní.
Elektronická pošta
Pokud nám stačí klasická emailová upozornění, obvykle poslouží jednoduchý skript. Ty triviální jednoduše rozešlou informace, které jim na standardním vstupu předá CVS (případně lehce rozšířené), ovšem takto generované emaily nejsou obvykle příliš uspokojivé. Navíc pokud se commit týká více adresářů, dostanete pro každý adresář zvláštní email. Jeden takový skript se distribuje přímo s CVS, a to jako /usr/share/cvs/contrib/log.
Co se týče pokročilejších skriptů, na skladě je cvslog a (můj) cvslog.pl. Zatímco cvslog.pl má asi o něco více featurek, u cvslognajdete lepší dokumentaci; každý z nich má také odlišný způsob konfigurace. Liší se však zejména emaily, které generují. U obou je k dispozici ukázka, můžete si tedy vybrat, který formát vám vyhovuje více. Přitom není důležitá jenom přehlednost a zobrazené informace (u obou skriptů si můžete vybrat, co všechno má zpráva obsahovat), ale také například použitý subject či jiné hlavičky, které skript může nastavovat.
CIA
Projekt CIA je určen zejména pro sledování vývoje široké škály open source software. Mnoho různých projektů sem směruje notifikace o commitech, tyto informace jsou pak prezentovány na webu, vedou se statistiky commitů jednotlivých projektů i autorů, k dispozici je i RSS feed.
My si však CIA zmiňujeme zejména kvůli poměrně propracovanému mechanismu oznamování commitů na IRC, což je také jeho hlavní využití. Krom toho, že commity ze všech projektů se objevují na IRC síti FreeNode na kanálu #commits, může CIA doručovat informace o vašich commitech na libovolný kanál na jakékoliv síti.
Využití CIA může být dobrou volbou pro open source projekty, ovšem pokud to není váš případ, asi byste měli zauvažovat o něčem jiném. Lze sice s určitým úsilím rozchodit vlastní instanci CIA, ovšem pro jediný projekt je to jako kanón na vrabce.
CVSToys
CVSToys je další univerzální „řešení“ notifikace commitů. Narozdíl od CIA neexistuje centrální bod, kde se commity soustředí, CVSToys je tedy vhodný i pro closed source projekty. Nabízí podobně jako CIA notifikace na IRC, RSS feed i historii commitů přístupnou přes web. Navíc umí i sám rozesílat emaily s novými commity.
Bonsai
Bonsai je poměrně komplexní nástroj určený čistě pro sledování historie commitů přes web. Byl vyvinut pro potřeby Mozilly a ve vyhledávání a filtrování commitů se mu zřejmě jen tak něco nevyrovná, ovšem není jednoduché jej rozběhnout a nakonfigurovat – ostatně dá trochu práce se vůbec napoprvé zorientovat v samotném webovém rozhraní. Navíc je poměrně náročný na výkon.
www.CVS
cvsweb a viewcvs
Není nad to, mít možnost procházet si celý strom projektu přes web a nechat si jednoduše zobrazit historii jakéhokoliv souboru. Kromě výše zmíněné Bonsaie, která do této oblasti pravda také částečně zasahuje, jsou zřejmě zdaleka nejoblíbenějšími nástroji pro tento účel cvsweb a viewcvs.
Zatímco perlový cvsweb je jednodušší a možná rozšířenější, pythonové viewcvs bezesporu nabízí širší škálu featurek, lepší práci s read-only repository a do určité míry také vyhledávání v historii commitů podobné Bonsai.
StatCVS
Pokud vám nevadí Java, velice pěkný je projekt StatCVS, který generuje podrobné statistiky CVS repository, doprovázené všelijakými grafy – počet řádků kódu, počet souborů, „výkony“ jednotlivých vývojářů…
Za CVS mocnější
ChangeSety
Jedním ze zásadních nedostatků CVS je tzv. neatomicita commitů, tedy že i když commitneme změnu do více souborů, v každém souboru existuje zvlášť a není zde žádné provázání. Kompletní změnu, pokud se týkala více souborů, tak pak již není úplně jednoduché opět zrekonstruovat.
Zachrání nás nedocenitelné CVSps, které můžeme pustit na repository a ono nám vygeneruje pro každý commit (tedy sadu změn v několika souborech, commitnutých najednou) zvláštní soubor s informacemi o commitu a samozřejmě s patchem.
ACL
Kontrola přístupu je v CVS obvykle víceméně ve stylu „všechno nebo nic“, což ovšem v mnoha případech nevyhovuje, a některým uživatelům bychom rádi poskytli přístup pouze k určité části projektu. Tento problém řeší Access Control Listy, kde si můžeme přesně určit, který uživatel (ne)smí v jakém modulu do jakého adresáře v jaké větvi zapisovat.
Přímo v distribuci CVS je k mání jako /usr/share/cvs/contrib/cvs_acls skript, který dělá přesně to. Stačí ho přidat do konfigurace CVS, zatímco u jeho konkurenta cvsacl, který žije ve formě patche proti CVS, je instalace poněkud složitější. Na druhou stranu samozřejmě nabízí lepší integraci s CVS, nemusíte editovat konfigurační soubory, ale stačí použít příkaz cvs acl.
Jak to jen ještě vylepšit…?
Každý slušný projekt by měl mít ChangeLog. Ale jak ho udržovat? Inu, možná by bylo zajímavé ho prostě z jednotlivých commitů generovat automaticky. Na pomoc nám přispěchá příjemná utilitka cvs2cl, která se stará přesně o tohle.
Určitě za místo na disku stojí i CVS Utilities, sada jednoduchých, ale šikovných udělátek. Například cvschroot umí v celém vycheckoutovaném stromu změnit $CVSROOT (porouchal se vám mirror?), zatímco díky cvsu můžeme rychle zjistit, které soubory ve stromu potřebují update.
Obrázkové CVS
Musím se přiznat, že GUI obvykle příliš neholduji, proto se zde nemohu pouštět do žádných hloubkových srovnání, omezím se tedy na pouhý výčet několika známých klikacích CVS klientů. Toto téma by si určitě zasloužilo zvláštní článek, takže pokud jste sami už nějakého toho klienta vyzkoušeli a chtěli byste ostatním čtenářům připravit malou exkurzi, neváhejte!
Zřejmě nejrozšířenějším UN*Xovým grafickým klientem je gcvs, bratříček okenního wincvs. Speciálně pro prostředí KDE byla vyvinuta Cervisia, zatímco pro Windows by mohlo stát za to zkusit TortoiseCVS, které se vměstná přímo do Průzkumníka. Pokud jste Java-pozitivní (a nevyužíváte vestavěnou podporu pro CVS v NetBeans), zkuste třeba framework jCVS.
CVS trochu jinak
Zatímco o cvsd už jsme si psali v šestém dílu, ještě jsme se nestačili zmínit o CVSup a Meta-CVS.
CVSup je známý zejména díky velké trojce open source *BSD systémů, které CVSup využívají pro distribuci zdrojových kódů a /usr/ports. Umožňuje zejména efektivně updatovat repository v nějaké hierarchické struktuře mirrorů, a dokonce zachovávat lokálně commitnuté změny. Ve skutečnosti CVSup není ani omezen pouze na distribuci CVS repository, ale je postaven jako univerzální mirrorovací systém.
Meta-CVS je z trochu jiného soudku, snaží se totiž zalátat některé systémové nedostatky architektury CVS. Sice se mu daří napravit určité problémy (přemísťování souborů, opakované slučování větví nebo podpora pro symbolické linky), ovšem stále mnoho zásadních neduhů CVS přetrvává – zejména protože stále zachovává určitou zpětnou kompatibilitu s CVS, ovšem obojí stejně nemůžete používat najednou.
Takto pesimisticky se tedy loučíme s CVS. Jeho království jsme si prohlédli snad poměrně důkladně, i když jsme určitě nezavítali zdaleka do všech jeho koutů. Čeká nás však cesta do hor, abychom přehlédli celou krajinu, která se před námi dále rozkládá.
V příštím dílu budeme mluvit trochu teoreticky – zameditujeme si, jak by měl vypadat takový ideální systém pro kontrolu verzí. Pak si stručně představíme jednotlivé konkurenty CVS, u každého se krátce zastavíme a povíme si, co nám může nabídnout. A tím zřejmě alespoň prozatím naše putování skončí. Pokud by na něj někdo chtěl navázat písemným záznamem důkladnějšího průzkumu SVN, GNU archu či jiného „aktuálního“ systému…