CVS pro každého (2) - praxe

13. 5. 2002
Doba čtení: 6 minut

Sdílet

Dnes se dozvíte, jak aktualizovat data z CVS, jak získat podrobné informace o provedených změnách, větvích, značkách a modulech a jak poslat provedenou změnu na CVS.
Příkaz update

Příkaz slouží k aktualizaci stažených pracovních adresářů nebo souborů. Pokud nemá žádné vstupní argumenty, zaktualizuje aktuální adresář. Příkaz nepotřebuje informaci o repozitáři, získá ji ze souborů ve speciálním adresáři CVS.

Užitečné volby:

-A, -P, -r, -D: Mají stejný význam jako u checkout. Pokud nezadáme -A, -r ani -D, příkaz bude aktualizovat podle naposled zadané větve či značky.

-d: Vytváření adresářů. Pokud v repozitáři vznikne nový adresář, vytvoří se nám též v pracovním adresáři.

Jak tedy provést aktualizaci?

Postavíme se do adresáře glib a zadáme:

cvs update -Pd

Pokud jste ještě nesmazali testovací data z minulého týdne, můžete na nich příkaz otestovat – cvs si zkontroluje změny, ke kterým za poslední týden došlo v příslušné větvi repozitáře, a přenese je do našeho pracovního adresáře.

Pokud chceme stát o adresář výš, napíšeme:

cvs update -Pd glib

Opět můžeme zaktualizovat pouze jeden soubor (stojíme-li v pracovním adresáři):

cvs update -Pd -r glib-1-2 ChangeLog

Pokud bychom chtěli získat snímek pracovního adresáře např. k poledni 1. února, zadáme (což ovšem můžeme udělat také s příkazem checkout):

cvs update -Pd -D "2002-02-01 12:00:00"

Pomocí příkazu update lze také přecházet mezi jednotlivými větvemi. Následující příklad nám převede libovolnou větev na větev Glib1:

cvs update -APd -r glib-1-2

Použití samotné volby -A bez zadání větve provede přechod k hlavní větvi (HEAD).

Důležité rozdíly update a checkout

Je třeba pamatovat na to, že příkaz checkout pracuje se zadanými jmény modulů a repozitáře, zatímco update získává informaci ze speciálních adresářů (nepotřebuje tedy informaci o adrese repozitáře). Pokud dojde v repozitáři ke změně v modulech, ze kterých se projekt skládá, update to nezaregistruje. V takové situaci musíme provést checkout.

Příkaz checkout může mít za stejné situace problémy, pokud jej provádíme do již existujícího adresáře a ve staré verzi je určitý adresář součástí datového bloku, zatímco v další verzi je použit jako modul.

V praxi používám k aktualizaci většinou příkaz update. Pokud si však kompilátor stěžuje na chybějící soubory, zkusím checkout a soubory se většinou připojí.

Informační příkaz status

Zjišťovat jména větví nebo značek někde v dokumentaci je často nepraktické. Tuto informaci naštěstí můžeme získat i pomocí příkazu status.

Užitečná volba:

-v: Vypíše informace o značkách a větvích.

Vybereme si ve staženém pracovním adresáři Glib1 libovolný soubor a zadáme např.:

cvs status -v ChangeLog
===================================================================
File: ChangeLog         Status: Needs Patch


   Working revision:    1.257.2.98
   Repository revision: 1.257.2.105     /cvs/gnome/glib/ChangeLog,v
   Sticky Tag:          glib-1-2 (branch: 1.257.2)
   Sticky Date:         (none)
   Sticky Options:      (none)




   Existing Tags:
        glib-2-0                        (branch: 1.1085.2)
        glib-2-0-branchpoint            (revision: 1.1085)
        GLIB_2_0_1                      (revision: 1.1079)
        GLIB_2_0_0                      (revision: 1.1060)
        GLIB_2_0_0_RC1                  (revision: 1.1055)

A kdesi dole najdeme:

        GLIB_1_2_1                      (revision: 1.257.2.13)
        glib-1-2                        (branch: 1.257.2)
        GLIB_1_2_0                      (revision: 1.257)

Z vypsaných větví snadno odhadneme, která je ta správná.

Informační příkaz log

Dalším typem poskytovaných informací je seznam změn, provedených u daného souboru. Bývá detailnější než ChangeLog, neboť komentář je v podstatě povinný.

Zadáme:

cvs log configure.in

A dostaneme:

RCS file: /cvs/gnome/glib/configure.in,v
Working file: configure.in
head: 1.280
branch:
locks: strict
access list:
symbolic names:
        glib-2-0: 1.279.0.2
        glib-2-0-branchpoint: 1.279

Atd. Následuje výpis změn:

keyword substitution: kv
total revisions: 320;   selected revisions: 320
description:
----------------------------
revision 1.280
date: 2002/04/29 08:05:42;  author: pablo;  state: Exp;  lines: +1 -1
Added Vietnamese file
----------------------------
revision 1.279
date: 2002/04/07 23:09:08;  author: utx;  state: Exp;  lines: +1 -1
2002-04-08  Stanislav Brabec  <utx@penguin.cz>


        * cs.po: Added Czech (cs) to ALL_LINGUAS.
----------------------------

Atd. Jedná se o popis změn, provedených v kódu. Pokud by vám takový popis nestačil, můžete použít ještě detailnější rozpis pomocí příkazu annotate.

Informační příkaz checkout -c

Zmínili jsme se o tom, že existují moduly. Tento příkaz (nebo vlasně jen speciální volba) nám vypíše všechny moduly existující v repozitáři (pozor, nejde o výpis všech projektů, ale jen o moduly).

Zadáme příkaz (předpokládejme nastavenou proměnnou CVSROOT):

cvs checkout -c >gnome-modules.txt

Dostaneme dlouhý seznam a v něm i řádku:

glib         glib &build

Nyní již víme, že i Glib se při stahování z CVS sestavuje ze dvou modulů.

CVS a editované soubory

Tato funkce, díky které se může na práci podílet více lidí v jednom okamžiku, patří mezi nejdůležitější vlastnosti CVS.

Při aktualizaci textového souboru v pracovním adresáři se soubor nepřepíše, ale pomocí techniky, jakou používá příkaz diff, se provede pokus spojit data z repozitáře s naší úpravou. Někdy se to nepovede a pak je na nás, abychom vzniklé odmítnuté části záplaty (vyznačené řadou většítek a menšítek) zakomponovali do textu ručně, ale většinou dojde ke spojení změn bez problémů.

Pokud si soubor v pracovním adresáři pokazíme nevhodnou editací, můžeme jej jednodušše smazat a příkaz update nebo checkout jej obnoví v jeho nemodifikované podobě.

Zápisový příkaz commit

Tento příkaz slouží k odeslání změn z pracovního adresáře do repozitáře. K jeho spuštění samozřejmě potřebujeme právo zápisu do repozitáře.

Užitečná volba:

-m: Zpráva do protokolu, pokud ji nechceme zadávat v editoru (vhodné ve skriptech).

Zkratka: ci

Jak tedy pošleme změnu do repozitáře? Ukážeme si to názorně na jedné z posledních změn, kterou jsem provedl v repozitáři Glib2 – přidání českého překladu. Prosím, abyste tento příklad nezkoušeli v praxi! Jako anonymnímu uživateli vám nebude fungovat a se zápisovým právem byste mohli testovacími daty poškodit projekt.

Uložení českého překladu vyžaduje dvě změny v repozitáři – přidat nový soubor po/cs.po a do řádku ALL_LINGUAS v souboru configure.in přidat cs (zápis do ChangeLog považuji za samozřejmý).

Nejdříve si připravím aktuální pracovní adresář a provedu potřebné změny.

Pro další ukázky předpokládejme, že stojíme v hlavním adresáři projektu Glib2.

Nejdříve je třeba sdělit, že v repozitáři přibude nový soubor (k tomu slouží příkaz add):

cvs add po/cs.po

Nyní už zbývá změny poslat:

cvs commit

Naběhne editor a budeme vyzváni, abychom zapsali komentář ke změně. Zběžně přečteme řádky s komentářem, abychom si ověřili, že skutečně posíláme jen to, co chceme.

Opustíme editor a vyčkáme na výsledek – zprávu o číslech verzí, pod kterými byly naše úpravy zapsány.

Mohli jsme být i konkrétnější a napsat:

cvs commit po/cs.po configure.in ChangeLog

Ne vždy vše proběhne hladce. U často modifikovaných projektů může dojít k situaci, že zatímco jsme v pracovním adresáři prováděli změny, někdo jiný své změny uložil do repozitáře. V takovém případě server naše změny (ve všech souborech) odmítne s hláškou:

cvs commit: Up-to-date check failed for `ChangeLog'
cvs [commit aborted]: correct above errors first!

Znamená to, že musíme zaktualizovat soubor vůči nejnovějšímu stavu repozitáře. V (lepší) většině případů je řešení prosté:

cvs update

Opět můžeme adresně zaktualizovat jen vybrané soubory. Program nám oznámí výsledek spojení záplat – buď vše proběhlo v pořádku a my můžeme změny odeslat, nebo došlo k odmítnutí záplaty. Pak musíme provést opravu ručně, popřípadě soubor smazat, zopakovat update a změnu znovu provést do aktuální verze (záleží na tom, co je jednodušší). Poté můžeme přistoupit k dalšímu pokusu o odeslání změn.

bitcoin_skoleni

Pokud jsme přehlédli odmítnutou záplatu, server změny samozřejmě nepřijme a vyzve nás, abychom svou chybu napravili:

cvs commit: file `ChangeLog' had a conflict and has not been modified
cvs [commit aborted]: correct above errors first!

Po opravě odmítnuté záplaty můžeme pokračovat.

Autor článku