%%% BEGIN BEAMER PREAMBLE %%%
\documentclass[green]{beamer}
\usepackage{bm, fourier, anyfontsize}



\mode<presentation>
{
  \usetheme{boxes}
  \usecolortheme{crane}
}
\beamertemplatenavigationsymbolsempty

\usepackage{times}
%%% END BEAMER PREAMBLE %%%




%%% BEGIN METADATA %%%

\author{Jordi G. H. $\langle$jordigh@octave.org$\rangle$ \\
  ~  \\
  hg clone http://hg.octave.org/evolve-talk}


\title{Changeset Evolution in Mercurial}
\subtitle{Edit commits as a team!}
\date{}

%%% END METADATA%%%

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}
  {\Large \textbf{Problems that Evolve is trying to solve}}
  \pause
  \textbf{Problem 1}: Recovering from upstream rewrite (rebase)
  \pause
  \begin{quote}
    Rebasing (or any other form of rewriting) a branch that others
    have based work on is a bad idea: anyone downstream of it is
    forced to manually fix their history.
  \end{quote}
  ... from git-rebase(7)
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3in]{rebase1}
  \end{center}
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3in]{rebase2}
  \end{center}
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3in]{ohcrap}
  \end{center}
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3in]{rebase3}
  \end{center}
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3in]{rebase4}
  \end{center}
\end{frame}

\begin{frame}
  \begin{center}
    \pgfimage[height=3.69in]{git-rebase}
  \end{center}
\end{frame}


\begin{frame}
  {\Large \textbf{Problems that Evolve is trying to solve}}
  \textbf{Problem 2}: Some commits are historical record, should not be rewritten
  \pause
  \begin{table}
    \pgfimage[width=4in]{histedit}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Problems that Evolve is trying to solve}}
  \textbf{Problem 3}: Safely sharing rewritten commits with remote repos
  \pause
  \begin{table}
    \pgfimage[width=4in]{lol-jenkins}
  \end{table}
\end{frame}

\begin{frame}
  \begin{table}
    \pgfimage[height=3in]{git-force-push}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Problems that Evolve is trying to solve}}
  \begin{enumerate}
    \item Recovering from upstream rewrite (rebase)
    \item Some commits are historical record, should not be rewritten
    \item Safely sharing rewritten commits with remote repos
  \end{enumerate}
  \pause
  Evolve provides a clean, consistent UI to solve these problems.
\end{frame}

\begin{frame}
  \begin{table}
    \pgfimage[height=2in]{hg-logo}
  \end{table}
  Mercurial Evolve to the rescue!
\end{frame}

\begin{frame}
  {\Large \textbf{Evolve basics}}
  When you enable Evolve, you get a few extra commands:

  \begin{columns}
    \column{0.3 \textwidth}
    \begin{itemize}
      \item \texttt{amend}
      \item \texttt{fold}
      \item \texttt{previous}
      \item \texttt{next}
      \item \texttt{prune}
      \item \texttt{uncommit}
      \item \texttt{restore}
    \end{itemize}
    \pause
    \column{0.7 \textwidth}
    \begin{itemize}
      \item \texttt{hg commit -{}-amend}
      \item can be done with \texttt{hg histedit}
      \item \texttt{hg update -r 'parents()'}
      \item \texttt{hg update -r 'children()'}
      \item \texttt{hg strip}
      \item \texttt{hg strip -{}-keep}
      \item \texttt{hg unbundle strip-backup/...}
    \end{itemize}
  \end{columns}
  \begin{center}
    {\large These are very scriptable!}
  \end{center}
\end{frame}

\begin{frame}
  {\Large \textbf{Evolve basics}}
  For reference, these are the rough git equivalents:
  \begin{columns}
    \column{0.3 \textwidth}
    \begin{itemize}
      \item \texttt{amend}
      \item \texttt{fold}
      \item \texttt{previous}
      \item \texttt{next}
      \item \texttt{prune}
      \item \texttt{uncommit}
      \item \texttt{restore}
    \end{itemize}
    \column{0.7 \textwidth}
    \begin{itemize}
      \item \texttt{git commit -{}-amend}
      \item can be done with \texttt{git rebase -i}
      \item \texttt{git checkout HEAD\^}
      \item Nothing simple, must use log or reflog
      \item \texttt{git reset -{}-hard HEAD\^}
      \item \texttt{git reset -{}-soft HEAD\^}
      \item Nothing simple, must use reflog
    \end{itemize}
  \end{columns}
\end{frame}

\begin{frame}
  {\Large \textbf{Evolve's core}}
  There's also a shiny, new command that does magic:
  \begin{center}
    {\Large \texttt{hg evolve}}
  \end{center}
  \begin{table}
    \pgfimage[height=2in]{logo-evolve}
  \end{table}
  \begin{center}
    \begin{itemize}
      \pause
      \item
      Basically, automatically fixes any problems
      \item
      recovers from upstream rebase (solves Problem 1)
    \end{itemize}
  \end{center}
\end{frame}

\begin{frame}
  {\Large \textbf{Immutable history}}
  What about things that are set in stone?
  \begin{table}
    \pgfimage[width=4in]{set-in-stone}
  \end{table}
  \pause
  Evolve knows how to work with phases! (solves Problem 2)
  \pause
  \begin{itemize}
    \item public (immutable)
    \item draft (editable)
  \end{itemize}
\end{frame}

\begin{frame}
  \begin{center}
    Let's see Evolve in action!

    \fontsize{68}{80}\selectfont \lefthand
  \end{center}
\end{frame}

\begin{frame}
  {\Large \textbf{What about Problem 3? (sharing safely)}}

  So far we've been doing this alone, but...

  \begin{itemize}
    \pause
    \item What about sharing with others?
    \pause
    \item Those revision numbers skipping around?
  \end{itemize}

\end{frame}

\begin{frame}
  {\Large \textbf{Evolve under the hood}}
  \begin{itemize}
    \item All Evolve operations are \emph{append-only}.
    \pause
    \item Pre-edited commits stick around. They're only marked as obsolete.
    \pause
    \item Commits may be obsoleted by another overwriting commit.
    \begin {itemize}
      \item \texttt{fold} (\texttt{squash})
      \item \texttt{amend}
    \end{itemize}
    \pause
    \item Commits may just be plain obsolete with nothing to replace them.
    \begin{itemize}
      \item \texttt{prune}
    \end{itemize}
    \pause
    \item Evolve knows how to propagate all this info across clones!
  \end{itemize}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-1}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-2}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-3}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-4}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-5}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-6}
  \end{table}
\end{frame}

\begin{frame}
  {\Large \textbf{Sharing with Evolve}}
  \begin{table}
    \pgfimage[width=4in]{evolve-7}
  \end{table}
\end{frame}

\begin{frame}
  \begin{center}
    Let's see Evolve sharing commits around!

    \fontsize{68}{80}\selectfont \lefthand
  \end{center}
\end{frame}

\begin{frame}
  {\Large \textbf{Evolve's solutions}}
  \begin{enumerate}
    \item Recovering from upstream rewrite (rebase)
    \pause
    \begin{itemize}
      \item \emph{Solution}: \texttt{hg evolve}
    \end{itemize}
    \pause
    \item Some commits are historical record, should not be rewritten
    \pause
    \begin{itemize}
      \item \emph{Solution}: Public and draft phases
    \end{itemize}
    \pause
    \item Safely sharing rewritten commits with remote repos
    \pause
    \begin{itemize}
      \item \emph{Solution}: Obsolescence markers
    \end{itemize}
  \end{enumerate}
\end{frame}

\begin{frame}
  \begin{center}
    \fontsize{58}{70}\selectfont Questions?
  \end{center}
\end{frame}

\end{document}