Voici comment publier un ensemble de dépôt Mercurial sur un serveur et pouvoir y accéder via CGI et donc un navigateur web classique. Une fois le dépôt installer il est très facile d'y créer de nouveaux dépôts.
Pré-requis
- un serveur web fonctionnel (ici nous nous baseront sur lighttpd) voir [[linux:debian:webserveur]] pour son installation sur Debian.
- une installation de Mercurial classique
- le script
hgwebdir.cgi
ouhgwebdir.fcgi
inclus avec votre version de Mercurial. Dans une installation Debian il est situé dans le dossier/usr/share/doc/mercurial/examples/
. Il est également disponible à sur le site de Mercurial : hgwebdir.cgi - Dans le cas de l'utilisation de la version fastCGI du script (hgwebdir.fcgi)
il faut également installer le module python
flup
(python-flup
pour Debian)
Préparation du dépôt
Nous supposerons que le dépôt Mercurial sera situé dans le dossier /var/hg
.
Nous allons dans un premier temps créer la structure du dépôt :
# mkdir -p /var/hg/repos
# chown -R www-data:www-data /var/hg
Nous allons ensuite créer le fichier de configuration du dépôt
/var/hg/hgweb.config
qui nous permettra de prendre en compte les
différents dépôts contenus dans le sous répertoire repos
():
[collections]
repos/ = repos/
Ensuite il faut placer le script hgwebdir.fcgi
(dans le cas d'une
utilisation de FastCGI) ou hgwebdir.cgi
(dans le cas d'une utilisation
de CGI) et de le rendre exécutable par le serveur web :
# mkdir /var/hg
# cp hgwebdir.fcgi /var/hg
# chown -R www-data:www-data /var/hg
# chmod +x /var/hg/hgwebdir.fcgi
Configuration de lighttpd
Dans un sous répertoire du site
Suivant la configuration de lighttpd, il faut éditer le fichier de configuration
/etc/lighttpd/lighttpd.conf
ou alors un fichier qui sera inclus lors du
lancement de lighttpd (50-hg.conf
). Sous Debian il suffit de créer un
fichier dans le dossier /etc/lighttpd/available-conf/
et de faire un
lien vers ce fichier dans /etc/lighttpd/enable-conf/
. Dans un premier il
faut inclure les modules nécessaires :
1 server.modules += ( "mod_cgi" )
2 server.modules += ( "mod_rewrite" )
Dans un second temps, il faut configurer la réécriture des adresses afin que les
accès aux sous répertoire hg
ou mercurial
pour utiliser
hgwebdir.fcgi
:
3 url.rewrite-once = (
4 "^/hg([/?].*)?$" => "/hgwebdir.fcgi$1",
5 "^/mercurial([/?].*)?$" => "/hgwebdir.fcgi$1"
6 )
Enfin passer les paramètres au scripts cgi:
7 $HTTP["url"] =~ "^/hgwebdir.fcgi([/?].*)?$" {
8 server.document-root = "/var/hg/"
9 cgi.assign = ( ".fcgi" => "/usr/bin/python" )
10 }
Dans un hôte virtuel
Dans ce cas les dépôts seront accessible directement à la racine de l'hôte va une adresse du type hg.example.com.
1 $HTTP["host"] == "hg.example.com" {
2 server.document-root = "/var/hg/"
3 cgi.assign = ( ".fcgi" => "/usr/bin/python" )
4 }
Dans ce cas les adresses afficheront le nom du script utilisé à savoir
hgwebdir.fcgi
. Il est possible rendre les adresses plus esthétiques en
enlevant cette portion. Pour cela dans la configuration de l'hôte il suffit
d'ajouter ne règle de réécriture :
url.rewrite-once = (
"^(/hgwebdir.fcgi/.*)$" => "$1", "^(/.*)$" => "/hgwebdir.fcgi$1"
)
Il faut également modifier le fichier hgweb.config
pour que les adresses
générées ne possèdent plus le nom du script:
[web]
baseurl =
Limitation des push
Afin de pouvoir limiter les push à certaines personnes il faut modifier deux
fichiers de configurations. Tout d'abord le fichiers de configuration du dépôt
lui même (.hg/hgrc
). Dans la section web il faut ajouter le nom des
utilisateurs que l'on veut autoriser, ou alors une étoile (''*'') pour autoriser
tout le monde:
[web]
allow_push = moimeme
Enfin pour lighttpd il faut rajouter les lignes suivantes dans le fichiers gérant l'authentification:
$HTTP["querystring"] =~ "cmd=unbundle" {
auth.require = ( "" => (
"method" => "basic",
"realm" => "Mercuial Repo",
"require" => "valid-user"
)
)
}
Lors des push il se peut que cela echou avec l'erreur suivante:
ssl required
pour autoriser les push sans ssl il faut l'activer dans le fichier de
configuration du dépôt dans la section web (.hg/hgrc
) :
[web]
push_ssl = false