SAMOUCZEK CVS i WINCVS
Uwaga !!! Opis pierwotnie był pisany w latach 2003-2005 i obecnie powszechnie uważa się produkt CVS i WinCVS za nie zalecany do nowych projektów.
Wprowadzenie
O CVS
CVS jest programem do kontroli i zarządzania wersjami kodu źródłowego, rozpowszechnianym na zasadzie Open Source. Szczegóły można znaleźć na http://www.cvshome.org Dzięki swej otwartości CVS stał się standardem wśród szerokiej rzeszy programistów. Bardzo dobry opis podstaw CVS znajduje się na stronie http://bsd.amu.edu.pl/wyklady/cvs.html
Sam CVS jest programem działającym w trybie tekstowym, co czyni go mało przyjaznym w użyciu dla początkujących. W celu ułatwienia pracy powstało wiele narzędzi graficznych będących nakładkami dla trybu tekstowego. Przedstawione w tym dokumencie narzędzia to WinCVS działający w MS Windows, GnuCVS (gcvs) w Linux (równiez BigBoss) i Cervisia działająca na Linux KDE.
WinCVS można pobrać z http://www.wincvs.org/.
Należy zwrócić uwagę, że w WinCVS większości przycisków odpowiada stosowne wywołanie z linii poleceń klasycznego CVS. W każdym momencie pracy z WinCVS użytkownik może skorzystać z linii poleceń.
W pracy z CVS rozróżniamy dwa drzewa katalogów:
- składnicę (ang. repository)
- piaskownicę (ang. sandbox)
Piaskownica jest lokalną kopią plików na której pracujemy, tj. rozwijamy, kompilujemy itp. Dopiero kiedy stwierdzimy, że wprowadzone zmiany nas satysfakcjonują to zatwierdzamy wprowadzone zmiany do Składnicy.
Przygotowanie do pracy
Uruchomienie WinCVS
Po uruchomienie programu WinCVS powinno ukazać się okno jak na rys 2.1. W głównym oknie możemy wyróżnić kilka podokien:
1. struktura drzewa katalogów w pobranym ze składnicy modułu, 2. ścieżka dostępu do piaskownicy na lokalnym dysku, 3. uszczegółowiona struktura katalogów i plików, 4. podokno informacji i logów związanych z linią komend CVS.
W podoknie logów po uruchomieniu programu powinna pojawić się informacja o dostępnej wersji interpretera PYTHON. Zdarza sie, ze WinCVS nie wykrywa automatycznie lokalizacji interpretera. Należy wtedy ręcznie podać ścieżkę dostępu do dynamicznie ładowanej biblioteki, np. c:\winnt\system32\python24.dll. WinCVS -> Preference -> WinCvs -> Python DLL: Brak interpretera znacznie ogranicza pracę i funkcjonalność nakładki graficznej na CVS.

Przed pobraniem zawartości repozytorium należy odpowiednio skonfigurować program. W tym celu należy ustawić ścieżkę dostępu do lokalnej kopii plików - piaskownica, rys. 2.1, poz.2. Przykładowo na rysunku podano c:\piaskownica. Na komputerach w laboratorium dysk C jest niedostępny dla studentów. Należy wybrać dysk F.
3. Pobranie plików ze składnicy
Logowanie
Pierwszą czynnością w procesie pobrania zawartości repozytorium jest logowanie: WinCVS -> Admin -> Login ...
Wartość pola CVSROOT można wpisać samemu w oknie "Login settings" albo skorzystać z pomocy okna ustawień (rys 3.2) wywoływanego przez kliknięcie przycisku 1 (patrz rys. 3.1)

Preferowany jest bezpieczny i kodowany dostęp do serwera z wykorzystaniem protokołu SSH. Jako nazwę użytkownika należy podać nazwę podaną na zajęciach.

W celu pobrania nowego modułu wybieramy: WinCVS -> Remote -> Checkout
Powinno pojawić się okno 3.3. Wybieramy odpowiedni CVSROOT, sprawdzamy poprawność "Local folder to check to" wpisujemy nazwę żądanego modułu. Jeżeli nie pamiętamy dokładnej nazwy modułu to możemy wybrać przycisk "..." aby wyświetlić listę dostępnych modułów.

Wybranie modułu
Sprawdzamy poprawność CVSROOT. Ewentualnie odświeżamy zawartość przez przycisk "Refresh". Wybieramy moduł używany na laboratorium, np. aiskss_lab_XXXX, gdzie XXXX jest rokiem prowadzonych zajęć.

Wylogowanie
W przypadku pracy na komputerach uczelnianych ważne jest by po skończonej pracy wylogować się. Po wylogowaniu wymazywane jest hasło przechowywane na lokalnym komputerze.
4. Dodanie plików i katalogów
Po ściągnięciu modułu przy pomocy standardowych narzędzi systemowych (np. Explorer) tworzymy strukturę katalogów i plików w lokalnym komputerze. Umieszczenie nowych plików i katalogów w strukturze drzewa katalogów modułu nie jest jednoznaczne z kontrolą przez CVS. Aby katalog był pod kontrolą należy go wybrać (rys. 2.1 poz.1 i 3) i dodać przez: WinCVS -> Modify -> Add
Pliki tekstowe dodajemy tak samo jak katalogi. Pliki binarne przez: WinCVS -> Modify -> Add binary
Pliki tekstowe w standardzie UNICODE dodajemy przez: WinCVS -> Modify -> Add unicode


Samo dodanie plików do CVS nie jest jednoznaczne z wysłaniem ich na serwer. Jest to tylko informacja dla menadżera wersji o istnieniu pliku. Nowo dodany plik do CVS musimy zatwierdzić poleceniem "Commit": WinCVS -> Modify -> Commit
Pojawia się okienko "Commit settings", w którym należy wpisać stosowny do wprowadzonych zmian komentarz.

Katalogi nie są zatwierdzane tylko dodawane. Poprawnie zatwierdzenie pliku przedstawia rysunek poniżej. Nowo dodany plik dostał swoją wersje - kolumna "Rev.".

5. Uaktualnienie zawartości piaskownicy
W czasie gdy pracujemy na swojej lokalnej kopii plików inna osoba może zmodyfikować zawartość składnicy. Aby uaktualnić zawartość piaskownicy do najświeższej wersji należy wybrać: WinCVS -> Modify -> Update
6. Etykiety
Etykiety (ang. tag) są to nazwy nadawane strukturze katalogów i plików w danej wersji. Przykładowo skończyliśmy pewien etap rozwoju naszej aplikacji i chcemy ja przekazać do działu testowego. Pliki naszego modułu mają różne wersje. W celu późniejszej identyfikacji wersji poszczególnych plików przekazanych do testów warto nadać im wspólną nazwę właśnie przez utworzenie taga.
Utworzenie taga w module w składnicy
W celu utworzenia taga na module w składnicy postępujemy: WinCVS -> Remote -> Create a tag by module ...
Pojawia się okienko jak poniżej, wpisujemy nazwe nowego taga i wybieramy interesujący nas moduł

Utworzenie taga w piaskownicy
Chcąc utworzyć taga na lokalnej kopii plików w piaskownicy postępujemy: WinCVS -> Modyfi -> Create a tag ...

Tag tworzony na module dotyczy zawsze najświeższych plików przechowywanych w repozytorium dla danego modułu. Tag tworzony na lokalnej piaskownicy może dotyczyć indywidualnie dobranych wersji plików przez użytkownika.
Pobranie taga ze składnicy
Aby uaktualnić zawartość piaskownicy do wybranego taga należy wybrać: WinCVS -> Modify -> Update ... -> Update options
Zaznaczyć "By revision/tag/branch" i wpisać nazwę taga lub nacisnąć na przycisk "...". Patrz rysunek 6.3.

Wygląd składnicy po uaktualnieniu jej zawartości do żądanego taga przedstawiono na rys. 7.4. W kolumnie "Tag" znajduje się nazwa pobranego taga dla każdego pliku.

W celu powrotu do najświeższej zawartości CVS (oznaczonej również etykietą HEAD) należy zaznaczyć: WinCVS -> Modyfi -> Update ... -> Update options -> Reset any sticky tags/date/kopts
Graficzna ilustracja drzewa wersji
Dla każdego pliku można wyrysować graf reprezentujący rozwój drzewa wersji. W tym celu należy wybrać: WinCVS -> Query -> Graph ...

Przykładowa reprezentacja grafu dla pliku test.txt przedstawiona jest na rysunku poniżej.

7. Rozgałęzienia
Rozgałęzienia (ang. branch) są bardzo pomocne w trakcie rozwijania oprogramowania i innych dokumentów. Przykładowo znajdują zastosowanie w przypadku, gdy trzeba dokonać drobnych zmian w już dostarczonym klientowi wersji oprogramowania. A obecny etap rozwoju głównego nurtu (HEAD) nie jest jeszcze wystarczająco stabilny by można go było zastosować w systemie produkcyjnym.
Innym zastosowaniem rozgałęzienia jest chęć wprowadzenia nowego modułu (pomysłu) do aplikacji. Jednakże wprowadzenie nowego modułu do głównej wersji może spowodować destabilizację całej aplikacji, więc można go wprowadzić jako gałąź (tj. wersję alternatywną)
Podobnie jak etykietę, rozgałęzienie możemy utworzyć na dwa sposoby.
Rozgałęzienie w module
W celu stworzenia rozgalezienia na module postepujemy: WinCVS -> Remote -> Create a branch ...

Rozgałęzienie w lokalnej wersji składnicy
W celu stworzenia rozgałęzienia w lokalnej wersji składnicy postępujemy następująco: WinCVS -> Modify -> Create a branch ...

Pobranie rozgałęzienia
Rozgałęzienie pobieramy podobnie jak etykietę: WinCVS -> Modify -> Update ... -> Update options -> By revision/tag/branch:
Należy wpisać nazwę żądanego rozgałęzienia.
Po pobraniu żądanego rozgałęzienia jego nazwa powinna być widoczna obok nazwy pliku (patrz rys. 7.3).
Wprowadzenie i zatwierdzenie zmian w rozgałęzieniu
Przy wprowadzeniu zmian w rozgałęzieniu i zatwierdzaniu ich postępujemy tak samo jak przy pracy z bieżącą wersją.
Po zatwierdzeniu zmian w rozgałęzieniu do numeru wersji pliku np. 1.5 dopisywane są kolejne podnumery np. 1.5.2.1, patrz rys. 7.3.

Łączenie rozgałęzień i etykiet
Często zachodzi potrzeba połączenia dwóch gałęzi. Przykładowo, gdy rozwijana w rozgałęzieniu biblioteka okazała się dobrym pomysłem i pragniemy ją zintegrować z główna gałęzią.
1. Uaktualniamy zawartość piaskownicy do głównego rozgałęzienia 2. Wybieramy: WinCVS -> Modify -> Update ... -> Merge options Następnie interesujące nas rozgałęzienie.

Najlepszym rozwiązaniem dla łączenia gałęzi jest utworzyć tagi, między którymi będziemy wykonywać łączenie. Przy kolejnym łączeniu gałęzi należy dodać nowy tag i wykonać łączenie do poprzedniego taga. Sugeruje się by w nazwach taga dodać datę co ułatwi ich późniejszą identyfikację.
Szerzej zagadnienie łączenia rozgałęzień i wynikłych problemów jest opisane w A bit more CVS: an introduction to the use of branches.
Anulowanie wprowadzonych zmian
Zaznacz plik i wybierz:
WinCVS -> Modify -> Update -> Update settings -> Get the clean copy.

8. Zapytania
Wyświetlenie różnicy dwóch wersji
Chcąc wyświetlić różnicę dwóch wersji postępujemy następująco:.
WinCVS -> Query -> Diff

Możemy wybrać 3 opcje porównań:
* lokalna kopia w stosunku do tej samej wersji składnicy (ang. Local copy against the same remote revision), * lokalna kopia w stosunku do wybranej wersji w składnicy (ang. Local copy against another revision/tag/branch or date), * porównanie dwóch wersji przechowywanych w piaskownicy (ang. Two revision/tags/branches or dates against each other).
Wyświetlenie różnicy w oknie WinCVS przedstawia rysunek 8.3.
Domyślny program porównujący, tzw. "diff", można podmienić na inny w:
WinCVS -> Admin -> Preferences -> WinCVS
Graficzna wersja (WinDiff) prezentuje różnice w bardziej przyjazny sposób:

Log
Wyświetlenie listy zmian w poszczególnych wersjach zaznaczonego pliku dokonujemy przez: WinCVS -> Query -> Log...
Code listing 8.1
cvs log cvs-tutorial.xml (in directory C:\piaskownica\bigboss\Doc\www\proj\pl\devrel\handbook\)
***** CVS exited normally with code 0 *****
Rcs file : '/home/cvsroot/pl/edu/
/ia/BigBoss/Doc/www/proj/pl/devrel/handbook/cvs-tutorial.xml,v'
Working file : 'cvs-tutorial.xml'
Head revision : 1.8
Branch revision :
Locks : strict
Access :
Keyword substitution : 'kv'
Total revisions : 8
Selected revisions : 8
Description :
----------------------------
Revision : 1.8
Date : 2005/2/21 12:50:25
Author : 'mkl'
State : 'Exp'
Lines : +12 -13
Description :
Literówki i inne takie...
===============================================
9. Status
Podsumowanie wielu informacji na temat zaznaczonego pliku można uzyskać przez: WinCVS -> Query -> Status...
Poniżej przedstawiono przykładowy fragment statusu.
Code listing 9.1
cvs status -v test.txt (in directory C:\piaskownica_test\aiskss_lab_2005\)
===================================================================
File: test.txt Status: Up-to-date
Working revision: 1.6
Repository revision: 1.6 /home/cvsroot/pl/edu/
/ia/AiSKSS/lab_2005/test.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
relase_2102205 (revision: 1.6)
branch-josef-sp-zoo-20050213 (branch: 1.5.2)
release_20050213 (revision: 1.4)
***** CVS exited normally with code 0 *****
Pobranie nieistniejących w piaskownicy katalogów
Przykładowo katalog temp jest nowy w strukturze dlatego w CVS przy update trzeba zaznaczyć opcję odnoszącą się to utworzenia brakujących katalogów. Pierwszy raz jak pobieramy moduł do piaskownicy to używamy komendy "checkout", która domyślnie tworzy wszystkie podkatalogi dla danego modułu.
10. Dodatki
Zmiana CVSROOT na piaskownicy
Na laboratorium często zachodzi potrzeba zmiany właściciela ściągniętej piaskownicy. Aby tego dokonać musimy najpierw zaznaczyć nazwę modułu, Rys. 2.1/1. następnie postępujemy: WinCVS -> Macros -> CVS -> Change CVSROOT
Pojawia się okno z wartością CVSROOT poprzedniego właściciela piaskownicy. Naciskamy OK. W drugim oknie należny wpisać poprawna wartość CVSROOT dla nowego właściciela. Najczęściej jest to zmiana parametru username. Ponownie naciskamy OK.
11. Uwagi o systemach operacyjnych
- Ściągając z repozytorium pliki klientem WinCVS na platforme Unix (np. QNX) z udostępnioną piaskownicą po SAMBA należy włączyć opcje zmiany znaku końca wiersz w Remote->Checkout module->Globals->Checkout text files with the Unix LF(0xA)
12. O tym dokumencie
Powstanie
Dokument powstał na potrzeby wewnętrzne potrzeby.
Licencja
Dokument może być dowolnie dystrybuowany z podaniem jego autorów.
13. Literatura
1. N. Matthew, R. Stones "Zaawansowane programowanie w systemie Linux" 2. CVS Home 3. WinCVS

