Skip to content

Entries tagged "hg".

Mieux gérer ses dépôts mercurial

Vous connaissez sûrement github et bitbucket, c'est très pratique pour hoster des projets qui sont gérés avec git ou mercurial. Mais peut-être que vous préférer hoster ça chez vous, parce que c'est plus marrant, plus souple, tout ça.

Pour ce qui est des projets qui sont gérés avec git, on peut utiliser gitosis (voir ce billet pour plus d'informations sur son installation et son utilisation) avec un cgit/gitweb, ou carrément récupérer le code source de gitorious (ici) et se référer au README.

Le billet n'a pas pour but de parler de ces méthodes, vu qu'il existe sufissament d'informations à propos de celles-ci. Nous allons plutôt voir trois méthodes pour faire de même avec Mercurial.

hg-git

La première, assez évidente, consiste à convertir le dépôt mercurial en un dépôt git, et simplement utiliser n'importe quelle méthode citée ci dessus pour gérer le dépôt git.

Pour cela, il faut utiliser hg-git qui vous permettra de garder votre dépôt mercurial, et de pusher/puller comme si c'était git. Les instructions sur le site de hg-git sont assez claires je pense et je ne vais pas les répéter ici.

hg-git nous permet aussi de convertir nos anciens dépôts git en dépôts mercurial si on le souhaite (il suffit de cloner le git), ce qui peut être assez pratique si souhaitez vous rattraper après avoir utiliser git pendant tout un temps.

hgwebdir et l'authentification http

Ici on va plutôt avoir recours à notre serveur web pour gérer l'authentification, et ça va nous permettre d'autoriser le push via le port 80, ce qui peut être pratique quand les autres ports sont bloqués.

La configuration se fait donc au niveau de votre serveur web, avec par exemple mod_auth pour lighttpd et auth_basic pour nginx.

Ainsi, la conf lighttpd ressemblera à ceci:

$HTTP["host"] == "hg.foo.bar" {
    server.document-root = "/usr/local/www/foo/hg"
    server.name = "%3%0"

    cgi.assign = ( ".cgi" => "/usr/local/bin/python" )
    url.rewrite-once = ("^(/hgwebdir.cgi/.*)$" => "$1", "^(/.*)$" => "/hgwebdir.cgi$1" )

    auth.backend = "htpasswd"
    auth.backend.htpasswd.userfile = "/usr/local/etc/hg.passwd"

    $HTTP["querystring"] =~ "cmd=unbundle" {
        auth.require = (   "" => (
            "method"  => "basic",
            "realm"   => "mercurial",
            "require" => "valid-user"
            )   
        )   
    }   
}

Pour modifier les options des repos, vous pouvez tout faire dans le fichier .hg/hgrc du repo. C'est par exemple là que vous pouvez indiquer qui aura le droit de push dans ce repo:

[web]
contact = foo
description = foo's repository
allow_push = foo, bar

Il vous reste alors ajouter vos repos dans la conf de hgwebdir.

hg-ssh

Si par contre on peut se passer du push via le port 80, il est possible d'imiter le comportement de gitosis avec hg-ssh, un script fourni avec mercurial (dans /usr/local/share/mercurial/contrib/hg-ssh sous FreeBSD, disponible ici si vous ne l'avez pas).

Ce script, combiné avec une bonne configuration du ~/.ssh/authorized_keys, vous permet de définir quel utilisateur peut pusher où, avec une authentification basée sur les clés ssh. C'est donc exactement le même principe que gitosis.

Il faut d'abord créer un utilisateur hg, qui ne va servir qu'à gérer nos repo avec hg-ssh. Il faut aussi que le script hg-ssh soit dans le path, si ce n'est pas le cas, placez le par exemple dans /home/hg/bin/ et ajoutez ce répertoire dans le path de l'utilisateur hg.

Pour permettre à un utilisateur de pusher sur un ou plusieurs repos on peut donc ajouter la ligne suivante dans le ~/.ssh/authorized_keys de l'user hg:

command="hg-ssh repo1 repo2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding <la clé ssh de l'utilisateur>

Et comme on est des grosses feignasses et qu'on veut pas avoir besoin de gérer ce fichier à la main, rien de tel qu'un petit script qui fait le tout à notre place.

Par exemple, pour ajouter l'utilisateur foo et le repo bar, en écriture par foo, il suffit de faire:

% hg-ssh.sh add foo bar
% hg-ssh.sh add_key foo `cat foo.pub`
% hg-ssh.sh dump > ~/.ssh/authorized_keys

Vous pouvez aussi supprimer des utilisateurs, modifier les droits des utilisateurs sur les repos etc. Je pense que l'aide est assez complète pour cela:

% hg-ssh help
hg-ssh.sh command args
commands:
  list                  lists all the users and their repos
  add user [repos]      give write-access to the repos for user, create the 
                        user or the repos if needed
  dump                  dump the new authorized_keys file
  add_key user ssh-key  add the key to the user's keys
  del_user user         delete an user
  del_repos repos       remove repositories from hard drive and configuration
  del_write user repo   remove the write access of one user to a repo
  help:                 print this help screen

Une fois le tout bien configuré, vous pourrez pusher via ssh, même en n'ayant pas de compte sur le serveur:

% hg push ssh://hg@hg.foo.bar/repo

Pour rendre les repos visibles de l'extérieur, vous devrez utiliser hgwebdir, comme vu plus haut, et la conf au niveau des infos sur les repos se fera aussi dans le .hg/hgrc des repos dans le home de l'utilisateur hg.

Voilà donc trois façons de mieux gérer vos repos avec mercurial. Je n'ai pas vraiment été dans les détails pour ce billet, donc si vous avez des questions n'hésitez pas.