\chapter{Работа със SVN}

FIXME: да се завърши

\section{Достъп до изходните кодове чрез SVN}


Естествено, трябва да имате инсталиран SVN.  Ако разполагате с Debian:

\begin{verbatim}
# apt-get install subversion
\end{verbatim}


За да изтеглите последните сорсове на книгата от CVS хранилището, изпълнете:

\begin{verbatim}
$ svn checkout http://svn.openfmi.net/debian-book-bg
\end{verbatim}

% $ -- затваряне на долара във verbatim

Тези, които имат желание да се включат в разработката на книгата и да
commit-ват в SVN-хранилището, трябва да имат и права за писане в проекта.
Авторите трябва да изтеглят книгата по следния начин:

\begin{verbatim}
$ svn checkout --username име https://svn.openfmi.net/debian-book-bg
\end{verbatim}

% $ -- затваряне на долара във verbatim

Където \emph{име} е Вашето потребителско име.

\section{Бързи инструкции за SVN}


Работата със SVN е подробно описана в документацията на 
\hlink{http://svnbook.red-bean.com}{http://svnbook.red-bean.com}. 
Ако не искате да се задълбочавате чак толкова, тук са представени
основните понятия и действия при работата със SVN. Имайте предивид, 
че командите много наподобяват на тези на CVS, така, че ще ви е лесно 
ако сте имали опит с тази система.

За да направите каквато и да е промяна, трябва да имате \emph{работно копие}
на книгата.  Преди всяка промяна синхронизирате работното копие със SVN-хранилището:

\begin{verbatim}
$ svn up
\end{verbatim}

% $ -- затваряне на долара във verbatim

Извършвате промяната и записвате промените и в SVN хранилището:

\begin{verbatim}
$ svn commit -m 'описание на промените' file1 path/to/file2
\end{verbatim}

% $ -- затваряне на долара във verbatim

\LaTeX~файловете се намират в директорията \texttt{src}.  Ако имената
на файловете не са достатъчни, за да ви орентират кой какво съдържа,
погледнете във файла \texttt{debian-book.tex}.


След като свършите с промените, трябва да се обнови и файла
\texttt{ChangeLog}.  Използвайте скрипта \texttt{changelog.up},
намиращ се в главната директория debian-book.  За да го използвате
обаче, трябва да имате инсталирани пакетите \deb{cvs2cl} и
\deb{txt2html}.

\subsection{Добавяне на файлове}

Добавянето на файлове се извършва посредством две стъпки: Първо
стартирате командата \texttt{add}, а след това -- \texttt{commit}.
Файлът няма да се появи в хранилището, докато не се изпълни
\texttt{commit}:

\begin{verbatim}
$ svn add newfile.c
$ svn ci -m "added newfile.c" newfile.c
\end{verbatim}

\subsection{Добавяне на директории}

За разлика от добавянето на файл, добавянето на нова директория се извършва
посредством една стъпка; не е нужно да изпълнявате commit след това:

\begin{verbatim}
$ mkdir subdir
$ svn add subdir
\end{verbatim}

\subsection{Премахване на файлове}

Премахването на файл е подобна на добавянето:

\begin{verbatim}
$ rm newfile.c
$ svn remove newfile.c
$ svn ci newfile.c

% $ -- затваряне на долара във verbatim

Забележете, че във втората и третата команда изрично именуваме \texttt{newfile.c},
въпреки че не съществува вече в работното копие. Разбира се, при commit
не е задължително да именувате файла, стига да нямате нищо против commit
да включи всички други промени, които са се състояли в работното копие.

\subsection{Премахване на директории}

SVN за разлика от CVS поддържа контрол на версиите (version control) на директории.
Директориите в SVN хренилището могат да бъдат трити, преименувани, копирани дори и 
рекурсивно:

\begin{verbatim}
$ cd dir
$ rm file1 file2 file3
$ svn remove file1 file2 file3
(output omitted)
$ svn ci -m "removed all files" file1 file2 file3
(output omitted)
\end{verbatim}

\subsection{Преименуване на файлове и директории}

Преименуването на файл е еквивалентно на създаването му под ново име и премахването 
му под старото. Под Unix командите са:

\begin{verbatim}
$ cp oldname newname
$ rm oldname
\end{verbatim}


Ето еквивалента при CVS:

\begin{verbatim}
$ mv oldname newname
$ cvs remove oldname
(output omitted)
$ cvs add newname
(output omitted)
$ cvs ci -m "renamed oldname to newname" oldname newname
(output omitted)
$
\end{verbatim}

% $ -- затваряне на долара във verbatim

Ето еквивалента при SVN:

\begin{verbatim}
$ svn move file1 file2
\end{verbatim}

% $ -- затваряне на долара във verbatim

SVN разполага с команди за copy, delete, move, за повече информация изпълнете:

\begin{verbatim}
$ svn help move
$ svn help copy
$ svn help delete
\end{verbatim}

% $ -- затваряне на долара във verbatim

Относно файловете - това е всичко. Преименуването на директории е аналогично. 

\subsection{SVN и бинарните файлове}

SVN управлява binary files доста по-интелигентно отколкото CVS прави това. 
Поради това, че CVS използва RCS, той може да съхранява успешно пълни копия на 
променения файл. Но вътрешно SVN прави разлика между файловете използвайки 
binary-differencing алгоритъм, независимо дали те съдържат текстови (textual) 
или двоични (binary) данни. Това означава, че всички файлове се съхраняват 
диференцирано (компресирани) в хранилището и малки разлики винаги се изпращат 
по мрежата (от клиента към сървъра).

При CVS двоични (binary) файлове трябва да се маркират с флаг \texttt{-kb} за да 
се предотврати модификацията върху тях. Обаче това понякога доста лесно за забравя.

SVN притежава по-параноичен подход: 

Първо, никога не изпълнява какъвто и да е вид keyword или line-ending translation 
докато изрично не му се укаже.

По подразбиране, SVN третира всички файлове като literal byte strings и файловете 
винаги се съхраняват в хранилището като untranslated state.

Второ, SVN поддържа вътрешно информацията дали файла е текстови или бинарен 
(text или binary data), но тази информация е налична само в работното копие. 
При изпълнение на \texttt{svn update}, SVN ще направи contextual merges върху 
модифицираните локално текстови файлове, но няма да се опита да направи това за 
двоичните файлове.

За да определи дали contextual merge е възможен, SVN изследва \texttt{svn:mime-type} 
информацията. Ако файла няма такава \texttt{svn:mime-type} или има \texttt{mime-type} 
който е текстови (например text/*), то се приема, че това е текст. В противен случай, 
се приема, че файла е двоичен (binary).

SVN също така използва binary-detection алгоритъм при \texttt{svn import} и  
\texttt{svn add} командите. Тези команди ще направят опит за правилно опознаване и 
евентуално ще поставят \texttt{svn:mime-type} за двоичен файл при добавянето на му. 
Ако SVN направи грешно разпознаване, то потребителя винаги може да премахне или постави 
сам тази информация.

\textbf{Преди да комитвате в SVN хранилището, проверявайте дали кодът се 
компилира при вас, винаги тествайте с PDF.}

