Używanie CVS z pakietami Debiana

Celem tego krótkiego dokumentu jest dostarczenie zwięzłej pomocy w konwersji pakietów, aby można było nimi zarządzać przy pomocy CVS. Przedstawione tutaj zagadnienia prawdopodobnie będą interesujące tylko dla nielicznej grupy osób, które nie są zaznajomione z CVS i zarządzaniem wersjami. Istnieje również skrypt w /usr/share/doc/cvs-buildpackage nazwany cvs-pkginit (zarówno skryp jak i podręcznik są spakowane), który wyświetla streszczenie tego dokumentu.

Na przykład, aby dokonać konwersji pakietu foo, wersja bar1, Debian rewizja 3, należy wykonać:

% cvs-pkginit foo bar1 3
i spojrzeć na streszczenie.
Oldenburg, 6/2/97                           Joey (joey@debian.org)
                                            / Martin Schulze   /
Mobile,                                     Manoj Srivastava
                                            srivasta@debian.org

Uwaga: w poniższym opisie wyrazy w nawiasach trójkątnych <> oznaczają miejsca, które muszą być zmieniane dla każdego przypadku, pozostałe opisy muszą być brane dosłownie. Przykładowo, mówiąc o pakiecie ze źródłem w wersji 2.1.82, <$version> oznacza 2.1.82, a upstream_version_<$version | tr . _> oznacza upstream_version_2_1_82.

  1. Konfiguracja CVS
       $ CVSROOT=/where/your/repository/will/be
       $ export CVSROOT
       $ cvs init
       $ mkdir $CVSROOT/debian
    

    Powyższa konfiguracja pozwala na oddzielenie pakietów Debiana od innych danych w repozytorium, zarówno obecnie jak i w przyszłości. Nawet jeśli teraz wydaje się, że nie będziemy potrzebować CVS, lepiej na początku określić repozytorium, niż żałować w przyszłości (późniejsze przenoszenie rzeczy w repozytorium to koszmar).

    Jeżeli z repozytorium będzie korzystało więcej osób, należy się upewnić czy będą oni mogli modyfikować zawartość repozytorium przy użyciu CVS. Należy wybrać grupę (lub zestaw grup), która ma dostęp do tej części repozytorium i ustawić odpowiednie uprawnienia:

       # chgrp <archive> $CVSROOT/debian
       # chmod g+ws    $CVSROOT/debian
    

    Daje do pewność, że członkowie grupy archive mogą skonfigurować repozytorium. Należy się jeszcze upewnić, że odpowiednie grupy ludzi mogą modyfikować odpowiednie części repozytorium.

       # mkdir $CVSROOT/debian/<package1>
       # chgrp <group1> $CVSROOT/debian/<package1>
       # chmod g+ws     $CVSROOT/debian/<package1>
       # mkdir $CVSROOT/debian/<package2>
       # chgrp <group2> $CVSROOT/debian/<package2>
       # chmod g+ws     $CVSROOT/debian/<package2>
    

    Jako zwykły użytkownik należy ustawić swoje repozytorium CVS jako publiczne przy użyciu "-d /where/your/repository/will/be" albo dodając następujący fragment do swojego profilu.

       $ CVSROOT=/where/your/repository/will/be
       $ export CVSROOT
    
  2. Używanie modułów
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    W poniższych poleceniach <package> oznacza nazwę pakietu taką, jaka jest w pliku debian/changelog.

    Należy dodać następujące linie, pierwsza jest niezbędna, druga może być powielana a jej znaczenie wynika z opisu:

       modules   CVSROOT modules
       <package> debian/<package>
    
       # cvs commit -m 'Define first modules'
    
  3. Przygotowania do korzystania z CVS

    Należy dołączyć gałąź ze źródłem przy użyciu poniższych poleceń (zakładamy że źródło jest już zdebianizowane i znajduje się w pliku orig.tar.gz). Należy pamiętać, aby zaimportować źródła z przełącznikiem -ko (take care of binary files) ale nie dokonywać w nich zmian. Ponadto numery epoch (numer przed dwukropkiem w numerze wersji pakietu, jeżeli nie podano przyjmowana jest wartość 0) są ignorowane podczas określania tagu CVS z nazwą (numery te są zazwyczaj stosowane do zmiany opinii dpkg na temat kolejności pakietu i na ogół nie są istotne dla tagów CVS).

    Należy przejść do katalogu, gdzie znajduje się rozpakowane, zdebianizowane, deweloperskie drzewo ze źródłami, które będzie dodane do CVS (zazwyczaj nie jest to katalog CVSROOT).

    POWTÓRZMY: Poniżej <package> oznacza nazwę pakietu zgodną z nazwą zapisaną w pliku debian/changelog.

       $ cd /where/your/source/tree/resides/
       $ tar zvfx <package>_<version>.orig.tar.gz
       $ cd <package>_<version>.orig
       $ cvs import -ko -m 'Import of bare source' debian/<package> source-dist upstream_version_<version|tr . _>
    

    Można zmienić tag gałęzi źródła na dowolny. (opiekun cvs-buildpackage zwykle używa tagu źródła (który jest analizowany w nadmiarze ;-))).

    Jeżeli CVS był ustawiany z poziomu konta root i nie został ustawiony zapis dla grupy, należy utworzyć $CVSROOT/debian/<package> jako root i zmienić w repozytorium ustawienia grupy lub użytkownika na odpowiednią grupę lub użytkownika. Podczas importu CVS wyświetli ostrzeżenie, że nie można utworzyć katalogu debian/<package>, ale jest to prawidłowe działanie.

    Następny krok to sprawdzenie całego drzewa i wdrożenie wszystkich zmian.

       $ cd /where/your/source/tree/will/reside
       $ cvs checkout <package>
    

    Jeżeli już utworzono zdebianizowaną wersją ale wcześniej nie używano CVS, może się przydać uruchomienie następujących poleceń aby wdrożyć wprowadzone zmiany. Po wykonaniu poleceń należy opisać to wydanie, aby w przyszłości można było sprawdzić co zostało zmienione.

       $ cd /where/your/source/tree/resides/<package>-<version>
       $ diff -qrBbw . /where/your/source/tree/will/reside/<package>/ | grep -v CVS
       $ FILES_CHANGED_LOCALLY="<output from above>"
       $ tar cf - $FILES_CHANGED_LOCALLY | tar -C /where/your/source/tree/will/reside/<package> -xvpf -
       $ cd /where/your/source/tree/will/reside/<package>
    

    Należy się upewnić, że plik debian/rules ma ustawiony atrybut wykonalności, ponieważ dzięki temu po eksporcie jest on plikiem wykonywalnym i nie będzie problemów z uruchomieniem dpkg-buildpackage na wyeksportowanym źródle. Ogólnie rzecz biorąc, przed dodaniem plików do repozytorium CVS, należy się upewnić że wszystkie mają ustawione odpowiednie prawa.

       $ cd /where/your/source/tree/will/reside/<package>
       $ cvs add debian <any other files added as well>
    

    Ponadto należy pamiętać, aby ręcznie dodać wszystkie dodatkowe pliki, które powinny być umieszczone w repozytorium, zwłaszcza wszystkie pliki w podkatalogu debian. Dodatkowo należy zauważyć, że polecenie add w cvs nie działa rekurencyjnie, dlatego należy ręcznie dodać wszystkie istniejące katalogi (cd debian; cvs add *)

    Fajną rzeczą jest, że uruchomione polecenie cvs update pokaże status wszystkich plików w katalogu.

       $ cd /where/your/source/tree/will/reside/<package>
       $ cvs update
    

    Wynik może wyglądać następująco:

           cvs update: Updating .
           M Makefile
           cvs update: Updating debian
           A rules
           ? example1
    
    M oznacza, że plik został zmodyfikowany (musi być wysłany). A oznacza plik Dodany (musi być wysłany). ? oznacza, że CVS nic nie wie o danym pliku (może musi być dodany?). Po upewnieniu się, że niczego nie brakuje i że wszystkie pliki mają ustawione odpowiednie uprawnienia, pliki są gotowe do wysłania.
       $ cd /where/your/source/tree/will/reside/<package>
       $ cvs commit -m 'Made all debian changes'
       $ cvs tag debian_version_<version|tr . _>-<debian-revision|tr . _> .
    

    Nowe drzewo źródła będzie znajdować się w katalogu, który nie zawiera numer wersji. Ale jako zobaczymy później, nie jest to problemem.

    Jeśli zamiast tego katalog debian będzie tworzony od zera (może to być prostsze, choć mniej zautomatyzowane) należy:

       $ mkdir debian
    

    Utworzyć wszystkie wymagane pliki debiana i dodać je do kontroli źródła.

       $ cvs add debian
       $ cd debian
       $ cvs add *
    

    Po tych poleceniach następne sprawdzenia będą obejmowały wszystkie pliki.

       $ cd /where/your/source/tree/will/reside/<package>
       $ cvs commit -m <some message>
    
  4. Przygotowanie wydania

    Zanim będzie można uruchomić niektóre polecenia Debiana, które zbudują pakiet, należy sprawdzić moduł bez podkatalogów CVS. Wykonuje się to poleceniem `export'. Przede wszystkim jednak należy sprawdzić wszystkie modyfikacje i oznaczyć je numerem wydania.

       $ cvs commit -m <message>
       $ cvs tag debian_version_<version|tr . _>-<debian-revision|tr . _>
    
  5. Utworzenie wydania

    Można użyć mechanizmu cvs-buildpackage (opcja preferowana) albo ręcznie wykonać export. Potem pierwszym krokiem powinno być przetestowanie materiału cvs-buildpackage na sucho (należy się upewnić, że tagi pasują) w następujący sposób (należy mieć skonfigurowany /etc/cvsdeb.conf):

       $ cvs-buildpackage -d -n -rsudo
    

    Następnie należy wykonać prawdziwe uruchomienie, pamiętając że program sudo może dać dostęp do uprawnień roota.

       $ cvs-buildpackage -rsudo
    

    Lub wykonać to ręcznie:

    Sprawdzenie pakietu.

       $ cvs export -d <package>-<version> -r debian_version_<version|tr . _>-<debian-revision|tr . _> <package>
    

    Teraz można przejść do normalnego mechanizmu eksportu wydania.


    Gotowe! Gratulacje! Oto kilka zadań, które można wykonać na drzewie ze źródłem:


  6. Usuwanie pliku lub zmiana nazwy

    Normalny sposób aby przenieść plik, to skopiowanie starego pliku (OLD) do nowego (NEW) a następnie wydać normalne polecenia CVS do usunięcia starego pliku (OLD) z repozytorium i dodania do niego nowego (NEW) (zarówno OLD jak i NEW powinny zawierać względną ścieżkę, np. `foo/bar.c').

       $ mv OLD NEW
       $ cvs remove OLD
       $ cvs add NEW
       $ cvs commit -m "Renamed OLD to NEW" OLD NEW
    

    To najprostszy sposób na przeniesienie pliku, nie jest podatny na błędy i zachowuje historię tego, co zostało zrobione. Należy podkreślić, że aby uzyskać dostęp do historii pliku należy określić starą lub nową nazwę, zależnie od tego do jakiej części historii chcemy mieć dostęp. Przykładowo, `cvs log OLD' zwraca log do czasu zmiany nazwy.

  7. Aktualizacja modułu poleceniem import

    Kiedy pojawi się nowa wersja źródła, należy ją zaimportować do repozytorium tym samym poleceniem `import', które było użyte do utworzenia repozytorium w pierwszym kroku. Jedyna różnica to taka, że należy ustawić inny tag dotyczący wydania oraz inną wiadomość.

       $ cd /where/your/source/tree/will/reside/<new source directory>
       $ cvs import -m 'Import new release' debian/<package> source-dist upstream_version_<version|tr . _>
    

    Teraz należy uwzględnić zmiany jakie zostały wprowadzone w nowej wersji. Najlepszy sposób, to przenieść kopię roboczą (opartą na starszej wersji źródła) i sprawdzić nową kopię pakietu zawierającą zmiany wprowadzone w kodzie źródłowym. Wykonuje się to następująco:

       $ cd /where/your/source/tree/will/reside
       $ mv <package> <package>.old
       $ cvs checkout -jsource-dist:yesterday -jsource-dist <package>
       $ cd /where/your/source/tree/will/reside/<package>
    

    Powyższe polecenie sprawdzi ostatnią rewizję <package>, dołączając do kopii roboczej zmiany wprowadzone od wczoraj na gałęzi dostawcy `source-dist'. Jeżeli podczas łączenia pojawią się jakiekolwiek konflikty, powinny one zostać rozwiązane w normalny sposób. Następnie zmodyfikowane pliki mogą być przesłane.

    Używając daty, jak sugerowano wcześniej, zakładamy, że nie będziemy importować więcej niż jedno wydanie produktu dziennie. Jeżeli jednak będzie taka konieczność, można użyć zamiast daty czegoś takiego:

       $ cvs checkout -jupstream_version_<oldversion|tr . _> -jupstream_version_<newversion|tr . _> <package>
    

    W tym przypadku, oba powyższe polecenia są równoważne.

    Dla plików, które nie zostały zmodyfikowane lokalnie, nowo utworzona rewizja staje się rewizją główną.

    Tak więc należy sprawdzić czy wszystkie pliki zostały prawidłowo zaktualizowane. W szczególności należy pamiętać, aby zmienić plik debian/changelog!

    Jeżeli wszystko jest w porządku, można usunąć starą wersję katalogu roboczego. Należy się upewnić, że usuwany jest właściwy katalog!

       $ rm -rf ../<package>.old
    

    Teraz można przygotować wydanie.

  8. Usuwanie drzewa źródłowego w celu zaoszczędzenia miejsca na dysku.

    Aby usunąć aktualne drzewo źródła zaleca się nie używać rm -rf tylko wykorzystać polecenie CVS, które dodatkowo sprawdzi, czy są jakieś lokalne zmiany, które jeszcze nie zostały wysłane.

       $ cd /where/your/source/tree/will/reside/
       $ cvs release -d <package>
    
  9. Słownik
       Tags		symboliczna nazwa wersji
       Repository	Archiwum z plikami źródłowymi
    
  10. Dodatek:

    A: KONWENCJE TAGÓW CVS

     |=======================================================================|
     |Wersja źródła        | <version>                                       |
     |Wersja w Debianie    | <revision>                                      |
     |Oryg.nazwa pliku tar | package_<version>.orig.tar.gz                   |
     |Nazwa pakietu Debiana| package_<version>-<revision>_<arch>.deb         |
     |Tag CVS Wydawcy      | upstream_version_<version  | tr . _>            |
     |Aktualny tag CVS     | debian_version_<revision | tr . _>              |
     |=======================================================================|
    

    Przykłady:

     |=======================================================================|
     |                     | upstream sources       | Debian only package    |
     |=======================================================================|
     |Wersja źródła        | 2.76                   | 3.38                   |
     |Wersja w Debianie    | 1.2                    |                        |
     |Oryg.nazwa pliku tar | make_2.76.orig.tar.gz  |                        |
     |Nazwa pakietu Debiana| make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb     |
     |Tag CVS Wydawcy      | upstream_version_2_76  | upstream_version_3_38  |
     |Aktualny tag CVS     | debian_version_2_76-1_2| debian_version_3_38    |
     |=======================================================================|
    

    Należy pamiętać, że numer epoch jest ignorowany podczas określania tagu CVS z nazwą (numery te są zazwyczaj stosowane do zmiany opinii dpkg na temat kolejności pakietu i na ogół nie są istotne dla tagów CVS).