Nowy system kontroli wersji oprogramowania Jacek Prucia jacek.prucia@7bulls.com http://www.7bulls.com/
Wprowadzenie System kontroli wersji w ogólności Antidotum na bałagan: *.old, *.old~, *.backup Największa popularność w systemie Linux: CVS (Concurrent Versions System) Przodkowie CVS a: RCS, SCCS Konkurencja CVS a: BitKeeper, Aegis Szerokie zastosowanie: repozytorium SourceForge.net 49.3 GB/16.04.2001 repozytorium RedHat ok. 7 GB Cichy monopol CVS
CVS upierdliwy dziadek CVS bardzo stary program (początki 1986 rok) Architektura klient serwer, a CVS Bezpieczeństwo (a raczej jego brak ;)) CVS development = dead horse Nieoficjalne łaty: cvs-nserver, cvsauth (sserver), cvsd, oraz cvs bookmarks patch Arogancja i lekcewaga (m.in. Greg A. Woods) lekarstwo licencja GPL. Problem na szerszą skalę (m.in. Accelerating Apache Project, Samba NTG)
Subversion światełko w tunelu Organizacja Tigris (powołana przez collab.net) Liczne projekty towarzyszące (m.in. ArgoUML) Licencja: Apache/BSD style Aktualny etap: Milestone 2 Milestone 3 = self-hosting (obecnie repozytorium CVS) Kolejny (po Apache 2.0) program korzystający z apr (Apache Portable Run-time)
Subversion ludzie Ben Collins-Sussman Project Owner Karl Fogel autor książki: Open Source Development with CVS http://cvsbook.red-bean.com Greg Stein członek Apache Software Foundation, autor mod dav a dla serwera Apache Subversion architektura
Subversion architektura Podstawa libsvn client (abstrakty commit(), update()) Operacje (commit, update) wymagają zarówno dostępu do kopi roboczej, jak i do repozytorium Kopia robocza (wc) biblioteka libsvn wc Dostęp do repozytorium (ra) biblioteki libsvn ra local, libsvn ra dav Nowa metoda dostępu do repozytorium = nowa biblioteka libsvn ra?
Subversion repozytorium Repozytorium: pseudo system plików oparty o BerkeleyDB v3.x Benefity: wydajność, właściwości (a la attr w XFS) Wady: nie można grzebać ręcznie w repozytorium, problemy z licencją (lamenty Eric S. Raymond a) Tworzenie repozytorium polecenie: svnadmin create /var/repos Pozostałe opcje svnadmin badanie wersji plików w repozytorium (youngest, lstxn, lsrevs)
Subversion serwer Serwer Subversion = Apache 2.0 + mod dav + mod dav svn Zalety stosowania serwera Apache 2.0: bezpieczne środowisko, jednolity system kontroli dostępu, różne mechanizmy za darmo (m.in. SSL/TLS) Architektura zezwala na inne rozwiązania (np.: svnd + libsvn ra svnd) Protokół WebDAV/DeltaV - nieco inny HTTP (inne metody np.: MKCOL, PROPFIND, PROPPATCH) Subversion obsługuje WebDAV/DeltaV poprzez bibliotekę neon (http://www.webdav.org/neon/).
Subversion mod dav svn Kompilacja: --with-apache, lub --with-apxs Przykład poprawnego wpisu: <Location /repozytorium> DAV svn SVNPath /var/repos </Location> Duża dowolność w lokalizacji repozytorium, brak standaryzacji Klient svn nie wspiera $CVSROOT/$SVNROOT ręczne wpisywanie lokalizacji do repozytorium
Zmiana nazwy pliku Subversion Features... cvs checkout foo.c -r 12.4 O jaki plik chodzi? wersji 12.4 bieżącego pliku foo.c (który kiedyś nazywał się bar.c) wersji 12.4 pliku który w tej wersji nosił nazwę foo.c (a teraz nie istnieje bo został usunięty w wersji np.: 10.7) Jeszcze nie zaimplementowane...
Subversion Features... Katalogi i rewizje cvs commit = zmiana wersji pliku svn commit = zmiana wersji *katalogu* Jeżeli cały katalog będzie w wersji 3, programista dokona poprawek w jednym pliku, a następnie wykona commit, to po wykonaniu checkout/update wszystkie pliki (a nie tylko poprawiany) w katalogu będą w wersji 4.
Właściwości Subversion Features... Właściwości (properties lists) key = value Wszechstronne zastosowanie (notatki własne, system Subversion) keyword expansion, mime-type = properties Dziedziczenie właściwości Manipulacja: svn propset typ dokumentacja README svn propget typ README svn proplist README
Text vs Binary cvs svn Subversion Features... default = text, chyba że -kb default = text, chyba że mime-type (właściwość) keyword substitution oraz line conversion scheme realizowane jako filtry, niezależne od sposobu transmisji text/binary keyword substitution oraz line conversion scheme są domyślnie wyłączone (nie są rozwijane słowa $Id$, nie ma zamiany CR na CRLF, itd.) Domyślne składowanie: Unix owy CR
Logi Subversion Features... Domyślne zachowanie pusty log message Modyfikacja: per projekt, lub -m "log message" Eleganckie rozwikłanie konfliktów cvs svn znaczniki konfliktu w oryginalnym pliku plik *.rej (np.: foo.c.8734xnis2989.rej)
Merge i przodkowie Subversion Features... Przodkowie foo.c w wersji 5 to prawdopodobnie: {foo.c:1, foo.c:2, foo.c:3, foo.c:4, foo.c:5}...lub prościej: {foo.c:1-5} Przodkowie merge a mogą wyglądać tak: {trunk/foo.c:1-8, branch/foo.c:3-7}
Subversion bezpieczeństwo Poziom 1: autoryzacja na podstawie user + pass (Apache + mod dav + ew. mod ssl) Poziom 2: czy użytkownik X może wykonać akcję Y na obiekcie Z? (mod svn dav + plugin security) Plik svn security mapowanie svn user user/protocol/domain definicja ról: rola lista dozwolonych operacji (commit, update, itp.) mapowanie ról na konkretnych svn user wobec podkatalogów repozytorium Katalog plugin security jest pusty...
Subversion katalog roboczy Katalog roboczy svn = SVN (analogicznie do cvs) Pliki: format, repository Lepiej przemyślany format pliku entries (XML) Pliki: dir-props oraz dir-props-base Katalogi: text-base oraz props, props-base Plik lock, oraz README (przestroga) Plik log (commit = transakcja) Katalog wcprops
Subversion Delta Delta: sposób opisu zmian (swojego rodzaju łata) text delta: <text-delta>dane</text-delta> property delta <property-delta> <set name= typ >dokumentacja</set> <delete name= test /> </property-delta>
tree delta: Subversion Delta <tree-delta> <replace name= dir1 > <directory> <tree-delta> <replace name= file1 > <file>text-delta</file> </replace> <delete name= file2 /> <add name= file3 > <file ancestor= /dir1/file2 /> </add> </tree-delta> </directory> </replace> </tree-delta>
tree delta: Subversion Delta <tree-delta>... <file> <text-delta-ref id= 123 / > </file>... </tree-delta> <text-delta id= 123 >dane</text-delta>
Garść linków... Subversion, http://subversion.tigris.org CVS, http://www.cvshome.org BitKeeper, http://www.bitkeeper.com Aegis, http://www.canb.auug.org.au/~millerp/aegis/ cvs-nserver, http://alexm.here.ru/cvs-nserver/ cvsauth, http://cvsauth.sourceforge.net/ cvsd, http://www.oinkzwurgl.org/software/cvsd/ CVS bookmarks patch, http://cvsbookmarks.sf.net CVS list patch, (w trakcie opracowywania...)
Podziękowania Firma 7bulls.com S.A. za wsparcie (sprzęt, czas), Martin Vogt (autor cvsauth) za informacje o projekcie Subversion, Programiści Subversion za informacje na temat bieżącego stanu projektu, Sjoerd Langkemper za pomoc w opracowywaniu cvsbookmarks, Juliusz Brzostek za prace włożone w cvs list patch, Żółw za to, że z wrodzonym sobie wdziękiem rozłożył w zaledwie 15 minut spore repozytorium CVS :)) Moja kobieta Dorota za anielską cierpliwość dla mojej pasji ;))
Pytania?