Utilisation avancée de Mercurial

Utiliser un outil externe pour joindre (merge)

Si vous utilisez les outils présentés sur cette page, particulièrement MQ, avoir un outil pour gérer les jointures (lorsque plusieurs modifications se chevauchent et qu'il faut définir le résultat à la main) vous sera probablement utile. SliTaz propose Meld, un logiciel léger qui remplit bien cette fonction. Après installation, indiquer à Mercurial de l'utiliser si nécéssaire en ajoutant dans ~/.hgrc:

[ui]
merge = meld

Extensions utiles

Pour ajouter une extension, il est possible d'utiliser le fichier ~/.hgrc; La syntaxe est :

[extensions]
nom = adresse

Certaines extensions sont fournies avec Mercurial et il n'est donc pas nécessaire de donner leur adresse. C'est le cas des quatre suivantes :

color Ajoute la couleur dans Mercurial. Utile quand on affiche les différences entre plusieurs versions d'un fichier.

hgext.fetch Ajoute la commande hg fetch, qui regroupe hg pull && hg merge && hg update.

hgext.graphlog Ajoute la commande glog qui affiche l'arbre des révisions avec le log ; Il est conseillé de limiter la longueur du log avec l'option -l (ex. -l 10). L'option -p permet d'afficher le détail des différences introduites à chaque étape.

mq Cet outil est expliqué plus en détail ci-dessous. Il permet de gérer une liste de patch pour un dépôt Mercurial : les appliquer, retirer, mettre à jour, etc. Cette extension ajoute plusieurs commandes, qui commencent généralement par 'q'. Plusieurs pages Web détaillent cet outil. Rechercher : mercurial mq

Fonctions MQ de base

Dans un dépôt Mercurial, créer un dépôt de patch avec contrôle des révision ; C'est un dépôt de patch dont les changements peuvent être enregistrés via Mercurial, comme un dépôt dans le dépôt :

hg qinit -c

Après avoir procédé à des modifications, les enregistrer en tant que patch plutôt que les commiter :

hg qnew nom_du_patch

Voir les patches appliqués/non-appliqués :

hg qseries -v

Ajouter des modifications au patch en cours d'utilisation (le dernier appliqué) :

hg qrefresh

Appliquer le patch suivant de la file :

hg qpush

Appliquer tous les patchs :

hg qpush -a

Dé-appliquer le patch courant :

hg qpop

Dé-appliquer tous les patchs :

hg qpop -a

Aller à un patch précis dans la file :

hg qgoto patch

Ajouter un message au patch courant (en vue de le commiter) :

hg qrefresh -m "Message"

Transformer un patch en commit :

hg qfinish patch

Commiter les changements effectués dans le dépôt de patchs :

hg qcommit -m "Message de commit"

Not : Les patchs sont enregistrés dans .hg/patches. Le fichier .hg/patches/series peut être modifié manuellement pour changer l'ordre d'application des patchs. Attention cependant si plusieurs patchs modifient un même fichier ; cela peut créer des problèmes.

MQ & Jointure

Principe général

Les patchs peuvent être mis à jour en utilisant l'outil merge de Mercurial : c'est plus facile que de les éditer manuellement. Pour cela, il est nécessaire d'avoir deux têtes (heads) dans le dépot. L'une étant le dépôt avec les patchs appliqués; l'autre le dépôt avec les nouveaux commits/updates/etc:

o Nouvelle version du dépôt
|
|
| o Patchs
| |
| /
|
o Dépôt avant application des patchs

La branche patchs sera ensuite jointe à la nouvelle branche, et MQ utilisera la fonction merge de Mercurial pour mettre à jour les patchs. Notez que l'utilisation d'un outils externe pour gérer les jointures problématiques (comme Meld proposé au-dessus) est hautement recommandée.

Créer la tête patchs :

qpush -a
hg tags # Retenir/Noter le numéro de révision de qparent
qsave -e -c #Sauvegarder l'état des patchs, cette sauvegarde sera utilisée durant l'opération merge. (Retenir/Noter le numéro à la fin de patches.N; généralement c'est 1)

Créer la nouvelle tête :

hg update -C <N°qparent> # Aller à la révision notée ci-dessus

# Ensuite, selon ce que vous voulez faire:
# Mettre à jour:
hg pull -u
# Commiter des changements, modifier puis:
hg commit -m "message"
# Modifier un patch:
hg qgoto patch # Puis modifier les fichiers et:
hg qrefresh

Pour lancer l'opération de merge :

hg qpush -a -m

Nettoyer le dépô t:

hg qpop -a
hg qpop -a -n patches.N
rm -r .hg/patches.N

Enregistrer les changements dans le dépôt de patchs :

hg qcommit -m "Mise à jour pour rev???"

Ré-appliquer la série de patch :

hg qpush -a