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 ou hgwebdir.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