\documentclass{article}
\usepackage{ulem}
\usepackage{graphicx}
\usepackage{hyperref}
\pagestyle{headings}
\begin{document}
\part{Options for replacing CVS for Horde Development}
\section{Decision}
** We have decided to keep the current history and structure in CVS, and create a new Git repository. Code will be committed to the Git repository as it is cleaned up for PHP 5 and Horde 4. **

\section{Introduction to distributed version control systems}
\begin{itemize}
\item <a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/</a>


\item <a href="http://www.infoq.com/articles/dvcs-guide">http://www.infoq.com/articles/dvcs-guide</a>


\end{itemize}
\section{Description}
This project is to determine what the next generation of the Horde will use to store and organize source code.<br />
Some initial work has been done with Git and SVN conversions of the current CVS repository.

\section{Requirements}
\subsection{Must-haves}
\begin{itemize}
\item Offline review of local changes


\item Ability to hook into Whups for ticket updates from commit messages


\item Stable, mature codebase


\item Functional, usable user interface


\end{itemize}
\subsection{Nice-to-haves}
\begin{itemize}
\item Submodule support


\end{itemize}
\begin{quote}
Today checking out a Horde app within an existing Horde checkout works fine.  This includes making single-commit changes across applications.


\end{quote}
\begin{itemize}
\item Browseable by Chora


\end{itemize}
\begin{quote}
Naturally no matter what we choose Chora support will either be added or will improve.  However if it is already supported by Chora all the better.


\end{quote}
\section{The Contenders}
In alphabetical order...


\noindent\rule{\textwidth}{1pt}
\subsection{Bazaar}
Bazaar from Canonical (i.e. the ubuntu company)

\begin{itemize}
\item <a href="http://bazaar-vcs.org/">http://bazaar-vcs.org/</a>


\end{itemize}
\subsubsection{Advantages}
\begin{itemize}
\item Seems to preserve the most metadata per-commit of any SCM listed here


\end{itemize}
\subsubsection{Disadvantages}
\begin{itemize}
\item Somewhat specific to Launchpad/Ubuntu development process


\end{itemize}
\subsubsection{Well-known users}
\begin{itemize}
\item Canonical/Ubuntu


\end{itemize}

\noindent\rule{\textwidth}{1pt}
\subsection{Git}
<a href="http://git.or.cz/">http://git.or.cz/</a><br />
<a href="http://www.opensolaris.org/os/community/tools/scm/git-report-final.txt">http://www.opensolaris.org/os/community/tools/scm/git-report-final.txt</a><br />
<a href="http://www.gitcasts.com/git-talk">http://www.gitcasts.com/git-talk</a>

\subsubsection{Setup}
<pre><code>
\#!/usr/bin/env sh

cd /var/www/git/horde/
export CVSROOT=":pserver:cvsread@anoncvs.horde.org:/repository"

FILES="agora
ansel
chora
<SNIP>
whups
wicked"

for FILE in \$FILES
do
    echo \$FILE": "
    git-cvsimport -C\$FILE \$FILE
done
</code></pre>
\subsubsection{Submodules}
I added a git submodule for every horde module inside the horde/horde<br />
repository. Now you can do:

<pre><code>
git clone git://git.koch.ro/git/horde/horde
cd horde
git submodule init

foreach modules as MODULE // Only those you want to use
  git submodule update \$MODULE      // checks out the module
</code></pre>
Now there are some more things[1] to think about when actually developing, but<br />
that's one way it could be done.

\begin{itemize}
\item <a href="http://git.or.cz/gitwiki/[GitSubmoduleTutorial](GitSubmoduleTutorial)">http://git.or.cz/gitwiki/[GitSubmoduleTutorial](GitSubmoduleTutorial)</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html">http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html</a>


\end{itemize}
\subsubsection{Disk space}
<pre><code>
ls -C -w60
agora      goops      jonah      nag            swoosh
ansel      groupware  juno       nic            trean
chora      hermes     klutz      occam          turba
CVSROOT    horde      kronolith  passwd         ulaform
dimp       hordedoc   luxor      pearweb        update.sh
forwards   hordeweb   merk       presentations  vacation
framework  imp        midas      sam            vilma
genie      incubator  mimp       scry           volos
gitgc.sh   ingo       mnemo      sesha          whups
gollem     jeta       mottle     skeleton       wicked

/var/www/git/horde\$ du -hs
928M
</code></pre>
\subsubsection{Advantages}
\begin{itemize}
\item Distributed nature allows offline commits and easy branching


\end{itemize}
\subsubsection{Disadvantages}
\begin{itemize}
\item Does not preserve history across file or directory renames


\item Aimed at large-scale codebases with emphasis on features for those users (ie. Linux Kernel)


\end{itemize}
\subsubsection{Well-known users}
\begin{itemize}
\item Linux Kernel


\end{itemize}

\noindent\rule{\textwidth}{1pt}
\subsection{Mercurial}
Alternative distributed versioning control system.

\subsubsection{Advantages}
\begin{itemize}
\item Distributed nature allows offline commits and easy branching


\end{itemize}
\subsubsection{Disadvantages}
\begin{itemize}
\item Toolset possibly less mature than other products


\end{itemize}
\subsubsection{Well-known users}
\begin{itemize}
\item OpenSolaris


\end{itemize}

\noindent\rule{\textwidth}{1pt}
\subsection{Subversion}
\begin{itemize}
\item Chuck Hagenbuch has done some work on writing svn post-commit hooks. These likely can be reused for other SCM systems as well.


\item Ben Klang has dome some test conversions of the CVS repository to SVN.  The repository size is indeed much larger.  In addition submodule support (as we use it today) has not been proven to the satisfaction of the developers.


\end{itemize}
\subsubsection{Well-known users}
\begin{itemize}
\item Asterisk


\item KDE


\end{itemize}
\subsubsection{Previous discussion re: migrating Horde to SVN: <a href="http://bugs.horde.org/ticket/5284">http://bugs.horde.org/ticket/5284</a>}

\noindent\rule{\textwidth}{1pt}
\section{People}
While all Horde developers are interested in this project's final recommendation the following people have done work toward making a decision on the next SCM to be used for Horde:

\begin{itemize}
\item Ben Klang


\item Chuck Hagenbuch


\end{itemize}
\section{Resource Utilization Comparison}
\subsection{Ingo}
<table class="horde-table">SCM & Full (Server) Repository Size & Branch Checkout \\
\hline
CVS & 51MB & 7MB \\
\hline
SVN & 31MB & 16MB \\
\hline
git* & 18MB & 18MB \\
\hline
</table>
\subsection{Beatnik}
<table class="horde-table">SCM & Full (Server) Repository Size & Branch Checkout \\
\hline
CVS & 736KB & 700KB \\
\hline
SVN & 1.7MB &  \\
\hline
Mercurial & 724KB &  \\
\hline
</table>
\begin{itemize}
\item Note that for Git, repo size and checkout size are the same.


\end{itemize}
\section{Resources}
\subsection{Bazaar Links}
\begin{itemize}
\item <a href="http://www.markshuttleworth.com/archives/125">http://www.markshuttleworth.com/archives/125</a>


\end{itemize}
\subsection{Git Links}
\begin{itemize}
\item <a href="http://git.or.cz/gitwiki/[GitSvnComparsion](GitSvnComparsion)">http://git.or.cz/gitwiki/[GitSvnComparsion](GitSvnComparsion)</a>


\item <a href="http://git.or.cz/course/svn.html">http://git.or.cz/course/svn.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/gitcvs-migration.html">http://www.kernel.org/pub/software/scm/git/docs/gitcvs-migration.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial-2.html">http://www.kernel.org/pub/software/scm/git/docs/gittutorial-2.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html">http://www.kernel.org/pub/software/scm/git/docs/user-manual.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/glossary.html">http://www.kernel.org/pub/software/scm/git/docs/glossary.html</a>


\item <a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html">http://www.kernel.org/pub/software/scm/git/docs/everyday.html</a>


\item <a href="http://blog.moertel.com/articles/2007/12/10/how-i-stopped-missing-darcs-and-started-loving-git">http://blog.moertel.com/articles/2007/12/10/how-i-stopped-missing-darcs-and-started-loving-git</a>


\item <a href="http://hopper.squarespace.com/blog/2008/7/5/converting-mercurial-to-git.html">http://hopper.squarespace.com/blog/2008/7/5/converting-mercurial-to-git.html</a>


\item <a href="http://bergie.iki.fi/blog/feature\_branches\_in\_midgard\_development\_with\_git/">http://bergie.iki.fi/blog/feature\textbackslash\{\}\_branches\textbackslash\{\}\_in\textbackslash\{\}\_midgard\textbackslash\{\}\_development\textbackslash\{\}\_with\textbackslash\{\}\_git/</a>


\item <a href="http://stackoverflow.com/questions/101752/aborting-a-merge-in-git">http://stackoverflow.com/questions/101752/aborting-a-merge-in-git</a>


\end{itemize}
\subsection{Mercurial Links}
\begin{itemize}
\item <a href="http://www.selenic.com/mercurial/wiki/">http://www.selenic.com/mercurial/wiki/</a>


\item <a href="http://www.linux.com/feature/121157">http://www.linux.com/feature/121157</a>


\item <a href="http://www.opensolaris.org/os/community/tools/scm/dcm\_evaluation\_mercurial/">http://www.opensolaris.org/os/community/tools/scm/dcm\textbackslash\{\}\_evaluation\textbackslash\{\}\_mercurial/</a>


\item <a href="http://www.selenic.com/mercurial/wiki/index.cgi/[HgWebDirStepByStep](HgWebDirStepByStep)">http://www.selenic.com/mercurial/wiki/index.cgi/[HgWebDirStepByStep](HgWebDirStepByStep)</a>


\item <a href="http://www.selenic.com/mercurial/wiki/index.cgi/[PublishingRepositories](PublishingRepositories)">http://www.selenic.com/mercurial/wiki/index.cgi/[PublishingRepositories](PublishingRepositories)</a>


\end{itemize}

\noindent\rule{\textwidth}{1pt}
Back to the <a href="https://wiki.horde.org/Project">Project List</a>

\end{document}
