\documentclass[pdf]{prosper}
\usepackage[toc,highlight,clifford,notes,hlsections]{HA-prosper}

\usepackage{svn}
\SVNdate $Date: 2007-09-19 11:19:34 +0200 (Wed, 19 Sep 2007) $

\title{Advanced Subversion}
\subtitle{Subversion in der Praxis}
\author{Clifford Wolf\\
\institution{ROCK Linux - \href{http://www.rocklinux.org/}{http://www.rocklinux.org/}}\\
\institution{Csync2 - \href{http://oss.linbit.com/csync2/}{http://oss.linbit.com/csync2/}}\\
\institution{STFL - \href{http://www.clifford.at/stfl/}{http://www.clifford.at/stfl/}}\\
\institution{SPL - \href{http://www.clifford.at/spl/}{http://www.clifford.at/spl/}}}

\DefaultTransition{Wipe}
\TitleSlideNav{FullScreen}
\NormalSlideNav{ShowBookmarks}
\LeftFoot{\href{http://www.clifford.at}{Clifford Wolf}, \today}
\RightFoot{\href{http://www.clifford.at/}{http://www.clifford.at/}}

\begin{document}

\maketitle

% ============================================================================

\tsectionandpart{Einleitung}

\begin{slide}{Inhalt}
\begin{itemize}

\item Subversion Crashkurs 

\vspace*{0.5cm}

\item Branching und Merging

\vspace*{0.5cm}

\item Vendor Trees

\vspace*{0.5cm}

\item Diverse Utilities

\vspace*{0.5cm}

\item Projektorganisation

\vspace*{0.5cm}

\item Subversion 1.5 Features

\end{itemize}
\end{slide}


\begin{slide}{Nicht-Inhalt}
\begin{itemize}

\item Repository Administration

\vspace*{0.5cm}

\item Server side hooks

\vspace*{0.5cm}

\item Kommandoreferenz

\vspace*{0.5cm}

\item Livedemo (ausser wenn Zeit daf\"ur bleibt ;-)

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Crashkurs}

\begin{slide}{Repositorys}
\begin{itemize}

\item Repositoryverwaltung mit {\tt svnadmin}. \\
Hilfe mit: {\tt svnadmin help} bzw. {\tt svnadmin help \it kommando}

\vspace*{0.5cm}

\item Zugriff auf Repositorys mit URLs.

\vspace*{0.5cm}

\item Zugriffsmethoden auf Repositorys:
\begin{itemize}
\item HTTP (WebDAV/DeltaV) mit {\tt http://} bzw. {\tt https:// URLs (via Apache Modul)}
\item SVN-Protokoll mit {\tt svn://} URLs (via {\tt svnserv} Daemon)
\item SSH Tunnel mit {\tt svn+ssh:///} URLs
\item Local Filesystem mit {\tt file://} URLs
\end{itemize}

\vspace*{0.5cm}

\item SVN-Repositorys sind Netzwerk-Dateisysteme mit Versionierung.

\end{itemize}
\end{slide}


\begin{slide}{Repository Layout}
\begin{itemize}

\item Die allgemeine Empfehlung f\"ur den Verzeichnisbaum in einem Subversion
Repository:

\vspace*{0.5cm}

\item {\tt /trunk} \\
\hspace*{1cm}.. hier passiert die haupts\"achliche Entwicklung.

\vspace*{0.5cm}

\item {\tt /branches/{\it Branch-Name}} \\
\hspace*{1cm}.. hier liegen die aktuellen Branches.

\vspace*{0.5cm}

\item {\tt /tags/{\it Tag-Name}} \\
\hspace*{1cm}.. hier liegen die Tags.

\vspace*{0.5cm}

\item {\tt /vendor/{\it Vendor-Tree-Name}/{\it Vendor-Version}} \\
\hspace*{1cm}.. hier liegen die Vendor Trees.

\end{itemize}
\end{slide}


\begin{slide}{Working Copys}
\begin{itemize}

\item Checkout - Modify - Commit

\vspace*{0.5cm}

\item Arbeiten mit Repositorys:
\begin{itemize}
\item {\tt svn} command-line Tool
\item Diverse grafische Clients
\end{itemize}

\vspace*{0.5cm}

\item Hilfe mit: {\tt svn help} bzw. {\tt svn help \it kommando}

\vspace*{0.5cm}

\item Beispiel zum Erstellen einer Working-Copy: \\
{\tt svn co http://svn.clifford.at/tools/trunk clifford-tools}

\vspace*{0.5cm}

\item Updaten einer Working-Copy: {\tt svn up}

\end{itemize}
\end{slide}


\begin{slide}{Basic Operations}
\begin{itemize}

\item Dateien/Verzeichnisse hinzuf\"ugen: \\
{\tt svn add \it filename}

\vspace*{0.3cm}

\item Dateien/Verzeichnisse l\"oschen: \\
{\tt svn rm \it filename}

\vspace*{0.3cm}

\item Dateien/Verzeichnisse kopieren: \\
{\tt svn cp \it old-name new-name}

\vspace*{0.3cm}

\item Dateien/Verzeichnisse verschieben bzw. umbenennen: \\
{\tt svn mv \it old-name new-name}

\vspace*{0.3cm}

\item Dateien ver\"andern: \\
Kein eigenes Kommando notwendig.

\vspace*{0.3cm}

\item \"Anderungen zum Server schicken: \\
{\tt svn commit}

\end{itemize}
\end{slide}


\begin{slide}{Inspection}
\begin{itemize}

\item Infos zu alten Versionen: {\tt svn log}

\vspace*{0.5cm}

\item \"Anderungen zwischen Versionen anzeigen: \\
{\tt svn diff -r\it ALT\tt :\it NEU}

\vspace*{0.5cm}

\item \"Anderungen zwischen Repository und Working Copy: \\
{\tt svn diff}

\vspace*{0.5cm}

\item Differenzen zwischen zwei Directorys im Repository: \\
{\tt svn diff http://svnhost/prj/trunk/dir1 \\
\hspace*{1cm} http://svnhost/prj/trunk/dir2}

\vspace*{0.5cm}

\item Letzte \"Anderung zu jeder Zeile einer Datei: \\
{\tt svn blame \it filename}

\end{itemize}
\end{slide}


\begin{slide}{Branching and Merging}
\begin{itemize}

\item Branches werden mit einer Kopie erstellt. Zum Beispiel: \\
{\tt svn copy \it Source-URL Target-URL}

\vspace*{0.4cm}

\item \"Anderungen in einem Branch k\"onnen in eine Working-Copy eines anderen
Branches integriert werden: \\
{\tt svn merge -r 25:66 \it Source-URL \tt .}

\vspace*{0.4cm}

\item Eine Working-Copy kann mit dem Kommando {\tt svn switch} zwischen
Branches umgestellt werden: \\
{\tt svn switch \it URL \tt .}

\vspace*{0.4cm}

\item Weitere merge Features:
\begin{itemize}
\item R\"uckw\"arts (also z.Bsp. {\tt -r33:32}) mergen (aka revert)
\item Differenzen zwischen zwei Directorys in ein drittes
\end{itemize}

\vspace*{0.4cm}

\item F\"ur ein korrektes Merging muss \"uber die Revisions, die gebrancht werden, 
extra Buch gef\"uhrt werden.

\end{itemize}
\end{slide}


\begin{slide}{Properties}
\begin{itemize}

\item Properties sind Key-Value-Paare, die Dateien sowie Revisions zugeordnet
werden.

\vspace*{0.5cm}

\item Beispiel einer Property auf eine Datei: \\
{\tt mime-type} .. Dateityp

\vspace*{0.5cm}

\item Beispiel einer Property auf eine Revision: \\
{\tt svn:author} .. Autorin der Revision

\vspace*{0.5cm}

\item Befehle zum Arbeiten mit Properties: \\
{\tt svn pl}, {\tt svn pg}, {\tt svn ps}, {\tt svn pe}, {\tt svn pd}

\end{itemize}
\end{slide}


\begin{slide}{Konflikte}
\begin{itemize}

\item Wenn mehrere Anwenderinnen und Anwender parallel Dateien \"andern, kann es zu Konflikten kommen.

\vspace*{0.5cm}

\item Diese Konflikte werden beim Ausf\"uhren von {\tt svn up} erkannt.

\vspace*{0.5cm}

\item .. und m\"ussen h\"andisch aufgel\"ost werden.

\vspace*{0.5cm}

\item Nach dem Aufl\"osen eines Konfliktes: \\
{\tt svn resolved \it filename}

\end{itemize}
\end{slide}


\begin{slide}{Bin\"ardateien}
\begin{itemize}

\item Bei Bin\"ardateien kann das Aufl\"osen von Konflikten unm\"oglich werden.

\vspace*{0.5cm}

\item Deshalb m\"ussen Bin\"ardateien vor dem Editieren gesperrt werden: \\
{\tt svn lock \it filename}, {\tt svn unlock \it filename}

\vspace*{0.5cm}

\item Dateien mit der {\tt svn:needs-lock} Property sind read-only, wenn sie
nicht gerade gelocked sind.

\end{itemize}
\end{slide}


\begin{slide}{Mixed Checkouts}
\begin{itemize}

\item Mit {\tt svn switch} k\"onnen auch Teile einer Working-Copy auf andere
Repository-Pfade umgestellt werden.

\vspace*{0.5cm}

\item Mit {\tt svn up} k\"onnen auch Teile einer Working-Copy auf beliebige
Revisions gestellt werden.

\vspace*{0.5cm}

\item Eine Anwendung f\"ur Mixed Checkouts ist das Bisecting von Fehlern.

\end{itemize}
\end{slide}


\begin{slide}{Peg-Revisions}
\begin{itemize}

\item Inhalt der README Datei in Revision 25: \\
{\tt svn cat -r 23 http://svnhost/prj/trunk/README}

\vspace*{0.5cm}

\item Inhalt jener Datei, die bei Revision 25 den Namen REDME hatte, in Revision 25: \\
{\tt svn cat http://svnhost/prj/trunk/README@25}

\vspace*{0.5cm}

\item Implizite Default Peg-Revisions:
\begin{itemize}
\item F\"ur Working-Copys: {\tt BASE}
\item F\"ur direkten Repository-Zugriff: {\tt HEAD}
\end{itemize}

\end{itemize}
\end{slide}


\begin{slide}{WC-zu-Repository Kopien}
\begin{itemize}

\item Commit mit gleichzeitigem Branch/Tag: \\
{\tt svn cp . http://svnhost/prj/branches/newbranch}

\vspace*{0.5cm}

\item Speziell f\"ur Tags sehr wichtig.

\end{itemize}
\end{slide}


% ============================================================================

\tsectionandpart{Branching and Merging}


\begin{slide}{svnbranch}
\begin{itemize}

\item {\tt svnbranch} ist ein Shellscript zum Verwalten von Branches. \\
\hspace*{0.5cm} {\tt http://svn.clifford.at/tools/trunk/svnbranch.sh}

\vspace*{0.5cm}

\item Hilfetext: {\tt svnbranch help}

\vspace*{0.5cm}

\item In einem Branch werden in der Subversion Property {\tt svnbranch:parent}
das Directory und die Revision, von der gebrancht wurde, gespeichert.

\vspace*{0.5cm}

\item {\tt svnbranch} unterst\"utzt beim Branchen, Taggen, Mergen,
Synchronisieren und Analysieren von Branches und Tags.

\end{itemize}
\end{slide}


\begin{slide}{svnbranch show}
\includegraphics[scale=0.5]{svnbranch.ps}
\end{slide}


\begin{slide}{svnbranch branch}
\begin{itemize}

\item Erzeugt einen neuen Branch.

\vspace*{0.5cm}

\item Wird in einer Working-Copy des Directorys gestartet, das gebrancht
werden soll: \\
\vspace*{0.2cm}
{\tt svnbranch branch \it Target-URL}

\vspace*{0.5cm}

\item Erzeugt eine Kopie ({\tt svn cp})
\item Setzt die Property {\tt svnbranch:parent} ({\tt svn ps})
\item L\"oscht die Property {\tt svnbranch:tag} ({\tt svn pd})

\end{itemize}
\end{slide}


\begin{slide}{svnbranch tag}
\begin{itemize}

\item Wird in einer Working-Copy des Directorys gestartet, das getaggt
werden soll. \\
\vspace*{0.2cm}
{\tt svnbranch tag \it Target-URL}

\vspace*{0.5cm}

\item Erzeugt eine Kopie ({\tt svn cp})
\item Setzt die Property {\tt svnbranch:parent} ({\tt svn ps})
\item Setzt die Property {\tt svnbranch:tag} ({\tt svn pd})

\vspace*{0.5cm}

\item Bei Tags werden \"Anderungen im Parent nicht synchronisiert.

\end{itemize}
\end{slide}


\begin{slide}{svnbranch sync}
\begin{itemize}

\item Wird in einer Working-Copy eines Branches gestartet.
\vspace*{0.2cm}
\item \"Ubernimmt \"Anderungen im Parent seit dem Brachen / letzten Syncen in den
Branch. \\
\vspace*{0.2cm}
{\tt svnbranch sync} \\
{\tt svnbranch commit}

\vspace*{0.5cm}

\item Mergt die \"Anderungen vom Parent ({\tt svn merge})
\item Aktualisiert die Property {\tt svnbranch:parent} ({\tt svn ps})

\end{itemize}
\end{slide}


\begin{slide}{svnbranch sync URL}
\begin{itemize}

\item Wird in einer Working-Copy eines Branches gestartet.
\vspace*{0.2cm}
\item Stellt einen Branch auf einen Parent um.
\vspace*{0.2cm}
\item Die Differenzen zwischen altem und neuem Parent werden gemergt. \\
\vspace*{0.2cm}
{\tt svnbranch sync URL} \\
{\tt svnbranch commit}

\vspace*{0.5cm}

\item Mergt die \"Anderungen von altem zu neuem Parent ({\tt svn merge})
\item Aktualisiert die Property {\tt svnbranch:parent} ({\tt svn ps})

\end{itemize}
\end{slide}


\begin{slide}{svnbranch propagate}
\begin{itemize}

\item Wird in der Working-Copy eines Parents gestartet.
\vspace*{0.2cm}
\item Erzeugt ein Shell-Script {\tt propagate.sh}.
\vspace*{0.2cm}
\item Dieses Script synchronisiert rekursiv alle Branches des Parents. \\
\vspace*{0.2cm}
{\tt svnbranch propagate} \\
{\tt vi propagate.sh} \\
{\tt sh propagate.sh}

\vspace*{0.5cm}

\item Bei Konflikten wird automatisch angehalten, damit die Anwenderin den
Konflikt aufl\"osen und anschliessend committen kann.
\vspace*{0.2cm}
\item Ein neuerlicher Start von {\tt propagate.sh} setzt den Prozess an jenem
Punkt fort, an dem angehalten wurde.

\end{itemize}
\end{slide}


\begin{slide}{svnbranch merge URL}
\begin{itemize}

\item Wird in der Working-Copy eines Parents gestartet.
\vspace*{0.2cm}
\item Mergt \"Anderungen im angegebenen Branch in den Parent. \\
\vspace*{0.2cm}
{\tt svnbranch merge \it Branch-URL} \\
{\tt svn commit}

\end{itemize}
\end{slide}


\begin{slide}{svnbranch diff}
\begin{itemize}

\item Wird in einer Working-Copy eines Branches gestartet.
\vspace*{0.2cm}
\item Zeigt die \"Anderungen zum Parent an. \\
\vspace*{0.2cm}
{\tt svnbranch diff}

\vspace*{0.5cm}

\item Die angezeigten \"Anderungen beziehen sich auf jene Version des Parents die
gebrancht bzw. zuletzt gesynced wurde.

\end{itemize}
\end{slide}


\begin{slide}{svnbranch list/graph/show}
\begin{itemize}

\item Zeigt die Struktur der Branches an. \\
\vspace*{0.2cm}
{\tt svnbranch show \it Basis-URL}

\vspace*{0.5cm}

\item Um alle Branches finden zu k\"onnen ben\"otigt dieses Kommando die Property
{\tt svnbranch:index} im Root-Directory des Repositorys. Zum Beispiel: \\

\vspace*{0.2cm}

\begin{verbatim}
# svn pg svnbranch:index http://svnhost/prj
tags/*
branches/*
\end{verbatim}

\vspace*{0.5cm}

\item Betriebsmodi:
\begin{itemize}
\item {\tt svnbranch list}: ASCII Ausgabe
\item {\tt svnbranch graph}: Erstellt .dot und .ps Dateien
\item {\tt svnbranch show}: Zeigt Graphen mit kghostview an
\end{itemize}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Vendor Branches}

\begin{slide}{Worum es geht}
\begin{itemize}

\item Man m\"ochte externe Sourcen (z.Bsp. eine Library) ins eigene Projekte integrieren.

\vspace*{0.5cm}

\item Man m\"ochte in dieser Library \"Anderungen vornehmen.

\vspace*{0.5cm}

\item Gleichzeitig m\"ochte man den neuen Versionen der Library folgen.

\end{itemize}
\end{slide}


\begin{slide}{Wie es gemacht wird}
\begin{itemize}

\item Dazu importiert man die Library in ein eigenes Verzeichnis. \\
Zum Beispiel: {\tt /vendor/foolib/foolib-1.0}

\vspace*{0.5cm}

\item Dieses Verzeichnis brancht man in das eigene Projekt hinein. \\
Zum Beispiel: {\tt /trunk/foolib}

\vspace*{0.5cm}

\item Neue Versionen der Library bekommen jeweils ein eigenes Verzeichnis. \\
Zum Beispiel: {\tt /vendor/foolib/foolib-1.1}

\vspace*{0.5cm}

\item Die \"Anderungen zwischen diesen Verzeichnissen k\"onnen in den eigenen
Branch hineingemergt werden.

\end{itemize}
\end{slide}


\begin{slide}{svnemboss}
\begin{itemize}

\item Neue Versionen des Vendor Trees m\"ussen mit der alten "verwandt" sein.

\vspace*{0.4cm}

\item Sonst besteht die Differenz zwischen den beiden Trees aus deletes der
alten und adds der neuen Dateien. Und das l\"asst sich nicht mit lokalen
\"Anderungen mergen.

\vspace*{0.4cm}

\item Das Tool svnemboss ist hilfreich, um \"Anderungen im upstream Vendor Tree
im lokalen Subversion abzubilden. \\

\vspace*{0.4cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svnemboss.sh}

\vspace*{0.4cm}

\item Mit {\tt svnemboss} ist es m\"oglich, in einer Subversion Working-Copy
alle \"Anderungen vorzunehmen, sodass sie einem angegebenen Directory
entspricht: \\
{\tt svnemboss \it Master-Path WC-Path} \\
{\tt svn commit \it WC-Path}

\end{itemize}
\end{slide}


\begin{slide}{Beispiel: Neuer Vendor Branch}

\begin{verbatim}
$ svn import ~/foolib-1.0-orig-src \
    http://svnhost/prj/vendor/foolib/foolib-1.0

$ svn co http://svnhost/prj/vendor/foolib/foolib-1.0 \
    foolib-wc
$ cd foolib-wc

$ svnbranch branch http://svnhost/prj/trunk/foolib

$ svn switch http://svnhost/prj/trunk/foolib

<local changes>
$ svn commit
\end{verbatim}

\end{slide}


\begin{slide}{Beispiel: Vendor Branch updaten}

\begin{verbatim}
$ svn co http://svnhost/prj/vendor/foolib/foolib-1.0 \
    foolib-wc
$ cd foolib-wc

$ svnbranch branch \
    http://svnhost/prj/vendor/foolib/foolib-1.1

$ svn switch \
    http://svnhost/prj/vendor/foolib/foolib-1.1

$ svnemboss ~/foolib-1.1-orig-src .
$ svn commit

$ svn switch http://svnhost/prj/trunk/foolib

$ svnbranch sync \
    http://svnhost/prj/vendor/foolib/foolib-1.1
$ svn commit
\end{verbatim}

\end{slide}


\begin{slide}{Patch Stacks (1/2)}
\begin{itemize}

\item Manchmal hat man zus\"atzlich zum Vendor Tree noch weitere 3rd-Party
Patches.

\vspace*{0.5cm}

\item Diese m\"ochte man in der Regel voneinander, von den original Sourcen und
von den eigenen \"Anderungen getrennt halten.

\vspace*{0.5cm}

\item Das geht einfach, indem man Branches von Branches macht. Jeder Patch hat
dann seinen eigenen Branch, wobei die eigenen \"Anderungen im letzten dieser
Branches liegen.

\vspace*{0.5cm}

\item Da {\tt svnbranch sync} das Wechseln der Parent-URL erlaubt, k\"onnen
Patches beliebig hinzugef\"ugt, entfernt oder ausgetauscht werden.

\end{itemize}
\end{slide}

\begin{slide}{Patch Stacks (2/2)}
\begin{itemize}

\item Beispielstack:
\begin{verbatim}
/vendor/linux-kernel/linux-2.6.24.4
/vendor/linux-kernel-patches/denx-eldk-4.1
/vendor/linux-kernel-patches/xilinxfb
/vendor/linux-kernel-patches/unionfs-2.3.2
/vendor/linux-kernel-patches/dmatransfer
/trunk/linux-kernel-source
\end{verbatim}

\vspace*{0.5cm}

\item Man kann auch die Subversion Merge-Features benutzen, um Patches f\"ur
unterschiedliche Versionen des Vendor Trees auf eine gemeinsame Version zu
bringen.

\vspace*{0.5cm}

\item Ebenso kann man die Subversion Merge-Features benutzen, um Konflikte
zwischen den Patches aufzul\"osen.

\end{itemize}
\end{slide}


\begin{slide}{svn:externals}
\begin{itemize}

\item Externe Sourcen, die nicht lokal ver\"andert werden sollen, k\"onnen
mittels {\tt svn:externals} Property eingebunden werden.

\vspace*{0.2cm}

\item Die {\tt svn:externals} Property wird auf das \"ubergeordnete Directory
gesetzt. Also z.Bsp. auf {\tt /trunk} f\"ur {\tt /trunk/foolib}.

\vspace*{0.2cm}

\item Solche Externals werden automatisch von der Originalquelle ausgecheckt
({\tt svn co}) und geupdated ({\tt svn up}).

\vspace*{0.2cm}

\item Commits gehen nicht automatisch in die external-Verzeichnisse.

\vspace*{0.2cm}

\item Beispiel:
\begin{verbatim}
$ svn pg svn:externals http://svnhost/prj/trunk
foolib       http://host1/foolib/tags/foolib-1.1
barlib -r531 http://host2/barlib/trunk
\end{verbatim}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Utilities}

\begin{slide}{svncache (1/2)}
\begin{itemize}

\item Bei grossen Projekten (z.Bsp. linux kernel, gcc, firefox) k\"onnen
Operationen im Repository recht langsam werden.

\vspace*{0.5cm}

\item Klassisches Beispiel: Diff zwischen zwei Branches.

\vspace*{0.5cm}

\item Mit {\tt svncache.sh} k\"onnen read-only Operationen \"uber einen lokalen
Mirror durchgef\"uhrt werden.

\vspace*{0.5cm}

\item {\tt svncache} benutzt als Backend das {\tt svnsync} Tool aus dem
Subversion Paket.

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svncache.sh}

\end{itemize}
\end{slide}

\begin{slide}{svncache (2/2)}
\begin{verbatim}
$ svnadmin create file:///data/svncache/clifford-tools

$ ln -s /bin/true \
    /data/svncache/clifford-tools/hooks/pre-revprop-change

$ svnsync init file:///data/svncache/clifford-tools \
    http://svn.clifford.at/tools

$ echo http://svn.clifford.at/tools \
    file:///data/svncache/clifford-tools \
    >> /etc/svnchache

$ svncache sync


<cd to a http://svn.clifford.at/tools wc>

$ svncache log -v -r300:600
\end{verbatim}
\end{slide}


\begin{slide}{svnfind}
\begin{itemize}

\item {\tt svnfind} ist ein Wrapper um {\tt find}, der alle {\tt .svn}
Directorys ignoriert.

\vspace*{0.5cm}

\item Beispiel: \\
\begin{verbatim}
svnfind . -type f -exec file '{}' \;
\end{verbatim}

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svnfind.sh}

\end{itemize}
\end{slide}


\begin{slide}{svngrep}
\begin{itemize}

\item {\tt svngrep} ist ein Wrapper um {\tt grep}, der alle {\tt .svn}
Directorys ignoriert.

\vspace*{0.5cm}

\item Beispiel: \\
\begin{verbatim}
svngrep -ri copyright .
\end{verbatim}

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svngrep.sh}

\vspace*{1.5cm}

\item {\tt svngrep} ben\"otigt grep in der Version 2.5.2 oder h\"oher, oder
alternativ folgenden Patch applied:

\vspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/patches/}
\hspace*{0.2cm}{\tt grep-2.5.1a-excl-dir.patch}

\end{itemize}
\end{slide}


\begin{slide}{svnlist}
\begin{itemize}

\item {\tt svnlist} erzeugt eine Liste aller unter der Kontrolle von Subversion stehenden Dateien im Arbeitsverzeichnis.

\vspace*{0.5cm}

\item In einer frischen Working-Copy entspricht das der Ausgabe von
{\tt svnfind -type f}.

\vspace*{0.5cm}

\item Anwendungsbeispiel: Automatisches Generieren von Makefile Dependencies.

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svnlist.sh}

\end{itemize}
\end{slide}


\begin{slide}{svnignore}
\begin{itemize}

\item Hilft beim Verwalten der {\tt svn:ignore} Propertys.

\vspace*{0.5cm}

\item Anwendungsbeispiel zum Ignorieren einzelner Dateien:
\begin{verbatim}
svnignore add foolib/foolib.so
svnignore del foolib/foolib.so
\end{verbatim}

\vspace*{0.5cm}

\item Anwendungsbeispiel zum Ignorieren ganzer Muster:
\begin{verbatim}
svnignore radd 'linux-kernel-source/*.ko'
svnignore rdel 'linux-kernel-source/*.ko'
\end{verbatim}

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svnignore.sh}

\end{itemize}
\end{slide}


\begin{slide}{svnpurge}
\begin{itemize}

\item Macht alle lokalen \"Anderungen in der Working-Copy r\"uckg\"angig und
l\"oscht alle Dateien, die nicht unter der Kontrolle von Subversion stehen.

\vspace*{0.5cm}

\item {\bf ACHTUNG:} Mit diesem Tool kann man sich auch leicht ins eigene Knie
schiessen!

\vspace*{0.5cm}

\item Anwendungsbeispiel: Besonders effektiver Ersatz f\"ur {\tt make distclean}.

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svn.clifford.at/tools/trunk/svnpurge.sh}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Projektorganisation}

\begin{slide}{Warum Subversion?}
\begin{itemize}

\item Es entspricht dem bekannten Konzept eines hierarchischen Dateisystems.

\vspace*{0.5cm}

\item Es gibt gute grafische Clients und gute IDE-Integration.

\vspace*{0.5cm}

\item Durch den zentralen Ansatz ist es leicht in Backup-Systeme zu
integrieren.

\vspace*{0.5cm}

\item Es gibt ausreichend einsteigerfreundliche Literatur.

\end{itemize}
\end{slide}


\begin{slide}{Subversion Manager}
\begin{itemize}

\item Es hat sich bew\"ahrt eine Verantwortliche f\"ur Subversion zu bestimmen.

\vspace*{0.5cm}

\item Diese Person sollte ausreichend Zeit haben um sich mit den Subversion-spezifischen Problemen im Projekt eingehend zu besch\"aftigen.

\vspace*{0.5cm}

\item Ausserdem sollte diese Person regelm\"assige Commits einfordern und
Changelogs, etc. reviewen. \\
(Das Problem Nummer 1 in der Praxis ist, dass Leute einfach nicht comitten!)

\vspace*{0.5cm}

\item Komplexere Aufgaben (Vendor Branches, etc.) k\"onnen an den Subversion
Manager deligiert werden.

\end{itemize}
\end{slide}


\begin{slide}{Weitere Tipps}
\begin{itemize}

\item Wer sich bei einer Operation unsicher ist, kann mit {\tt svnsync} eine
Replik des Repositorys anlegen um zu testen.

\vspace*{1cm}

\item Manchmal ist es sinnvoll, einfach Checkout auf einem Fileserver liegen
zu haben und dort regelm\"assig per Cron-Job automatisch zu comitten.

\vspace*{0.3cm}

\item .. speziell in Umgebungen mit Nicht-Programmiererinnen ist das schmerzfreier
als den Umgang mit Subversion zu vermitteln.

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Seitenblicke}

\begin{slide}{Svnmerge.py}
\begin{itemize}

\item {\tt Svnmerge.py} ist ein Konkurrent zu meinem {\tt svnbranch} Tool.

\vspace*{0.5cm}

\item {\tt Svnmerge.py} konzentriert sich auf das reine Merge-Tracking. Es ist
z.Bsp. nicht m\"oglich den Branch-Graphen zu ver\"andern. Damit sind z.Bsp.
Patch-Stacks nur sehr schwer zu realisieren.

\vspace*{0.5cm}

\item Daf\"ur unterst\"utzt {\tt Svnmerge.py} z.Bsp. von selbst das Blocken
einzelner Revisions f\"ur Merges.

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://www.orcaware.com/svn/wiki/Svnmerge.py}

\end{itemize}
\end{slide}


\begin{slide}{svn\_load\_dirs.pl}
\begin{itemize}

\item {\tt svn\_load\_dirs.pl} ist ein Helper Script das mit Subversion
mitgeliefert wird.

\vspace*{0.5cm}

\item Das Script erleichtert das Verwalten von Vendor Trees, k\"ummert sich aber
nicht um die Synchonisation mit den localen Branches.

\vspace*{0.5cm}

\item Es operiert direkt mit dem Repository und committet daher automatisch 
alles was es tut.

\vspace*{0.5cm}

\item {\tt svn\_load\_dirs.pl} ist voll kompatibel mit {\tt svnbranch}, ersetzt
aber {\tt svnemboss} f\"ur den Einsatz bei Vendor Trees.

\end{itemize}
\end{slide}


\begin{slide}{svm}
\begin{itemize}

\item {\tt svm} erlaubt es ein Directory von einem Repository vollst\"andig (also
inclusive History!) in ein Directory in einem anderen Repository zu
replizieren.

\vspace*{0.5cm}

\item Auf diese Weise lassen sich z.Bsp. Vendor Trees mit der vollst\"andigen
Geschichte aus dem original Repository erzeugen.

\vspace*{0.5cm}

\item {\tt svm} erlaubt ebenfalls ein Mergeback von \"Anderungen im neuen Repository in
das urspr\"ungliche Repository.

\vspace*{0.5cm}

\item {\tt svm} ist Teil des {\tt SVN::Mirror} Perl Moduls.

\end{itemize}
\end{slide}


\begin{slide}{svk}
\begin{itemize}

\item {\tt svk} ist ein Tool zur dezentralen Versionsverwaltung.

\vspace*{0.5cm}

\item {\tt svk} verwendet Subversion und {\tt svm} als Basis.

\vspace*{0.5cm}
\hspace*{0.2cm}
{\tt http://svk.elixus.org/}

\end{itemize}
\end{slide}


\begin{slide}{SubMaster}
\begin{itemize}

\item SubMaster ist ein Tool zur {\it verteilten Entwicklung}, das im ROCK-Linux-Projekt entstanden ist.

\vspace*{0.4cm}

\item Wie bei einem dezentralen Versionsverwaltungstool kann jede Entwicklerin
unabh\"angig von externen Ressourcen arbeiten.

\vspace*{0.4cm}

\item Die einzelnen Entwicklerinnen k\"onnen mit einem eigenen Kommando lokale
\"Anderungen zu einem speziellen Server schicken.

\vspace*{0.4cm}

\item Dort k\"onnen andere Entwicklerinnen die \"Anderungen \"uber eine Weboberfl\"ache
testen und kommentieren.

\vspace*{0.4cm}

\item So k\"onnen keine Patches in Vergessenheit geraten. Jeder Patch muss
applied oder dezidiert abgelehnt werden.

\vspace*{0.4cm}
\hspace*{0.2cm}
{\tt http://www.rocklinux.org/wiki/SubMaster}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Some Subversion 1.5 Features}

\begin{slide}{Merge tracking}
\begin{itemize}

\item Subversion 1.5 hat nativ-merge-tracking-Funktionen, wie von svnmerge.py
zur Verf\"ugung gestellt.

\vspace*{0.4cm}

\item Merge-tracking-Daten aus svnmerge.py k\"onnen in das Subversion-1.5-eigene
Format konvertiert werden.

\vspace*{0.4cm}

\item Beispiel:
\begin{verbatim}
$ cd BRANCH_WORKING_COPY
$ svn merge URL_TO_TRUNK

$ cd TRUNK_WORKING_COPY
$ svn merge --reintegrate URL_TO_BRANCH
\end{verbatim}

\vspace*{0.4cm}

\item Mit der Option {\tt --record-only} k\"onnen Revisions vom Mergen
ausgeschlossen werden.

\vspace*{0.2cm}

\item {\tt svn log} und {\tt svn blame} wurden um die Option {\tt -g} ({\tt
--use-merge-history}) erweitert.

\end{itemize}
\end{slide}


\begin{slide}{Sparse Checkouts}
\begin{itemize}

\item Subversion 1.5 hat {\it offiziellen} Support f\"ur Sparse Checkouts.

\vspace*{0.5cm}

\item .. das sind Working Copys die nicht alle Dateien beinhalten.

\vspace*{0.5cm}

\item Anwendungsbeispiele:
\begin{itemize}
\item Grosse Projekte, die man nicht vollst\"andig auschecken m\"ochte
\item Umsortieren von Branches und/oder Tags
\end{itemize}

\vspace*{0.5cm}

\item Die Kommandos {\tt checkout}, {\tt switch} und {\tt up} wurden um die
Option {\tt --depth} erweitert.

\vspace*{0.5cm}

\item Erlaubte Werte f\"ur {\tt --depth=\it ...} sind: {\tt empty}, {\tt files}, {\tt
immediates} und {\tt infinity}.

\end{itemize}
\end{slide}


\begin{slide}{svn:externals improved}
\begin{itemize}

\item {\tt svn:externals} URLs beinhalten nun Support f\"ur Peg-Revisions.

\vspace*{0.5cm}

\item Man kann nun in {\tt svn:externals} auch relative Pfade angeben.

\vspace*{0.5cm}

\item Bei den relativen Pfaden gibt es einige besondere Features:
\vspace*{0.2cm}
\begin{itemize}
\item Relativ zum Repository Root: \\
\hspace*{0.5cm}{\tt \textasciicircum{}/project2/trunk}
\vspace*{0.2cm}
\item In ein paralleles Repository: \\
\hspace*{0.5cm}{\tt \textasciicircum{}/../trunk}
\vspace*{0.2cm}
\item Relativ zum URL Schema: \\
\hspace*{0.5cm}{\tt //example.com/svn/repos-1/project2/trunk}
\vspace*{0.2cm}
\item Relativ zum Server Root: \\
\hspace*{0.5cm}{\tt /repos-1/project2/trunk}
\end{itemize}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Referenzen}

\begin{slide}{URLs (1/2)}
\begin{itemize}

\item Subversion Homepage \\
{\tt http://subversion.tigris.org/}

\vspace*{0.25cm}

\item Subversion Handbook \\
{\tt http://svnbook.red-bean.com/}

\vspace*{0.25cm}

\item Subversion 1.5 Features \\
{\tt http://subversion.tigris.org/} \\
\hspace*{0.2cm}{\tt svn\_1.5\_releasenotes.html}

\vspace*{0.25cm}

\item Svnmerge.py \\
{\tt http://www.orcaware.com/svn/wiki/Svnmerge.py}

\vspace*{0.25cm}

\item SVK \\
{\tt http://svk.elixus.org/}

\vspace*{0.25cm}

\item SubMaster \\
{\tt http://www.rocklinux.org/wiki/SubMaster}

\end{itemize}
\end{slide}


\begin{slide}{URLs (2/2)}
\begin{itemize}

\item Cliffords Tools \\
{\tt http://svn.clifford.at/tools/trunk/}

\vspace*{1cm}

\item Clifford Wolf \\
{\tt http://www.clifford.at/}

\vspace*{0.5cm}

\item Weitere Pr\"asentationen \\
{\tt http://www.clifford.at/papers/}

\vspace*{0.5cm}

\item Diese Pr\"asentation \\
{\tt http://www.clifford.at/papers/2008/advsvn/}

\end{itemize}
\end{slide}

% ============================================================================

\end{document}

