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