Travaillant actuellement sur un projet de développement en mode collaboratif, nous utilisons Mercurial pour gérer nos sources, et je me suis mis à utiliser intensément les MQ (Mercurial Queues) pour gérer mes propres modifications.

Je ne vais pas rentrer dans les détails de ce que sont les MQ, juste vous dire que c’est un système permettant de gérer une série de patchs “flottants”, un peu comme des commits mais que vous pouvez dépiler et empiler pour les modifier suivant vos besoins, tout en suivant le développement principal.
Je vous renvoie vers la documentation officielle et le chapitre qui y est consacré dans le livre (à lire et relire pour comprendre le principe).

Jusque là en travaillant de mon côté avec des MQ, je pouvais tranquillement poursuivre plusieurs développements en parallèle en local, tout en suivant le développement sur la branche principale. Quand un patch était ok, je l’appliquais sur le dépôt principal et tout allait bien.
Le problème se pose maintenant parce que je veux, tout en maintenant une série de patches, pouvoir les partager afin de montrer l’avancée de mon travail. (tout en continuant à pouvoir les empiler/dépiler bien évidemment)
C’est possible mais pas très pratique : ça demande de réinitialiser le dépôt côté serveur et les numéros de changesets changent, sans parler de l’obligation de passer par un dépôt local tiers.

Je me suis donc mis à chercher de la doc sur le partage de patches MQ et suis tombé sur ce très intéressant article intitulé Using Mercurial Queues and bitbucket.org[1] et, ne voulant pas utiliser bitbucket pour stocker mon dépôt[2], me suis mis en tête de faire quelque chose d’équivalent sur mon propre hébergement.

Peu de doc existe donc voici la mienne…

Sur le serveur

on commence par initialiser un dépôt qu’on va appeler test

$ hg init /chemin/vers/test

puis on y initialise un dépôt de MQ (qui l’on retrouvera dans .hg/patches)

$ cd /chemin/vers/test
$ hg qinit -c

on doit ensuite créer un fichier hgrc afin de spécifier les autorisations de chacun des deux dépôts : /chemin/vers/test/.hg/hgrc et /chemin/vers/test/.hg/patches/.hg/hgrc : je ne rentre pas dans les détails et vous renvoie vers mon article dédié au partage de dépôts Mercurial si vous en avez besoin.

Il faut également ajouter ces deux dépôts dans la configuration hgweb(dir).cgi

[paths]
test  =  /chemin/vers/test/
test-mq = /chemin/vers/test/.hg/patches

Si vous allez sur l’url de votre site vous devriez alors voir quelque chose comme ça Capture-Mercurial_repositories_index_-_Iceweasel.png

Sur le client

Clone

on clone le dépôt en précisant qu’on veut également le dépôt de MQ grâce à la commande dédiée qclone

$ hg qclone http://hg.domain.tld/test

Push

quand on veut pusher nos modifications sur le dépôt en y incluant notre dépôt de patches, il faut

  • d’abord dépiler tous les patches
$ hg qpop -a
  • ensuite pusher le dépôt principal
$ hg push https://hguser@hg.domain.tld/test
  • puis le dépôt MQ
$ hg push https://hguser@hg.domain.tld/test-mq

Pull

pour mettre à jour notre dépôt local avec les modifications disponibles sur le serveur, il faut procéder de la même façon que pour le push avec la commande pull : dépiler les patchs, mettre à jour chacun des deux dépôts.

Voilà, je crois que je n’ai rien oublié, n’hésitez pas à me le dire si c’est le cas.

Notes

[1] je reparlerais peut-être d’ailleurs à une autre occasion de bitbucket mais pour faire simple c’est une sorte de github à la sauce Mercurial

[2] principalement parce que pour l’instant le développement est fermé, quand il s’ouvrira bitbucket pourra être une solution intéressante