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

\title{Darcs}
\subtitle{Des dépots et des patch}
\author{Olivier Thauvin}
\email{olivier.thauvin@aerov.jussieu.fr}
\institution{
  \includegraphics*[height=0.3\textheight]{darcs}
}

\NoFrenchBabelItemize

\begin{document}
    \maketitle

    \part{Introduction}

    \begin{slide}{Plan}
    \begin{itemize}
      \item Darcs
    \end{itemize}
    \end{slide}

    \part{Présentation}

    \begin{slide}{darcs}
    \begin{itemize}
    \item \url{http://darcs.net/}
    \item code sous GPL
    \item Ecrit en haskell (http://www.haskell.org)
        \begin{itemize}
            \item langage fonctionel pur
            \item langage compilé
        \end{itemize}
    \item code sous darcs
    \end{itemize}
    \end{slide}

    \begin{slide}{Concept}
    \begin{itemize}
        \item VCS complètement décentralisé
        \begin{itemize}
            \item copie de travail = dépôt
            \item chaque dépôt est une branche
            \item techniquement, pas de dépôt central
        \end{itemize}
        \item le contenu est la résultante d'une série de patchs
        \begin{itemize}
            \item pas d'ordre strict dans les patchs
            \item dépendences entre patch
            \item échange des patchs entre les dépôts
        \end{itemize}
        \item un patch est un groupe de modifications
    \end{itemize}
    \end{slide}

    \begin{slide}{structure d'un dépôt}
    Un seul répertoire \verb+_darcs+ à la racine

    \begin{itemize}
        \item \verb+current/+: l'arbre de référence (pristine tree)
        %%\item \verb+inventories/+: FIXME
        \item \verb+inventory+: la liste des patchs
        \item \verb+patches/+: les patchs
        \item \verb+prefs/+: les préférences utilisateur
    \end{itemize}
    \end{slide}

    \begin{slide}{Les patchs}
    un patch:
    \begin{itemize}
        \item un id unique généré par darcs
        \item un nom, identifiant
        \item une description (optionnelle)
        \item le nom (mail) de l'auteur
        \item une signature gpg (optionelle)
        \item une date
        \item une série de modifications (le patch lui même)
    \end{itemize}
    \end{slide}

    \begin{slide}{cas: travail en solitaire}
    On veut juste avoir un historique des fichiers:
    \bigskip
    \begin{figure}[htb]
    \includegraphics*[width=0.8\textwidth]{depots_solo}
    \end{figure}
    \end{slide}

    \begin{slide}{cas: dépôt de référence}
    Le dépôt de référence:
    \begin{itemize}
        \item décidé comme tel
        \item peut-être accessible en lecture en anonyme
        \item personne ne s'en sert comme copie de travail
    \end{itemize}
    \bigskip
    \begin{figure}[htb]
    \includegraphics*[width=0.8\textwidth]{depots}
    \end{figure}
    \end{slide}
    
    \begin{slide}{cas: plusieurs copies}
    \begin{itemize}
        \item depuis plusieurs machines
        \item on veut juste une synchronisation
    \end{itemize}
    \bigskip
    \begin{figure}[htb]
    \includegraphics*[width=0.8\textwidth]{depots_p2p}
    \end{figure}
    \end{slide}

    \begin{slide}{cas: la vraie vie}
    \begin{figure}[htb]
    \includegraphics*[width=0.8\textwidth]{depots_multi}
    \end{figure}
    \end{slide}

    \part{Avant de commencer}

    \begin{slide}{Création d'un dépôt}
    Nouveau dépôt:

    \verb+darcs initialize+

    \bigskip
    Depuis un dépôt existant

    \verb+darcs get+\\
    \verb+darcs put+
    \end{slide}
    
    \part{Utilisation locale}

    \begin{slide}{Ajout/Suppression de fichier}
    \begin{itemize}
        \item \verb+darcs add+
        \item \verb+darcs remove+
    \end{itemize}
    \bigskip
    Ces opérations sont des patchs\\
    \bigskip
    Dans la pratique cela donne deux changements:
    \begin{enumerate}
        \item ajout/suppression du fichier
        \item ajout/suppression du contenu
    \end{enumerate}
    \end{slide}

    \begin{slide}{enregistrer}
    \verb+darcs record+
    
    \bigskip
    \begin{itemize}
        \item chaque modification peut-être accéptée ou laissée
        \item est purement local
    \end{itemize}
    
    \bigskip
    Choses à savoir:
    \begin{itemize}
        \item Les modifications ont une hiérarchie
    \end{itemize}
    \end{slide}

    \begin{slide}{record: exemple}
    \begin{tiny}
    \begin{verbatim}
$ darcs add prog.hs
$ darcs record
addfile ./prog.hs
Shall I record this patch? (1/?) [ynWsfqadjkc], or ? for help: y
hunk ./prog.hs 1
+#!/usr/bin/runhaskell
+
[...]
+    putStrLn "Hello World"
+
Shall I record this patch? (2/?) [ynWsfqadjkc], or ? for help: y
What is the patch name? add prog.hs
Do you want to add a long comment? [yn] n
Finished recording patch 'add prog.hs'
    \end{verbatim}
    \end{tiny}
    \end{slide}

    \part{Propagation des patchs}

    \begin{slide}{Communiquer son travail}
    
    \begin{itemize}
        \item \verb+darcs push+
        \begin{itemize}
            \item envois les patchs du dépôt vers un autre dépots
            \item nécessite un droit d'écriture sur la destination
            (ssh, dépôt local)
        \end{itemize}
        \item \verb+darcs send+
        \begin{itemize}
            \item envois un plusieurs patch par mail
            \item support de gnupg
            \item le patch peut être extrait dans un fichier "\verb+-o+"
        \end{itemize}
    \end{itemize}
    \end{slide}

    \begin{slide}{Récupérer le travail des autres}
    
    \begin{itemize}
        \item \verb+darcs pull+
        \begin{itemize}
            \item récupère les patchs d'un dépôt et les applique localement
        \end{itemize}

        \item \verb+darcs apply+
        \begin{itemize}
            \item applique un patch créer par \verb+darcs send+
        \end{itemize}
    \end{itemize}
    \end{slide}


    
\end{document}
