Migrer de subversion à mercurial

Migrer vos dépôts

Installer hgsvn

Il vous faut récupérer et installer hgsvn (actuellement en version 0.1.3), qui est un ensemble de script permettant de travailler sur des dépôts mercurial et subversion. :

Migrer un dépôt complet

Imaginons que vous avez un projet dans une instance subversion, pour le migrer, il suffit de procéder de la façon suivante :

Création de la racine des dépots
mkdir -p /home/hg
cd /home/hg
# Récupération des informations du dépôt svn
hgimportsvn http://votredepot.domaine.tld/chemin/du/depot/ dossier_de_destination
cd dossier_de_destination
# Récupération de l'historique de SVN et création d'un changeset mercurial pour tout commit svn
hgpullsvn
hg update (optionnel)
# Suppression des méta-données de svn (vu qu'on n'en a plus besoin)
find . -name .svn | xargs rm -fr

Migrer un dépôt contenant plusieurs projets en n dépots mercurial

C’est à peu près la même chose, il suffit d’indiquer le chemin de votre projet (et non seulement du dépôt) :

cd /home/hg
# Récupération des informations du dépôt svn
hgimportsvn http://votredepot.domaine.tld/chemin/du/depot/projet_b/trunk projet_b
cd projet_b
# Récupération de l'historique de SVN et création d'un changeset mercurial pour tout commit svn
hgpullsvn
hg update (optionnel)
# Suppression des méta-données de svn (vu qu'on n'en a plus besoin)
find . -name .svn | xargs rm -fr

et recommencer si vous avez un projet_c, projet_d, etc.

Installer l’interface web de consultation d’un dépot mercurial : hgweb

Si vous avez un seul dépot, il vous faut utiliser hgweb.cgi - si vous en avez plusieurs (ou si vous comptez en avoir plusieurs, il vous faut installer hgwebdir.cgi.

Utilisation de hgweb.cgi

Copier hgweb.cgi dans le répertoire qui vous servira de DocumentRoot pour votre Virtual Host Apache :

# Création de mon répertoire :
mkdir /home/hg/hgweb
cp /usr/share/doc/mercurial/examples/hgweb.cgi /home/hg/hgweb/

Editez ensuite hgweb.cgi :

# Décommentez les lignes suivantes si vous affichez les données en UTF-8
#import os
#os.environ["HGENCODING"] = "UTF-8"

# Adaptez /path/to/repo sur la valeur de /home/hg/projet_b
#
# Ex return hgweb("/home/hg/projet_b", "Mon Projet B")

def make_web_app():
    return hgweb("/path/to/repo", "repository name")

Utilisation de hgwebdir.cgi

Copier hgwebdir.cgi dans le sous-répertoire hgweb du répertoire qui vous servira de DocumentRoot pour votre Virtual Host Apache :

# Création de mon répertoire :
mkdir /home/hg/hgweb
cp /usr/share/doc/mercurial/examples/hgwebdir.cgi /home/hg/hgweb/

Editez ensuite hgwebdir.cgi :

# Décommentez les lignes suivantes si vous affichez les données en UTF-8
#import os
#os.environ["HGENCODING"] = "UTF-8"

# Remplacer ensuite hgweb.config par le chemin ou sera placé votre fichier de configation de hgwebdir
# Dans mon cas : return hgwebdir("/home/hgconf/hgweb.config")
def make_web_app():
    return hgwebdir("hgweb.config")

Il faut juste que le fichier ne soit pas accessible par le web pour des raisons de sécurité. Vous pouvez le mettre où vous voulez (/etc/hgweb/hgweb.conf par ex)

Editez ensuite votre fichier hgweb.conf :

[collections]
/home/hg = /home/hg

Si vos dépots mercurial ne sont pas tous dans /home/hg, il vous faudra utiliser la section paths

[paths]
projecta = /depot/mercurial/du/projet/a/
projectb = /depot/projet/b

Configuration d’apache

Editer votre configuration apache pour y ajouter les éléments suivants :

<VirtualHost xxx.xxx.xxx.xxx>
    ServerName hg.domaine.tld
    DocumentRoot /home/hg/
    <Directory /home/hg/>
        DirectoryIndex hgweb/hgwebdir.cgi
        AddHandler cgi-script .cgi
        Options ExecCGI FollowSymLinks
        Order allow,deny
        Allow from all
        AuthUserFile /home/hgconf/hg.htpasswd
        AuthName "Depot Mercurial"
        AuthType Basic
        <Limit POST PUT>
            Require valid-user
        </Limit>
        RewriteEngine on
        RewriteBase /hgweb
        RewriteRule ^$ hgwebdir.cgi  [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) hgwebdir.cgi/$1  [QSA,L]
    </Directory>
</VirtualHost>

Remplacez hgwebdir.cgi par hgweb.cgi si nécessaire ;-)

Vérifier que le module cgi d’apache est bien installé et activé puis relancez Apache :

apachectl configtest
/etc/init.d/apache reload

et rendez vous sur http://hg.domaine.tld pour apprécier le résultat.

Configurer Trac pour fonctionner avec Mercurial

Cf la page du plugin TracMercurial suivant votre version de Trac (>= 0.10)

Paramétrer vos instances mercurial

Voir la page man de hgrc pour voir toutes les options possibles :)

Définition de paramètres globaux pour toutes vos instances

Si je veux définir des éléments globaux, je dois le préciser dans /etc/mercurial/hgrc :

# system-wide mercurial configuration file
# See hgrc(5) for more information

[web]
# Définition du style à utiliser
style = gitweb
# Choix des formats sous lesquels votre code est mis à disposition
allow_archive = bz2 zip
# Nom du contact par défaut
contact = Vous
# Mettre false si https n'est pas configuré
push_ssl = true

Définition de paramètres particuliers à un instance

Dans votre instance mercurial, éditez le fichier .hg/hgrc :

[paths]
default = /home/hg/projet_b

[web]
description = Projet B : Gestion de lettre au père noel
# Qui est autorisé à commiter/envoyer des fichiers sur le dépot :
allow_push = Vous
# Qui n'est pas autorisé à commiter/envoyer des fichiers sur le dépot :
deny_push = pere_fouettard

Travailler avec votre dépôt mercurial

Pour un checkout :

hg clone http://hg.domaine.tld/projet_a projet_a</code>

Pour un commit :

hg add monfichier.txt
hg commit -m "Ajout mon fichier.txt"
hg push http://hg.domaine.tld/projet_b

Note : Pour faire du push en http(s), il faut que le répertoire de destination soit accessible en écriture par l’utilisateur apache (www-data en général). Donc soit vous faites un :

chmod 777 -R /home/hg/projet_b

ou bien vous rendez l’utilisateur apache propriétaire de votre dépot via :

chown -R www-data: /home/hg/projet_b

Cela vous évitera d’avoir :

abort: ‘http://hg.domaine.tld/projet_b’ does not appear to be an hg repository!

Vous pouvez aussi faire le push par ssh par ex :

hg push ssh://vous@domaine.tld//home/hg/projet_b

Mercurial et Eclipse

Installez le plugin Mercurial Eclipse.