Mercurial Hosting using hg-admin-tools over SSH ++++++++++++++++++++++++++++++++++++++++++++++++++ :Posted: 2008-05-19 23:23 :Tags: Hosting, Mercurial In this article we'll set up mercurial hosting over SSH. This is very similar to the `Subversion setup `_ described earlier but we'll also make use of LShift's ``hg-admin-tools`` to automate some parts of the set up. *I've got to say I don't really understand the ssh-agent instructions from the README so this is my best stab. If it is wrong please let me know. There are some instructions here http://kb.iu.edu/data/aeww.html* First install mercurial, set up a new user and ensure you have Python 2.5:: apt-get install python2.5 python2.5-dev mercurial adduser hgadmin Then give the ``hgadmin`` user sudo priviledges with ``visudo`` before becoming ``hgadmin`` and moving to the home directory:: visudo su hgadmin cd Create a ``.ssh`` directory:: mkdir ~/.ssh You'll also need an updated version of mercurial otherwise an import fails later on:: wget http://www.backports.org/debian/pool/main/m/mercurial/mercurial_0.9.5-2~bpo40+1_amd64.deb sudo dkpg -i mercurial_0.9.5-2~bpo40+1_amd64.deb At this point you need to have ssh-agent running and set up. Create a new key pair and copy the public key to the server like this:: james-gardners-macbook-air:~ james$ ssh-keygen -t dsa -f ~/.ssh/id_dsa -C "james@macbook.3aims.com" Generating public/private dsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/james/.ssh/id_dsa. Your public key has been saved in /Users/james/.ssh/id_dsa.pub. The key fingerprint is: 46:1e:48:06:b4:cd:ff:c7:e0:2e:db:77:59:5e:d0:0d james@macbook.3aims.com james-gardners-macbook-air:~ james$ scp ~/.ssh/id_dsa.pub hgadmin@78.47.146.254:.ssh/authorized_keys hgadmin@78.47.146.254's password: james-gardners-macbook-air:~ james$ scp ~/.ssh/id_dsa hgadmin@78.47.146.254:.ssh/ hgadmin@78.47.146.254's password: Now you should be able to login as hgadmin using the password you set on your private key:: ssh hgadmin@78.47.146.254 Set up ssh-agent (I don't know why we are doing this bit really but the install fails without it:: exec `ssh-agent` ssh-add This will add the ``.ssh/id_dsa`` key to ssh-agent so that in the next step when we run ``install``, it will be added correctly when the command ``ssh-add -L`` is called: We need to get the ``hg-admin-tools``:: mkdir ~/lib cd ~/lib hg clone http://hg.opensource.lshift.net/hg-admin-tools Make sure there isn't already an ``hg`` user then run this:: cd hg-admin-tools ./install This creates a new user called ``hg`` without password signins and runs ``hginit`` to setup the ``hgadmin`` repository. Changing Permissions ============================== Now that the software is installed you need to know how to administer it. Back on the machine you signed in from (in my case the Macbook) you can checkout the ``hgadmin`` repository:: hg clone http://hg@78.47.146.254/hgadmin This works because the same key you used for password-less signin to the ``hgadmin`` account has been setup by the ``hginit`` script to allow you to signin with the same key to the ``hg`` user account. Creating New Repositories ===================================== Users authorized to do so (such as yourself) can create new repositories like this:: mkdir new-repository cd new-repository hg init hg clone . ssh://hg@78.47.146.254/my-project-name You can then do things like this:: hg add * hg commit -m "Adding initial files" hg push ssh://hg@78.47.146.254/my-project-name Then you can check out the changes somewhere else:: hg clone ssh://hg@78.47.146.254/my-project-name new-copy-of-my-new-project or update another checkout with the new changes:: hg pull hg update Each operation involving the server will prompt you for the password for your private key. Back to the README ============================== At this point you should be able to follow the `README `_ again. Particularly the HG-SSH-ACCESS.CONF section. It explains how you can add keys for new developers to the keys directory and configure permissions by changing the ``hg-ssh-access.conf``. hen you check in changes some hooks are run to update the ``.ssh/authorized_keys`` file on the server to work with the new permissions. Web Interface ========================================================== Now let's set up a web interface for the hosting. You can use ``hg serve`` to provide a web interface to a particular repository. For example to serve the ``new-project-name`` repository you would do this:: cd /home/hg/repos/new-project-name hg serve This would start a server on http://localhost:8000 to serve the repository. You can also customise the styles. An easier style to use is gitweb:: hg serve --style gitweb You can create your own styles by copying and modifying an existing template:: sudo cp -r /var/lib/python-support/python2.4/mercurial/templates/gitweb/ /var/lib/python-support/python2.4/mercurial/templates/james hg serve --style james There's documentation on how to do this at http://hgbook.red-bean.com/hgbookch11.html Quick Reference Cards ================================== These are handy too: http://www.ivy.fr/mercurial/ref/v1.0/Mercurial-QuickStart-v1.0-120dpi.png http://www.ivy.fr/mercurial/ref/v1.0/Mercurial-Usage-v1.0-120dpi.png