% $Id$
\documentclass[blends,slideColor,colorBG,pdf,ps2pdf]{prosper}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{multicol}

\title{Subversion}
\subtitle{parce que cvs sucks}
\author{Olivier Thauvin}
\email{olivier.thauvin@aerov.jussieu.fr}
%%\institution{
%%  \includegraphics*[height=0.3\textheight]{gnutux.eps}
%%}

\NoFrenchBabelItemize

\begin{document}
    \maketitle

    \part{Introduction}

    \begin{slide}{Plan}
    \begin{itemize}
      \item Généralités sur les VCS
      \item RCS et CVS
      \item Subversion
        \begin{itemize}
            \item Présentation
            \item Administration
            \item Utilisation
            \item Allez plus loin
        \end{itemize}
    \end{itemize}
    \end{slide}

    \begin{slide}{Généralités sur les VCS}
    Pourquoi utiliser un Version Control System ?
    \begin{itemize}
        \item Archiver les différentes versions
        \item Fournir n'importe quelle ancienne version
        \item Gerer le stockage concurrent
            \begin{itemize}
                \item travail à plusieurs
                \item travail depuis plusieurs machine
            \end{itemize}
    \end{itemize}
    \end{slide}

    \part{RCS et CVS}
    \begin{slide}{RCS}
    Revision Control System (1991)
    \begin{itemize}
        \item Projet GNU sous GPL
        \item Dépôt décentralisé
        \item Ne gère que des fichiers
        \item Se présente comme un suite de programmes\\
        {\small rcs ci co rcsdiff rlog rcsmerge rcsclean rcsfreeze}
    \end{itemize}
    \end{slide}

    \begin{slide}{CVS}
    Concurrent Versions System
    \begin{itemize}
        \item Basé sur RCS
        \item Vieu\\
        {\small donc connu, courant et bien implanté}
        \item Dépôt centralisé
        \item Code monobloc
    \end{itemize}
    Les points faibles:
    \begin{itemize}
        \item Utilisation de \verb+$CVSROOT+ peu clair
        \item update ne créer pas les nouveaux répertoires\\
        {\small utilisation de -d}
        \item Etends toujours les mots clefs
        \item Pas de diff sur les nouveaux fichiers
        \item Gestion des branches acrobatique
    \end{itemize}
    \end{slide}

    \part{Subversion}

    \begin{slide}{Présentation}
    \begin{itemize}
    \item CVS++, se veut un remplaçant de CVS
    \item Historique:
    \begin{itemize}
        \item Février 2000: Début du dévelloppement par CollabNet
        \item 31 Août 2001: subversion est sous subversion
        \item 23 Février 2004: version 1.0.0
    \end{itemize}
    \item est libre\\
    Redistribution and use in source and binary forms, with or without
    modification, are permitted (\ldots)
    \end{itemize}
    \end{slide}

    \begin{slide}{CVS vs SVN}
    \begin{itemize}
    \item versionnement des répertoires
    \item numéros de révision unique au dépôt
    \item vrai historique\\
    {\small svn mv, svn cp}
    \item commit atomiques\\
    {\small tout ou rien}
    \item metadonnées versionnées
    \item différentes méthode d'accès aux dépots\\
    {\small local, ssh, http, svnserver}
    \item gestion des branches revue\\
    {\small comprendre, plus de branches ! :)}
    \item fonctionne avec des librairies
    \end{itemize}
    \end{slide}

    \begin{slide}{fonctionnement}
    \begin{tabular}{lc}
    La première fois:&
    \includegraphics*[height=0.5\textheight]{workco.eps}\\
    \hline
    Après:&
    \includegraphics*[height=0.5\textheight]{workupdate.eps}
    \end{tabular}
    \end{slide}

    \begin{slide}{Administration}
    \begin{itemize}
        \item elle doit se faire sur la machine elle même
        \item système de fichier local
    \end{itemize}
    \bigskip
    Création du dépôt
    \begin{verbatim}
$ svnadmin create /tmp/repos
    \end{verbatim}
    Sauvegarde du dépot:
    \begin{verbatim}
$ svnadmin dump /tmp/repos > dump
    \end{verbatim}
    \end{slide}

    \begin{slide}{Accès au depôt}
    Tout est url:
    \begin{tabular}{ll}
    local&\verb+file:///chemin/+\\
    http(s)&\verb+http://host/chemin+\\
    ssh&\verb$svn+ssh://user@host/chemin$\\
    svnserv&\verb+svn://user@host/chemin+
    \end{tabular}
    \bigskip
    Pas de différence entre base du dépot et chemin dans le depôt:

    \small\verb+file:///chemin/depot/sousrep/fichier+
    \end{slide}

    \begin{slide}{svn, commandes de base}
    \textbf{svn} \textit{options} commande
    \bigskip
    \begin{small}
    \begin{tabular}{lll}
    checkout&co&créer une copie de travail\\
    update&up&mettre à jours une copie de travail\\
    commit&&envoit les modifications dans le dépôt\\
    add&&prendre en charge un nouveau fichier\\
    \end{tabular}
    \end{small}
    \end{slide}

    \begin{slide}{svn, autres commandes}
    \textbf{svn} \textit{options} commande
    \bigskip
    \begin{small}
    \begin{tabular}{lll}
    diff&&obtenir un \textit{diff}\\
    rm&&effacer un fichier\\
    revert&&annuler les changements non commités\\
    merge&&intégrer des changement à partir d'un diff\\
    blame&&indiquer la révision des modifications\\
    \end{tabular}
    \end{small}
    \end{slide}

    \begin{slide}{Créer une copie de travail}
    Utilisation de \textit{checkout}
\begin{scriptsize}
\begin{verbatim}
$ svn co http://virgo/svn/[...]/subversion/ subversion/
A    subversion/workco.fig
A    subversion/workupdate.fig
A    subversion/Makefile
A    subversion/subversion.tex
Révision 18 extraite.
$ cd subversion/
\end{verbatim}
\end{scriptsize}
    \bigskip
    Subversion mémorise l'url du dépots.
    \end{slide}

    \begin{slide}{mettre à jours}
    \textit{svn update}
    \begin{itemize}
        \item est récursif (voir -N)
        \item créer les nouveaux fichiers
        \item éfface les anciens fichiers
        \item donne un status aux fichiers
    \end{itemize}

\begin{footnotesize}
\begin{verbatim}
$ svn update
U    subversion.tex
Actualisé à la révision 18.
$ svn update -r 17 subversion.tex
U    subversion.tex
Actualisé à la révision 17.
\end{verbatim}
\end{footnotesize}
    \end{slide}

    \begin{slide}{soumettre les modifications}
    \textit{svn commit}
    \begin{itemize}
        \item est récursif (voir -N)
        \item seuls les fichiers précédement ajouté sont commités
        \item seuls les fichiers modifiés sont commités
        \item log: utiliser -m ou placer \verb+$EDITOR+
    \end{itemize}

\begin{footnotesize}
\begin{verbatim}
$ svn commit -m "- add commit slide"
Envoi          subversion/subversion.tex
Transmission des données .
Révision 20 propagée.
\end{verbatim}
\end{footnotesize}
    
    \end{slide}

    \begin{slide}{ajouter / enlever des fichiers}
    \textit{svn add}
    \begin{itemize}
        \item est récursif (voir -N)
        \item est locale (nécéssite un commit)
    \end{itemize}
    \bigskip
    \textit{svn remove}
    \begin{itemize}
        \item efface aussi le fichier local
        \item est récursif (voir -N)
    \end{itemize}

% TODO ajouter exemple
    \end{slide}

    \begin{slide}{Comparer}
    \textit{svn diff}
    produit un \textit{diff} entre
    \begin{itemize}
        \item le fichier local et la révision courante
        \item le fichier local et une révision arbitraire
        \item deux révisions arbitraire
        \item un autre chemin
    \end{itemize}
    \bigskip
    \textit{svn status}
    donne l'état de tout les fichiers
\begin{footnotesize}
\begin{verbatim}
$ svn status
?      not_in_repos
M      SPECS/postgresql.spec
\end{verbatim}
\end{footnotesize}
    \end{slide}
    
    \begin{slide}{svn diff: exemple}
\begin{scriptsize}
\begin{verbatim}
Index: SPECS/postgresql.spec
===================================================================
--- SPECS/postgresql.spec       (révision 28)
+++ SPECS/postgresql.spec       (copie de travail)
@@ -17,7 +17,7 @@
 %define current_major_version 8.1
 %define current_minor_version 1

-%define release %mkrel 3
+%define release %mkrel 4

 %define libname %mklibname pq %{major}
 %define libecpg %mklibname ecpg %{major_ecpg}
\end{verbatim}
\end{scriptsize}

    \end{slide}

    \part{Autour de subversion}

\end{document}
