====== 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 # 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