% $Id$
\documentclass[notes]{beamer}
\usepackage[utf8]{inputenc}
%\documentclass[blends,frameColor,colorBG,pdf,ps2pdf]{prosper}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{multicol}
\usepackage{moreverb}

\mode<presentation>
{
  \definecolor{beamerstructure}{RGB}{143,79,112}
  \definecolor{sidebackground}{RGB}{230,242,250}
  \color{beamerstructure}
  \usetheme[secheader]{Madrid}
  \usepackage{times}
  \userightsidebarcolortemplate{\color{sidebackground}}
  \beamertemplateballitem
}

\AtBeginSection[]
{
\begin{frame}<beamer>
    \frametitle{Plan}
    \tableofcontents[currentsection,hideothersubsections]
\end{frame}
}

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

\begin{document}
    
\begin{frame}
    \maketitle
\end{frame}

\begin{frame}{Plan}
    \tableofcontents
\end{frame}

\section*{Introduction}

\begin{frame}{Généralités sur les VCS}
\begin{block}{Pourquoi utiliser un gestionnaire de versionnement ?}
    \begin{itemize}
        \item Archiver pas à pas les modifications
        \pause
        \item Retrouver n'importe quelle ancienne version
        \pause
        \item Gérer le stockage concurrent
        \pause
            \begin{itemize}
                \item travail à plusieurs
                \item travail depuis plusieurs machines
            \end{itemize}
    \end{itemize}
\end{block}

\begin{block}{Plusieurs approches}
    \pause
    \begin{itemize}
    \item centralisé vs décentralisé
    \pause
    \item révisions incrémentales vs patch
    \end{itemize}
\end{block}
\end{frame}

\section{RCS et CVS}

\begin{frame}[fragile]
    \frametitle{RCS}
    \begin{block}{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 \verb+rcs ci co rcsdiff rlog rcsmerge rcsclean rcsfreeze+}
    \end{itemize}
    \end{block}
\end{frame}

\begin{frame}{CVS}
    \begin{block}{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{block}
\end{frame}
    
\begin{frame}[fragile]
    \frametitle{CVS: points faibles:}
    \begin{block}{}
    \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{block}
\end{frame}

\section{Subversion}

\subsection{Présentation}

\begin{frame}
    \frametitle{Présentation}
    \begin{block}{CVS++}
    un successeur à CVS
    \end{block}
    \vfill
    \pause
    \begin{block}{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}
    \end{block}
    \vfill
    \pause
    \begin{block}{Un projet libre}
    "Redistribution and use in source and binary forms, with or without
    modification, are permitted (\ldots)"
    \end{block}
\end{frame}

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

\subsection{Administration}

\begin{frame}[fragile]
    \frametitle{Administration}
    \begin{block}{}
    \begin{itemize}
        \item elle doit se faire sur la machine elle même
        \item système de fichiers local
    \end{itemize}
    \end{block}
    \pause
    \vfill
    \begin{block}{Création du dépôt}
    \begin{verbatim}
$ svnadmin create /tmp/repos
    \end{verbatim}
    \end{block}
    \pause
    \vfill
    \begin{block}{Sauvegarde du dépôt}
    \begin{verbatim}
$ svnadmin dump /tmp/repos > dump
    \end{verbatim}
    \end{block}
\end{frame}

\subsection{Utilisation}

\begin{frame}
    \frametitle{svn, commandes de base}
    \begin{block}{
    \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\\
    rm&&"éfface" un fichier\\
    help&&affiche l'aide\\
    \end{tabular}
    \end{small}
    \end{block}
\end{frame}

\begin{frame}{svn, autres commandes}
    \begin{block}{
    \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{block}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Accès au dépôt}
    \begin{block}{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}
    \end{block}
    \vfill
    \pause

    \begin{block}{Accès au sein du dépôt}
    \small\verb+file:///chemin/depot/sousrep/fichier+
    \end{block}
\end{frame}

\begin{frame}
    \frametitle{Fonctionnement}
    \begin{columns}                                                                                                                      
    \column{.4\textwidth}  
    \begin{block}{La première fois:}
    \includegraphics[height=0.4\textheight]{workco}\\
    \end{block}
    \column{.4\textwidth}  
    \pause
    \begin{block}{Au quotidien:}
    \includegraphics[height=0.4\textheight]{workupdate}\\
    \end{block}
    \end{columns}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Créer une copie de travail}
    \begin{exampleblock}{Utilisation de \textit{checkout}}
\begin{scriptsize}
\begin{verbatim}
svn co svn+ssh://forge.ipsl.jussieu.fr/projets/cini/svn cini
[...]
A    cini/trunk/Makefile.PL
A    cini/trunk/Changes
A    cini/trunk/bin
A    cini/trunk/bin/cini-loadcitype
A    cini/trunk/bin/cini-dbdeploy
A    cini/branches
Révision 197 extraite.
$ cd subversion/
\end{verbatim}
\end{scriptsize}
\end{exampleblock}
    \vfill
\begin{alertblock}{}
    Subversion mémorise l'url du dépôt.
\end{alertblock}
\end{frame}

\begin{frame}[fragile]
    \frametitle{mettre à jour}
    \begin{block}{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}
    \end{block}
\vfill
\pause
\begin{exampleblock}{}
\begin{footnotesize}
\begin{verbatim}
$ svn update
Mise à jour de '.' :
U    lib/Cini.pm
A    lib/Cini/Controller/Admin/CiRelType.pm
Actualisé à la révision 197.
\end{verbatim}
\pause
\begin{verbatim}
$ svn update -r195
Mise à jour de '.' :
D    lib/Cini/Controller/Admin/CiRelType.pm
U    lib/Cini.pm
Actualisé à la révision 195.
\end{verbatim}
\end{footnotesize}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
    \frametitle{soumettre les modifications}
    \begin{block}{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}
    \end{block}

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

\begin{frame}{ajouter / enlever des fichiers}
    \begin{block}{svn add}
    \begin{itemize}
        \item est récursif (voir -N)
        \item est local (nécessite un commit)
    \end{itemize}
    \end{block}
    \vfill
    \pause
    \begin{block}{svn remove}
    \begin{itemize}
        \item efface aussi le fichier local
        \item est récursif (voir -N)
    \end{itemize}
    \end{block}

% TODO ajouter exemple
\end{frame}

\begin{frame}[fragile]
    \frametitle{Comparer}
    \begin{block}{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}
    \end{block}
    \vfill
    \pause
    \begin{block}{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{block}
\end{frame}
    
\begin{frame}[fragile]
\frametitle{svn diff: exemple}
\begin{exampleblock}{svn diff}
\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{exampleblock}
\end{frame}
    
\begin{frame}[fragile]
\frametitle{voir l'historique}
\begin{block}{svn log}
affiche les... logs
\end{block}
\vfill
\begin{exampleblock}{}
\begin{tiny}
\begin{verbatim}
r157 | delcambre | 2013-08-07 01:21:25 +0200 (mer. 07 août 2013) | 1 ligne

 - Mise en page citype liste
------------------------------------------------------------------------
r156 | delcambre | 2013-08-06 22:49:25 +0200 (mar. 06 août 2013) | 1 ligne

 - Support du transfert de fichier en ajax et correction de la gestion des pages
------------------------------------------------------------------------
r155 | nanardon | 2013-08-06 17:37:55 +0200 (mar. 06 août 2013) | 1 ligne

rework ci/ uri structure
------------------------------------------------------------------------
r154 | delcambre | 2013-08-06 03:32:56 +0200 (mar. 06 août 2013) | 1 ligne

 - correction suppression multivalué citype
\end{verbatim}
\end{tiny}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{rechercher d'où vient le code}
\begin{block}{svn blame}
affiche l'origine des lignes d'un fichier (révision, auteur et la ligne):
\begin{tiny}
\begin{verbatim}
   145  delcambre   elsif ($data->{oper} eq 'del') { # delete row
   145  delcambre     my $inv_rs = $c->model('DB::CiAttribute')->search({
   145  delcambre         $data->{id}
   152   nanardon             ? (ciattribute_id => [ split(',', $data->{id}) ])
   145  delcambre             : (ciattributename => $data->{ciattributename})
   145  delcambre     });
   145  delcambre     $inv_rs->delete();
   145  delcambre     $c->response->status(204);
   145  delcambre   }
\end{verbatim}
\end{tiny}
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{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{frame}

\begin{frame}[fragile]
\frametitle{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{frame}

\begin{frame}[fragile]
    \frametitle{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{frame}

\begin{frame}[fragile]
    \frametitle{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{frame}

    \section{Autour de subversion}

\begin{frame}{tortoisesvn}
    \begin{block}{Client subversion pour Windows}

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

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

    \begin{frame}{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{frame}

    \begin{frame}{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{frame}
    
\section{Conclusion}

    \begin{frame}{Résumé}
    \begin{block}{Points forts:}
    \begin{itemize}
        \item simple à comprendre et à mettre en \oe uvre
        \item pas de gros changement par rapport à CVS
        \item efficace
    \end{itemize}
    \end{block}
    
    \begin{alertblock}{Mais:}
    \begin{itemize}
        \item reste un VCS centralisé
        \item reste sur une base purement incrémentale
    \end{itemize}
    \end{alertblock}
    \end{frame}

    \include{cc_by_sa}
    
    \begin{frame}{Fin}
    \begin{block}{Questions ?}
    \center \includegraphics[width=0.3\linewidth]{Abrichatons}
    \end{block}
    \vfill
    
    \begin{block}{}
    De toutes façons y'a plein de documentations
    sur le net: \url{http://subversion.tigris.org/}.
    \end{block}

    \vfill
    \vfill
    \begin{block}{}
    \footnotesize{Merci à misc :)}
    \end{block}
    \end{frame}
\end{document}
