dburrows/ blog/ entry/ from-blogspot/ aptitude development moves to Mercurial, back to Alioth

Short version: the aptitude development tree is now maintained using Mercurial, go here to fetch it.

aptitude development has been using darcs as a version control system for the last two years. Darcs is a distributed version control system with many great concepts -- but it has one huge, glaring, enormous flaw, which is that innocuous operations, like merging one branch into another, can require practically unbounded amounts of time and space. And once two branches get screwed up in this way, there is nothing, nothing at all, that you can do to get yourself unwedged; the cause is a design flaw in darcs that no-one seems to know how to fix or work around.

Recently, I made the mistake of changing some files in both the Debian branch of aptitude and the head branch, and when I tried to merge the two branches to upload a new upstream release, darcs went off into la-la land. So, I figured that it was probably time to switch version control systems.

I'd like to say that I did extensive research on the matter, but the truth is that I chose Mercurial based on the fact that (A) a lot of ex-darcs users have written nice things about it, (B) git and arch-derived systems always feel ugly to me, and (C) John Goerzen implemented support for mercurial on Alioth. Yes, I am so a follower.

So if you want the up-to-date aptitude source, you should go to http://hg.debian.org/hg/aptitude/head. You can also fetch an RSS feed from http://hg.debian.org/hg/aptitude/head?style=rss.

You can fetch a copy of the repository with "hg clone http://hg.debian.org/hg/aptitude/head aptitude-head". To update, I recommend putting the following lines in ~/.hgrc to enable the "fetch" extension:

[extensions] hgext.fetch =

Once you've done this, just run "hg fetch" and it should download and merge the latest code. You may want to install kdiff3 to get a better merge tool as well.

To commit a patch locally, run "hg commit". Unfortunately, there doesn't seem to be any easy way for people to send patches back within the VCS like there is for darcs (one of many nice features I had to give up in favor of being able to actually get work done -- what, me bitter?), but it looks like you can get somewhere with "hg bundle <file>", then mailing the resulting file off.

Comment by tonfa at 2:06 AM:

You can use the patchbomb extension (the command line is 'hg email ...') to send patches back. I think you can choose to send either bundle+plain text diff, or just plain text diff.

Comment by Anonymous at 2:07 AM:

Please don't lump git together with arch. Git has improved significantly in usability, and as of version 1.5 Git easily rivals any other version control system for usability. In particular, many of the tools tell you what you might want to run next ("git status" will almost always provide a logical next step), git-add now works for both new files and new content in an existing file, a nice commit gui git-gui exists, and lots of other usability polishing has occurred.

Alioth works quite well with Git; the Xorg packages use Git with the pkg-xorg Alioth project.

Git makes it far easier to work with multiple branches than mercurial does. Mercurial forces you to have multiple copies of a repository in order to have multiple branches; it enforces a one-working-copy one-branch model. Git allows you to have any number of branches in one repository, and you can create, work with, merge, delete, and rebase branches with incredible speed.

Darcs has worked with Git in the past; in particular, Darcs has an experimental Git repository backend. Many Darcs developers have said good things about Git.

Git has performance as one of its primary design goals. Merging in particular performs incredibly well. Meanwhile, mercurial still has several common operations that require time proportional to the number of commits when they should not.

Git would give you the feature you miss from darcs: integrated patch sending and patch mail application. git-format-patch, git-send-email, and git-am provide everything you need to work with emailed patches. You can also use git-imap-send to drop patch mails in an IMAP drafts folder.

Comment by Anonymous at 3:17 AM:

John Goerzen also wrote a plug-in to have a send function similiar to darcs.


This extension is used to make it easy to send changesets upstream as bundles.

It works like hg bundle, but integrates attaching the generated bundle into an email. This provides a functionality similar to darcs send.

The result is that a user can simply run "hg send", and Mercurial automatically figures out what changesets are missing remotely and sends them."