Menu

Dvanácté cvičení (10. 5.)

Materiály

  • getopts
  • xargs
  • eval (na tabuli)
  • diff a patch (na tabuli)
  • tar a komprese (na tabuli)

Příklad – verzovací systém

Napište jednoduchý verzovací systém. V systému bude zaindexován adresářový strom. Celý strom bude mít verzi, která se bude skládat ze dvou čísel – major a minor verze – oddelěných tečkou. Tedy např. verze 3.14. Vždy když na souborech provedeme nějaké úpravy, můžeme tyto změny uložit do nové verze – této akci budeme říkat commit.

Každý soubor ve stromě může být buď verzovaný, nebo ne. Defaultně nejsou verzované žádné soubory. Verzování souboru můžeme zapnout pomocí vs add soubor, vypnout pomocí vs del soubor (což ho ale fyzicky nesmaže, pouze přestane sledovat změny. vs add adresář zapne sledování pro všechny soubory v adresáři (a rekurzivně i v podadresářích).

Níže zmíněné příkazy chceme moci volat kdekoliv uvnitř verzovaného adresářového stromu. Pokud se nenacházíme uvnitř žádného takového stromu, vypíše program chybovou hlášku a skončí. Verzované stromy mohou být vnořené, ale příkazy se vždy aplikují pouze na ten nejvnitřnější.

Při volání vs init vytvořte kořen verzovaného stromu v aktuálním adresáři. Na začátku nejsou verzovány žádné soubory.

Při volání vs commit vytvořte novou minor verzi a uložte všechny změny provedené na souborech v adresářovém stromě.

Naopak budeme chtít umět i vyvolat starou verzi celého stromu, nebo jen jednoho souboru. K tomu bude sloužit příkaz vs checkout major.minor [soubor]. Pokud dostane název souboru, pak vrátí soubor do verze major.minor, pokud nedostane, vrátí do této verze celý adresářový strom. Přitom ale nesmí zahodit úpravy z novějších verzí. Voláním vs checkout vrátíme celý adresářový strom do nejnovější verze.

Voláním vs status vyvoláme vypsání informací o systému – především aktuální vezi a dále seznam souborů, na kterých byly provedeny změny, které ještě nebyly commitnuty.

Voláním vs levelup provedeme commit, při kterém se zvýší major verze a minor je vynulována.

Samozřejmě si neukládejte celé adresářové stromy, ani celé soubory v jednotlivých verzích. Pamatujte si pouze rozdíly mezi verzemi, které můžete zjistit třeba příkazem diff. Uplatňování změn vypsaných příkazem diff můžeme provést příkazem patch. Rozdíly mezi verzemi uchovávejte ve zkomprimované podobě.

Pro ty, co se ve verzovacích systémech trochu vyznají: historie je lineární a pouze lokální, nemusíte řešit branches, ani merge.