Persuading mercurial-server to work on Windows

5 Apr 2012


Originally posted at

A few years back, needing decent authentication and key management for Mercurial repositories, we wrote mercurial-server. Recently, we were in the position of wanting to use this with one of our clients, but this time it would need to run under Windows. This was a bit of a problem as it was designed for a Unix-type environment. On the other hand, it’s mostly written in Python, and we could use Cygwin, so how bad could it be?

As it turns out, not too awful. I needed to make a few small modifications, and we’ve now managed to deploy a working mercurial-server under Windows.

Having said that, here’s a BIG FAT WARNING: Windows is not a supported system. We’ve gotten this guide to work ok on Windows 7 and 2003, but the permissions are still broken in various ways to do with the underlying issues in Windows’ permissions system. Unix-based systems, especially Debian and derivatives are still the main target. This is very much a “you break it, you keep both pieces” guide, but patches are welcomed!

Assuming you’ve made it through that proviso, here’s how to do it:

  1. Checkout a copy of mercurial-server from mercurial (obviously!) with

hg clone

and checkout the windows branch 2. Install Cygwin using the setup.exe from there. Tested against 1.7.12-1, may work with earlier versions. You’ll need the base install plus the following additional packages:







Note that even if you’ve already got them installed in Windows, Python and Mercurial still need to be installed in Cygwin. 3. Open a new Cygwin terminal as Adminstrator (under Windows 7, that’s right click on the “Cygwin Terminal” start menu option and pick “Run as administrator”) 4. Run

ssh-host-config -y

cygrunsrv -S sshd

to get sshd running. We need this because there’s no proper su in Cygwin (see the Cygwin FAQ for why this is) 5. Goto the mercurial-server folder and

sh setup-windows

. If you had an external Python installed, this may fail. In which case try


then try again 6. Run

passwd hg

and set the password for the hg user (created by setup-windows), then

mkpasswd -l > /etc/passwd

to add them to the Cygwin password database 7. Run

sh inituser-windows

to finish setting up the hg user 8. Following the example from the main mercurial-server documentation (in that your username is jay and your machine is called spoon), but with a few differences for Cygwin, we can now get you initial access. We assume that you’ve generated a key with PuTTYgen and then copied the contents of the “public key” box into a file called my-key. Run the following, altered as appropriate for your local system:

mkdir -p /etc/mercurial-server/keys/root/jay

cp my-key /etc/mercurial-server/keys/root/jay/spoon

chown hg /etc/mercurial-server/keys/root/jay/spoon

ssh hg@localhost /usr/local/share/mercurial-server/refresh-auth

The rest of the instructions in the normal mercurial-server documentation should now work. Note that although it’s possible to add keys/access info to /etc/mercurial-server it’s much easier to do things via the hgadmin repository (and can be done from places other than the Cygwin-running server), and doing things via /etc should probably be limited to only if you mess up the setup in hgadmin.

Hope that all worked for you! We’d love to hear if anyone else ends up using this out in the field, and anything extra you’ve done to get it working on your particular system.

Previously: NAntScript, now with added functions Next: Visualising your web browsing history