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.
Article original écrit le 25 avril 2010