% $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{Présentation}
        \item{Avant de commencer}
        \item{Utilisation locale}
        \item{Propagation des patchs}
        \item{Organiser ses dépôts}
        \item{Autour de darcs}
    \end{itemize}
    \end{slide}

    \part{Présentation}

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

    \begin{slide}{Pourquoi darcs ?}
    \begin{itemize}
        \item simple à mettre en place
        \item simple à utiliser
        \item travail en mode déconnecté
        \item permet de "forker" facilement
    \end{itemize}
    \bigskip
    \begin{itemize}
        \item mal adapté aux gros dépôts
        \item demande parfois énormément de temps CPU
        \item ne permet pas (encore) de faire tout ce que d'autres VCS font
    \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}{Dans la pratique}
    \begin{enumerate}
        \item récupération des dernière modifications
        \item travail sur le code et on enregistrement au fur et à mesure
        \item séléction et envoi des modifications
    \end{enumerate}
    \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}{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}

    \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
    \begin{itemize}
    \item \verb+darcs get+\\
    \footnotesize{initialise un dépôt depuis un dépôt existant}

    \item \verb+darcs put+\\
    \footnotesize{copie le dépôt courant vers un nouveau dépôt}
    \end{itemize}
    \end{slide}
    
    \part{Utilisation locale}

    \begin{slide}{Ajout/Suppression de fichiers}
    \begin{itemize}
        \item \verb+darcs add+
        \item \verb+darcs remove+
		\item \verb+darcs mv+
    \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 darcs gère les dépendances entre les modifications
        \item il est possible de rajouter des dépendances explicites
    \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}

    \begin{slide}{Lister les changements}
    \verb+darcs changes+
    \begin{itemize}
        \item listes les patchs dans du dépôt
        \item peut afficher un sommaire, ou le patch complet
    \end{itemize}

    \bigskip
    \verb+darcs diff+
    Produit un diff entre la copie de travail et le dépôt.

    \bigskip
    \verb+darcs annotate+
    Produit une sortie avec pour chaque ligne le patch d'origine.

    \bigskip
    \verb+darcs query+ \textit{commande}
    \begin{itemize}
        \item{manifest} liste les fichiers sous darcs
        \item d'autres commandes dans le futur
    \end{itemize}

   \end{slide}

    \begin{slide}{darcs changes: exemple}
darcs changes
\begin{tiny}
\begin{verbatim}
Sat Feb 11 15:43:38 CET 2006  Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>
  * read config in /etc

Sat Feb 11 14:50:25 CET 2006  Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>
  * allow to change project passwd
\end{verbatim}
\end{tiny}
darcs changes \verb+--+summary
\begin{tiny}
\begin{verbatim}
Sat Feb 11 15:43:38 CET 2006  Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>
  * read config in /etc

    M ./www/index.php +1

Sat Feb 11 14:50:25 CET 2006  Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>
  * allow to change project passwd

    M ./templates/showproject.tpl +18
    M ./www/index.php +7
\end{verbatim}
\end{tiny}
    \end{slide}

    \begin{slide}{darcs diff: exemple}
darcs diff
\begin{tiny}
\begin{verbatim}
diff -rN old-tools/forge-addproject new-tools/forge-addproject
11c11
<     list($opt, $args) = getopt(array('d:' => 'd', 'u:' => 'u'));
---
>     list($opt, $args) = GetOptions(array('d:' => 'd', 'u:' => 'u'));
\end{verbatim}
\end{tiny}
    \end{slide}

    \begin{slide}{darcs annotate: exemple}
\begin{tiny}
\begin{verbatim}
# File forgeq created by [add forgeq (query) script
# Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>**20060205022127]  as ./forgeq
# Following line added by [add forgeq (query) script
# Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>**20060205022127]
 #!/usr/bin/php
# Following line added by [add forgeq (query) script
# Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>**20060205022127]
 <?php
# Following line added by [query user-group-projet
# Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>**20060206025410]

# Following line added by [find path to modules
# Olivier Thauvin <olivier.thauvin@aerov.jussieu.fr>**20060208035122]
     include realpath(dirname(__FILE__)) . '/modules/commandline.inc';
[...]
\end{verbatim}
\end{tiny}
    \end{slide}

	\begin{slide}{Revenir en arrière}
	\begin{itemize}
		\item \verb+rollback+

		Créer un patch inverse d'un autre patch (annule un patch)

		\item \verb+unrecord+

		Efface un ou plusieurs patch(s), comme si le patch n'avait pas été pas enregistré

		\item \verb+unpull+

		Efface un ou plusieurs patch(s) et les modifications, comme si les
		modifications n'avaient jamais existées

	\end{itemize}

	\bigskip
	Seul \verb+rollback+ est utilisable lorsque le patch a été diffusé.
	\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}

    \part{Organiser ses dépôts}

    \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{Autour de darcs}

    \begin{slide}{Web apps}
    \begin{itemize}
    \item DarcsWeb:

    Visualiseur de dépôt darcs ecrit en python (inspiré de gitweb)

    \bigskip
    \item Trac:

    Ensemble d'outils pour la gestion de code (wiki, bug report,
    navigateur de code).

    D'abord fait pour subversion, un patch pour darcs est en cours 
    d'intégration
    \end{itemize}
    \end{slide}

    \begin{slide}{darcsweb}
    \begin{figure}[htb]
    \includegraphics[width=80mm]{darcsweb}
    \end{figure}
    \end{slide}

    \part{Conclusion}
    \begin{slide}{En résumé}
    Darcs est jeune mais il fonctionne\\
    La documentation est complète\\
    Rends plus facile la gestion des branches

    \bigskip
    Questions ?
    \end{slide}

\end{document}
