% $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{RCS et CVS}\\
    Rappel
    \item{Subversion}
        \begin{itemize}
        \item Administration
        \item Commandes de base
        \end{itemize}
    \item{Autour de subversion}\\
    Trac, svk, \ldots
    \end{itemize}
    \end{slide}

    \begin{slide}{Généralités sur les VCS}
    Pourquoi utiliser un gestionnaire de versionnement ?
    \begin{itemize}
        \item Archiver les différentes versions
        \item Fournir n'importe quelle ancienne version
        \item Gérer le stockage concurrent
            \begin{itemize}
                \item travail à plusieurs
                \item travail depuis plusieurs machines
            \end{itemize}
    \end{itemize}
    \end{slide}

    \part{RCS et CVS}
    \begin{slide}{RCS}
    Révision 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 une 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 Vieux\\
        {\small donc connu, courant et bien implanté}
        \item Dépôt centralisé
        \item Code monobloc
    \end{itemize}
    \end{slide}
    
    \begin{slide}{CVS: points faibles:}
    \begin{itemize}
        \item Utilisation de \verb+$CVSROOT+ peu clair
        \item update ne crée pas les nouveaux répertoires\\
        {\small utilisation de -d}
        \item Étends 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éveloppement 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 commits atomiques\\
    {\small tout ou rien}
    \item metadonnées versionnées
    \item différentes méthodes d'accès aux dépôts\\
    {\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}\\
    \hline
    Après:&
    \includegraphics*[height=0.5\textheight]{workupdate}
    \end{tabular}
    \end{slide}

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

    \begin{slide}{Accès au dépô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épôt et chemin dans le dépô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 à jour une copie de travail\\
    commit&&envoyer 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 changements à partir d'un diff\\
    blame&&indiquer la révision des modifications (annotate)\\
    \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épôt.
    \end{slide}

    \begin{slide}{mettre à jour}
    \textit{svn update}
    \begin{itemize}
        \item est récursif (voir -N)
        \item crée les nouveaux fichiers
        \item efface les anciens fichiers
        \item donne un statut 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édemment ajoutés 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 local (nécessite 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 arbitraires
        \item le chemin courant et un autre chemin
    \end{itemize}
    \bigskip
    \textit{svn status}
    donne l'état de tous 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{tiny}
\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{tiny}

    \end{slide}
    
    \begin{slide}{voir l'historique}
    \textit{svn log}
    affiche les... logs
\begin{tiny}
\begin{verbatim}
$ svn log SPECS/postgresql.spec
------------------------------------------------------------------------
r28 | nanardon | 2006-01-02 11:07:34 +0100 (lun, 02 jan 2006) | 1 line

- remove jdbc
------------------------------------------------------------------------
r27 | nanardon | 2006-01-02 10:29:35 +0100 (lun, 02 jan 2006) | 1 line

- postgresql-8.1.1-3mdk
------------------------------------------------------------------------
r2 | nanardon | 2005-12-26 03:28:50 +0100 (lun, 26 déc 2005) | 1 line

Add postgresql
------------------------------------------------------------------------
\end{verbatim}
\end{tiny}
    \end{slide}

    \begin{slide}{rechercher d'où vient le code}
    \textit{svn blame}
    affiche l'origine des lignes d'un fichier (révision, auteur et la ligne):
\begin{tiny}
\begin{verbatim}
     7   nanardon \begin{document}
     9   nanardon     \maketitle
     7   nanardon
     9   nanardon     \part{Introduction}
     7   nanardon
     9   nanardon     \begin{slide}{Plan}
     7   nanardon     \begin{itemize}
     9   nanardon       \item Généralités sur les VCS
     9   nanardon       \item RCS et CVS
     9   nanardon       \item Subversion
     9   nanardon         \begin{itemize}
    13   nanardon             \item Présentation
\end{verbatim}
\end{tiny}
    \end{slide}

    \begin{slide}{les "keywords"}
    Ils ajoutent des informations de subversion dans le code source
    \begin{itemize}
        \item ne sont pas activés par défaut
        \item sont remplacés par \textit{export, checkout, update, commit}
    \end{itemize}
    \bigskip
    Pour activer leur expansion:\\
    \textit{svn propset svn:keywords Id fichier...}
    
    \bigskip
    Exemple:
    \bigskip
    \begin{tiny}
    \begin{itemize}
        \item Id: \verb+$Id$+
        \item Author: \verb+$Author$+
        \item Revision: \verb+$Revision$+
    \end{itemize}
    \end{tiny}
    \end{slide}

    \begin{slide}{Gérer les conflits}
    \begin{figure}[htb]
    \includegraphics*[height=0.3\textheight]{conflict}
    \end{figure}
    Si 2 commits sur le même fichier

    \begin{itemize}
    \item fusion automatique
    \item conflit:
        \begin{itemize}
            \item corriger le code
            \item \textit{svn resolved}
            \item commiter
        \end{itemize}
    \end{itemize}
    \end{slide}

    \begin{slide}{Annuler un changement}
    \textit{svn merge} intègre les changements \verb+de:à+ dans
    la copie de travail.
    \bigskip
    \begin{itemize}
        \item les changements peuvent venir d'un autre chemin (branches)
        \item n'agit que sur la copie locale (il faut commiter)
    \end{itemize}
    
    \bigskip
    \begin{figure}[htb]
    \includegraphics*[width=0.9\textwidth]{merge}
    \end{figure}
    \end{slide}

    \begin{slide}{Les tags, les branches}
    Les branches et les tags sont des copies de fichiers:
    \begin{itemize}
        \item avec \textit{svn copy}
        \item les données ne sont pas dupliquées dans le dépôt
        \item l'historique est conservé
    \end{itemize}
    \bigskip
    \begin{figure}[htb]
    \includegraphics*[width=0.9\textwidth]{branches}
    \end{figure}
    \end{slide}

    \part{Autour de subversion}

    \begin{slide}{tortoisesvn}
    Client subversion pour Windows

    \begin{figure}[htb]
    \includegraphics[height=60mm]{tortoisesvn}
    \end{figure}
    
    \end{slide}

    \begin{slide}{viewcvs}
    \begin{figure}[htb]
    \includegraphics[width=90mm]{viewcvs}
    \end{figure}
    \end{slide}
    
    \begin{slide}{trac}
    \begin{figure}[htb]
    \includegraphics[width=90mm]{trac}
    \end{figure}
    \end{slide}

    \begin{slide}{trac, quelques mots}
    Outil global de suivit de projet:
    \begin{itemize}
        \item écrit en python
        \item base de données SQL (sqlite, postgres depuis la 0.9.2)
        \item cgi, mod\_python ou démon
    \end{itemize}
    \bigskip
    Trac apporte
    \begin{itemize}
        \item un wiki
        \item un suivi des bugs et des fonctionnalités demandées
        \item un navigateur de dépôt subversion
        \item suivi des révisions vis à vis des bugs
    \end{itemize}
    \end{slide}

    \begin{slide}{svk}
    Apporte:
    \begin{itemize}
        \item une gestion décentralisée
        \item travail hors connexion
    \end{itemize}
    \bigskip
    \begin{itemize}
        \item écrit en perl
        \item écrit pour subversion
        \item basé sur/utilise subversion
        \item gère également CVS
    \end{itemize}
    \bigskip
    SVK a malheureusement des limitations (nfs, double dépôt).
    \end{slide}

    \begin{slide}{cvs2svn}
    Converti un dépôt cvs en dépôt subversion
    \begin{scriptsize}(comme son nom ne l'indique pas)\end{scriptsize}

    \bigskip
    Il fonctionne globalement bien mais\ldots
    \begin{itemize}
        \item faire attention aux "keywords"
        \item faire attention aux EOL pour les binaires
        \item ne fonctionne pas toujours
    \end{itemize}
    \end{slide}
    
    \part{Conclusion}

    \begin{slide}{Résumé}
    Points forts:
    \begin{itemize}
        \item simple à comprendre et à mettre en \oe uvre
        \item pas de gros changement par rapport à CVS
        \item efficace
    \end{itemize}
    
    Mais:
    \begin{itemize}
        \item reste un VCS centralisé
        \item reste sur une base purement incrémentale
    \end{itemize}
    \end{slide}
    
    \begin{slide}{Fin}
    \begin{huge}
    Questions ?
    \end{huge}
    \bigskip
    
    De toutes façons y'a plein de documentations
    sur le net: \url{http://subversion.tigris.org/}.

    \bigskip
    \bigskip
    \footnotesize{Merci à misc :)}
    \end{slide}
\end{document}
