Darcs vs. Bazaar-NG vs. Mercurial

Just a short comparision of the two systems based on what I’ve read on the web and what I like and dislike about each of them. Note: I haven’t really worked with any of them yet, but I definitely want to use a distributed versioning system for some stuff. This is just a really out of the hand listing of things I noticed while playing around with those systems, so it’s … informal would definitely be an understatement.


Darcs homepage


  • Offers a send system for directly mailing changes on a repository to someone else
  • Offering an HTTP repository without the need for CGI support on the server (only the darcs binary has to run somewhere for the ssh checkin)
  • After playing a little bit with it I like the patch-based approach
  • It seems like you don’t need Cygwin nor GHC installed for Windows


  • Installing Haskell via DarwinPorts on my Powerbook was … a pain. It took for ages.
  • The installation of Darcs via DarwinPorts was even more a problem since ghc (Haskell) was barely motivated and segfault’d every few minutes. Going with binary released like this or the one from fink might be better here (although to me fink appears far less actively developed than DarwinPorts).
  • Requires darcs installed on the server when you want to push your work (But there is a single-file statically linked binary for Linux so it’s not really a problem)


Bazaar-NG homepage


  • Easily extensible
  • Written in Python (sorry, but I know this language while Haskell is also after seeing a presentation of it totally obscure to me)


  • I somehow always have a strange feeling when a company is backing an opensource project. But I guess in this case and with the company being Canonical I can my an exception ;)
  • There is nothing like darcs send to simply send patches to another maintainer
  • Many Python requirement and it still somehow doesn’t work on one of my webservers for no obvious reason.

After some additional searching and some chatting with Keltia on irc://freenode.org/textmate I found out about Mercurial which appears to me somehow like a Python equivalent to Darcs. I just have a few problems with it:

  • If you rename a file, it basically removes and adds the same file with a different name. So the patch between these two revisions would actually hold the binary data of the new/old image, while Darcs (thanks to it's patch dependancy approach) will simply produce a patch with something like
    [rename zerok@local**20060428080113] {
    move ./quicksilver.jpg ./quick.jpg
    Really neat esp. if you move a binary (like in this case).
  • Exporting for binaries doesn't work. It produces a completely broken patch or basically ignores the binary file altogether. At least that's what came out for me, but perhaps I've just messed up something ;) As sad as this sounds: This is a show-stopper for me. The things I wanted to use a DVCS for now always involve the addition of new binary files and code exchange via e-mail (not as the primary way but as a good secondary).
  • It requires CGI enabled on the webserver ideally with suExec. There is also the so-called old-http option but it's not recommended according to the official website.

Esp. the binary patch problem in hg is currently holding me back from using it and probably going with Darcs at least for now. I heard some stories about Darcs not being able to handle bigger repositories all that well, but since I don’t plan to use it for something like that, it shouldn’t be a problem at all :) Bazaar-NG is currently not an option because the SubmitByMail feature as described on their Wiki is not yet available. When bzr gets it, it might become an option for me thanks to its extensibility and that I somehow doubt that it will have problems with bigger repositories since Ubuntu is using it. On the other hand Mercurial looks even more promising thanks to its “lightweightness” and basic support for everything I need. It’s just still a little bit too rough about the edges (esp. handling binary data) for now, but hopefully this will change in the future :)