\documentclass[12pt]{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}

% Manual syntax highlighting
\newcommand{\synfunc}   [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\synstr}    [1]{\color{red!50!black}#1\color{black}}
\newcommand{\synvar}    [1]{\color{purple!50!black}#1\color{black}}
\newcommand{\synclass}  [1]{\color{green!50!black}#1\color{black}}
\newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}}
\newcommand{\syncool}   [1]{\color{beamer@blendedblue}#1\color{black}}
\newcommand{\synoder}      {\ \ \color{black}$\vee$\ \ }
\newcommand{\hr}        {\rule[4pt]{\textwidth}{0.1pt}\\}

\title{Versionskontrolle mit SVK}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{1. Februar 2006}

\usetheme{Warsaw}
\usecolortheme{seahorse}
%\usepackage{bookman}
\setbeamercovered{transparent}

\begin{document}

\frame{\titlepage}
\frame[t]{
  \frametitle{Inhalt}
  \tableofcontents
}

\section{Versionskontrolle}
\frame[t]{\frametitle{Versionskontrolle}
  \begin{itemize}
    \item Generell: Verfolgen von Versionen/Änderungen
    \item "`Was habe ich damals geändert?"'
    \item "`Was hat \texttt{\$PERSON} damals geändert?"'
  \end{itemize}
}

\subsection{Grundidee}
\frame[t]{\frametitle{Grundidee}
  \begin{itemize}
    \item Dateiverwaltung durchs Versionskontrollsystem
    \item Damit möglich:
          \begin{itemize}
            \item Rückkehr zu früheren Ständen
            \item Genaue Buchführung ("`wieso habe ich das gleich nochmal
                  geändert?"')
            \item Mehrgleisige Entwicklung (Zweige (branches))
          \end{itemize}
  \end{itemize}

  \vfill
  \begin{block}{Mögliche Einsatzzwecke}
    \begin{itemize}
      \item Programmierung
      \item \texttt{/etc}
      \item \texttt{\$WICHTIGE\_ARBEIT}, \texttt{\$WICHTIGES\_DOKUMENT}
    \end{itemize}
  \end{block}
}

\subsection{Geschichte}
\frame[t]{\frametitle{Geschichte}
  \vspace*{-1em}\hspace*{3em}\vbox{\begin{columns}[t]
    \column{5cm}
    \begin{itemize}
      \item[Vor 1972] \textbf<1>{cp}
%     \item[1972] SCCS
      \item[1982] \textbf<2>{RCS}
      \item[1992] \textbf<3-4>{CVS}
    \end{itemize}

    \column{5cm}
    \begin{itemize}
      \item[2002] \textbf<5-6>{Subversion (SVN)}
      \item[2003] SVK
    \end{itemize}
  \end{columns}}

  \only<1>{\begin{block}{cp}
    \texttt{%
      \$ \synfunc{cp}\ \synstr{datei}\ \synstr{datei.2006-01-31}\ \ \syncomment{\# Backup}\\
      \$ \synvar{\$EDITOR}\ \synstr{datei} \\
      \$ \ldots\\
      \syncomment{\# Oh! Irgendwas ging schief!}\\
      \$ \synfunc{mv}\ \synstr{datei.2006-01-31}\ \synstr{datei}\ \ \syncomment{\# Revert}
    }
  \end{block}}

  \only<2>{\begin{block}{RCS}
    \texttt{%
      \$ \synfunc{ci}\ \ \ datei\ \ \syncomment{\# Checkin}\\
      \$ \synfunc{co}\ \ \ datei\ \ \syncomment{\# Checkout}\\
      \$ \synfunc{rlog}\   datei\ \ \syncomment{\# Log ansehen}
    }

    Aber: Keine Möglichkeit der Zusammenarbeit
  \end{block}}

  \only<3-4>{\begin{block}{CVS}
    \only<3>{
      \texttt{%
        \$ \synfunc{cvs ci}\ \ datei\ \ \syncomment{\# Checkin}\\
        \$ \synfunc{cvs co}\ \ datei\ \ \syncomment{\# Checkout}\\
        \$ \synfunc{cvs log}\  datei\ \ \syncomment{\# Log ansehen}
      }

      \begin{itemize}
        \item Aufsatz auf RCS (zuerst pure Shellskripte, später C)
        \item (Teils große) Probleme beim Umgang mit Verzeichnissen und
              Umbenennung
        \item Geringe Performance
      \end{itemize}
    }

    \only<4>{
      \begin{center}{\Large ``You hate it and then it hates back''}\end{center}

      \texttt{%
        \$ \synfunc{cat}\ \synstr{-n}\ \synstr{cvs/src/server.c}\\
        5878\ \ \ \ \ \ \ \synfunc{goto}\ \synstr{i\_hate\_you};\\
        \ldots\\
        5898\ \ \ \synvar{i\_hate\_you}:\\
        5899\ \ \ \ \ \ \ \synfunc{printf}\ (\synstr{"{}I HATE YOU\textbackslash{}n"{}});\\
        5900\ \ \ \ \ \ \ \synfunc{fflush}\ (\synvar{stdout});
      }
    }
  \end{block}}

  \only<5-6>{\begin{block}{Subversion}
    \only<5>{
      \texttt{%
        \$ \synfunc{svn ci}\ \ datei\ \ \syncomment{\# Checkin}\\
        \$ \synfunc{svn co}\ \ datei\ \ \syncomment{\# Checkout}\\
        \$ \synfunc{svn log}\  datei\ \ \syncomment{\# Log ansehen}
      }

      \begin{itemize}
        \item Neuentwicklung
        \item Versionierte Verzeichnisse; Umbenennungen
        \item Atomare Commits
        \item Anzeige von Unterschieden (diffs) auch ohne Server
      \end{itemize}
    }

    \only<6>{
      \begin{center}{\Large ``Disks are cheap, bandwidth is expensive''}\end{center}
    }
  \end{block}}
}

\frame[t]{\frametitle{Alternativen}
  \begin{itemize}
    \item Perforce (schnell, kommerziell, zentraler Aufbau)
    \item Bitkeeper (\ldots\!)
    \item Darcs (noch langsam)
    \item Arch (langsam, ``insist[s] on some concrete in your brain'')
    \item Bazaar-NG (von Canonical (Ubuntu))
    \item Monotone, Aegis, \ldots
  \end{itemize}
}

\subsection{Entwicklung}
\frame[t]{\frametitle{Entwicklung}
  \begin{itemize}
    \item RCS: 1982, SVN: 2002
    \item Voraussetzungen für Open-Source-Entwicklung:
          \begin{itemize}
            \item Fähige Programmierer
            \item Freude oder Not (oder Geld)
          \end{itemize}
    \item Probleme:
          \begin{itemize}
            \item Versionskontrollprogrammierung macht wenig Spaß
            \item Abfinden mit vorhandenen Lösungen
          \end{itemize}
  \end{itemize}
}

\section{SVK}
\subsection{Entwicklung}
\frame[t]{\frametitle{Entwicklung}
  \begin{itemize}
    \item Initiator: Chia-liang Kao (clkao)
    \item ``Screw it! I am going to take one year off and make my life easier
          in the future'' -- clkao, September 2003
  \end{itemize}

  \begin{block}{Mottos von SVK}
    \begin{itemize}
      \item ``Disks are cheap, bandwidth is \textsl{very} expensive''
      \item Faulheit, Do What I Mean (DWIM)
    \end{itemize}
  \end{block}
}

\subsection{Design}
\frame[t]{\frametitle{Design}
  \begin{itemize}
    \item Zugriff auf unterschiedliche Versionskontrollsysteme
          (Subversion, git, CVS, Perforce, \ldots)
    \item Verteilung, Dezentralität: \\
          Kein zentraler Server, flexible Patch-Verwaltung
    \item {\small\url{http://perlcabal.org/~autrijus/svk-overview.png}}
    \item Lokales Repository auf Subversion-Basis \\
          (Performance! Robustheit!)
  \end{itemize}

  \pause
  \begin{block}{Arbeitsweise beim Umgang mit entfernten Repositories}
    \begin{enumerate}
      \item Mirrorn eines entfernten Repositories
      \item Arbeiten im lokalen Mirror, Internetverbindung nicht erforderlich
      \item Zurückschieben der Änderungen ins entfernte Repository
    \end{enumerate}
  \end{block}
}

\subsection{Praxis: Single-User-SVK}
\frame[t]{\frametitle{Praxis: Single-User-SVK}
  \begin{enumerate}
    \item Importieren eines vorhandenen Verzeichnisbaums

      \texttt{%
        \$ \synfunc{svk import}\ \synstr{--to-checkout}\ \symbol{92}\\
        \ \ \ \ \synstr{//\textsl{grtz}}\ \synstr{/home/iblech/\textsl{grtz}}
      }

    \pause
    \item Arbeiten
    \item Ende eines Arbeitsblocks; Einchecken (checkin, commit)

      \texttt{%
        \$ \synfunc{svk ci}
      }

    \pause
    \item "`Wieso hab ich das doch gleich gemacht?"'

      \texttt{%
        \$ \synfunc{svk log}\ \synstr{foo.yml}
      }

    \pause
    \item "`Wie war das doch nochmal vor einer Woche?"'

      \texttt{%
        \$ \synfunc{svk update}\ \synstr{-r '\{\textsl{YYYY}-\textsl{MM}-\textsl{DD}\}'}\\
        \syncomment{\# Oder, kürzer:}\\
        \$ \synfunc{svk up}\ \synstr{-r '\{\textsl{YYYY}-\textsl{MM}-\textsl{DD}\}'}\\
      }
  \end{enumerate}
}

\frame[t]{\frametitle{Kommandoübersicht}
  \begin{tabular}{ll}
    \texttt{\synfunc{svk ci}} & Einchecken \\
    \texttt{\synfunc{svk log}} & Log ansehen \\
    \texttt{\synfunc{svk update}\ \synstr{-r \ldots}} & Zu bestimmter Version zurückkehren \\
    \texttt{\synfunc{svk update}}, \texttt{\synfunc{svk up}} & Zu neuester Version zurückkehren \\
    \\
    \texttt{\synfunc{svk diff}} & Unterschiede (diff) anzeigen \\
    \\
    \texttt{\synfunc{svk add}\ \synstr{\ldots}} & Datei oder Verzeichnis zum Repository \\
      & hinzufügen \\
    \texttt{\synfunc{svk rm}\ \synstr{\ldots}} & Datei oder Verzeichnis löschen \\
    \texttt{\synfunc{svk cp}\ \synstr{\ldots}\ \synstr{\ldots}} & Datei oder Verzeichnis kopieren \\
    \texttt{\synfunc{svk mv}\ \synstr{\ldots}\ \synstr{\ldots}} & Datei oder Verzeichnis \\
      & verschieben/umbenennen \\
  \end{tabular}
}

\section{Siehe auch}
\frame[t]{\frametitle{Siehe auch}
  \begin{itemize}
    \item \url{http://svk.elixus.org/}
    \item \url{http://svkbook.elixus.org/}
    \item {\scriptsize\url{http://opensource.fotango.com/~clkao/svk-intro/start.html}} \\
          svk -- Version Control without the Headaches (clkao)
    \item {\footnotesize\url{http://utsl.gen.nz/talks/svn-svk/slides/start.html}} \\
          Upgrading your development to svk and svl via svn (Sam~Vilain)
  \end{itemize}

  \only<2>{\vfill\begin{center}\Huge Fragen?\end{center}}
}

\appendix
\section{\appendixname}
\frame{\begin{center}\Huge Bonus-Slides\end{center} \tableofcontents}

\subsection{Revisionen bei Subversion und SVK}
\frame[t]{\frametitle{Revisionen bei Subversion und SVK}
  \begin{itemize}
    \item Markierung eines bestimmten Zeitpunkts durch eine Revisionsnummer
    \item Erfassung immer \textsl{aller} Dateien durch eine Revisionsnummer
  \end{itemize}

  \pause
  \begin{block}{Beispiel}
    \begin{enumerate}
      \item Aktuelle Revision: 42; vorhandene Dateien: \texttt{grtz}, \texttt{baka}
      \item Modifikation von \texttt{grtz}, \texttt{svk ci}
      \item Nun aktuelle Revision: 43
      \item Revision von \texttt{grtz}: 43
      \item Revision von \texttt{baka}: trotz Ausbleiben von Änderungen an
            \texttt{baka} ebenfalls 43 (Gegensatz zu CVS!)
    \end{enumerate}
  \end{block}
}

\subsection{Zweige, Tags und Trunk}
\frame[t]{\frametitle{Zweige, Tags und Trunk}
  \begin{itemize}
    \item Bei Subversion und SVK \textsl{keine} spezielle Behandlung von
          Zweigen, Tags und Trunk
    \item Stattdessen: Zweige, Tags und Trunk nur als Verzeichnisse:

          \hspace*{4em}\vbox{\begin{itemize}
            \item[\texttt{//\textsl{grtz}/trunk}] Trunk
            \item[\texttt{//\textsl{grtz}/tags}] Verzeichnis für Tags
            \item[\texttt{//\textsl{grtz}/branches}] Verzeichnis für Zweige
          \end{itemize}}

          \vspace*{-0.6em}
    \item Keine Sonderbehandlung dieser Verzeichnisse!
  \end{itemize}
}

\frame[t]{\frametitle{Zweige, Tags und Trunk}
  \footnotesize\begin{enumerate}
    \item Anlegen der Verzeichnisstruktur

      \texttt{%
        \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/trunk}\\
        \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/tags}\\
        \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/branches}
      }
    \item Arbeiten in \texttt{//\textsl{grtz}/trunk/}

    \pause
    \item Taggen des aktuellen Trunks als \texttt{\textsl{release-3.141}}

      \texttt{%
        \$ \synfunc{svk cp}\ \synvar{//\textsl{grtz}/trunk}\ \synvar{//\textsl{grtz}/tags/\textsl{release-3.141}}
      }

    \pause
    \item Weiterarbeiten in \texttt{//\textsl{grtz}/trunk/}
    \item Erzeugen des Zweigs \texttt{foobs} aus\ldots

      \texttt{%
        \syncomment{\# \ldots dem aktuellen Trunk}\\
        \$ \synfunc{svk cp}\ \synvar{//\textsl{grtz}/trunk}\ \synvar{//\textsl{grtz}/branches/foobs}\\
        \syncomment{\# \ldots \textsl{release-3.141}}\\
        \$ \synfunc{svk cp}\ \symbol{92}\\
        \ \ \ \ \synvar{//\textsl{grtz}/tags/\textsl{release-3.141}}\ \synvar{//\textsl{grtz}/branches/foobs}
      }
  \end{enumerate}
}

\subsection{Zugriff auf entfernte Repositories mit SVK}
\frame[t]{\frametitle{Zugriff auf entfernte Repositories mit SVK}
  \begin{enumerate}
    \item Mirrorn und Auschecken des entfernten Repositories

      \texttt{%
        \$ \synfunc{svk cp}\ \synstr{svn://svn.openfoundry.org/pugs}\ \synstr{pugs}
      }

    \pause
    \item Arbeiten (auch ohne Internetverbindung)
    \item Ende eines Arbeitsblocks; lokales (!) Einchecken (ebenfalls ohne
          Internetverbindung)

      \texttt{%
        \$ \synfunc{svk ci}
      }

    \pause
    \item Hochschieben der Änderungen zum entfernten Repository

      \texttt{%
        \syncomment{\# Pro lokalem Commit ein entfernter Commit:}\\
        \$ \synfunc{svk push}\\
        \syncomment{\# Oder alle lokalen Commits in einem Commit}\\
        \syncomment{\# zum Server schicken:}\\
        \$ \synfunc{svk push}\ \synstr{-l}\\
      }

    \pause
    \item Änderungen aus dem entfernten Repository holen

      \texttt{%
        \$ \synfunc{svk pull}
      }
  \end{enumerate}
}

% http://opensource.fotango.com/~clkao/svk-intro/slide11e.html#end
% http://utsl.gen.nz/talks/svn-svk/slides/index.html

\end{document}
