hgbook

changeset 995:56953b292c8a

finishing fixes on ch03 due to transformation from Latex files
author Romain PELISSE <belaran@gmail.com>
date Sat Sep 12 17:58:26 2009 +0200 (2009-09-12)
parents c40dac4f63d8
children 6f8c48362758
files fr/ch03-tour-merge.xml
line diff
     1.1 --- a/fr/ch03-tour-merge.xml	Fri Sep 04 18:55:53 2009 +0200
     1.2 +++ b/fr/ch03-tour-merge.xml	Sat Sep 12 17:58:26 2009 +0200
     1.3 @@ -15,364 +15,433 @@
     1.4        travaille iavec un gestionnaire de source distribué.</para>
     1.5  
     1.6        <itemizedlist>
     1.7 -        <listitem><para>Alice et Bob ont chacun une copie personnelle du dépôt d'un
     1.8 -  projet sur lequel ils collaborent. Alice corrige un \textit{bug}
     1.9 -  dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le
    1.10 -  sien. Ils veulent un dépôt partagé avec à la fois le correctif du
    1.11 -  \textit{bug} et la nouvelle fonctionnalité.</para>
    1.12 -</listitem>
    1.13 -<listitem><para>Je travaille régulièrement sur plusieurs tâches différentes sur
    1.14 -  un seul projet en même temps, chacun isolé dans son propre dépôt.
    1.15 -  Travailler ainsi signifie que je dois régulièrement fusionner une
    1.16 -  partie de mon code avec celui des autres.</para>
    1.17 -</listitem></itemizedlist>
    1.18 -
    1.19 -<para>Parce que la fusion est une opération si commune à réaliser,
    1.20 -Mercurial la rend facile. Étudions ensemble le déroulement des opérations.
    1.21 -Nous commencerons encore par faire un clone d'un autre dépôt (vous voyez
    1.22 -que l'on fait ça tout le temps ?) puis nous ferons quelques modifications
    1.23 -dessus.
    1.24 -<!-- &interaction.tour.merge.clone; -->
    1.25 -Nous devrions avoir maintenant deux copies de <filename>hello.c</filename> avec
    1.26 -des contenus différents. Les historiques de ces deux dépôts ont aussi
    1.27 -divergés, comme illustré dans la figure <xref linkend="fig:tour-merge:sep-repos"/>.</para>
    1.28 -
    1.29 -<para><!-- &interaction.tour.merge.cat; --></para>
    1.30 -
    1.31 -<informalfigure>
    1.32 -
    1.33 -<para>  <mediaobject><imageobject><imagedata fileref="tour-merge-sep-repos"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
    1.34 -  <caption><para>Historiques récent divergents des dépôts \dirname{my-hello</para></caption>
    1.35 -  et <filename class="directory">my-new-hello</filename>}
    1.36 -  \label{fig:tour-merge:sep-repos}</para>
    1.37 -</informalfigure>
    1.38 -
    1.39 -<para>Nous savons déjà que récupérer les modifications depuis notre dépôt
    1.40 -<filename class="directory">my-hello</filename> n'aura aucun effet sur l'espace de travail.
    1.41 -</para>
    1.42 -
    1.43 -<para><!-- &interaction.tour.merge.pull; -->
    1.44 -</para>
    1.45 -
    1.46 -<para>Néanmoins, la commande <command role="hg-cmd">hg pull</command> nous indique quelque chose au
    1.47 -sujet des <quote>heads</quote>.
    1.48 -</para>
    1.49 -
    1.50 -<sect2>
    1.51 -<title>\textit{Head changesets}</title>
    1.52 -
    1.53 -<para>Une \textit{head}\footnote{NdT: Je garde \textit{head} que j'accorde
    1.54 -au féminin comme la coutume orale l'a imposé.} est un \textit{changeset}
    1.55 -sans descendants, ou enfants, comme on les désigne parfois. La révision
    1.56 -\textit{tip} est une \textit{head}, car la dernière révision dans un dépôt
    1.57 -n'a aucun enfant, mais il est important de noter qu'un dépôt peut contenir
    1.58 -plus d'une \textit{head}.
    1.59 -</para>
    1.60 -
    1.61 -<informalfigure>
    1.62 -
    1.63 -<para>  <mediaobject><imageobject><imagedata fileref="tour-merge-pull"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
    1.64 -  \caption{Contenu d'un dépôt après avoir transféré le contenu du dépôt
    1.65 -    <filename class="directory">my-hello</filename> dans le dépôt <filename class="directory">my-new-hello</filename>}
    1.66 -  \label{fig:tour-merge:pull}
    1.67 -</para>
    1.68 -</informalfigure>
    1.69 -
    1.70 -<para>Dans la figure <xref linkend="fig:tour-merge:pull"/>, vous pouvez constater l'effet
    1.71 -d'un \textit{pull} depuis le dépôt <filename class="directory">my-hello</filename> dans le dépôt
    1.72 -<filename class="directory">my-new-hello</filename>. L'historique qui était déjà présent dans le dépôt
    1.73 -<filename class="directory">my-new-hello</filename> reste intact, mais une nouvelle révision a été
    1.74 -ajoutée. En vous reportant à la figure <xref linkend="fig:tour-merge:sep-repos"/>,
    1.75 -vous pouvez voir que le \textit{<emphasis>changeset ID</emphasis>} reste le même dans
    1.76 -le nouveau dépôt, mais que le <emphasis>numéro de révision</emphasis> reste le même.
    1.77 -(Ceci est un parfait exemple de pourquoi il n'est fiable d'utiliser les
    1.78 -numéros de révision lorsque l'on discute d'un \textit{changeset}.) Vous
    1.79 -pouvez voir les \texit{heads} présentes dans le dépôt en utilisant la
    1.80 -commande <command role="hg-cmd">hg heads</command>.
    1.81 -<!-- &interaction.tour.merge.heads; -->
    1.82 -</para>
    1.83 -
    1.84 -</sect2>
    1.85 -<sect2>
    1.86 -<title>Effectuer la fusion</title>
    1.87 -
    1.88 -<para>Que se passe-t-il quand vous essayez d'utiliser la commande <command role="hg-cmd">hg update</command>
    1.89 -pour mettre à jour votre espace de travail au nouveau \textit{tip}.
    1.90 -<!-- &interaction.tour.merge.update; -->
    1.91 -Mercurial nous prévient que la commande <command role="hg-cmd">hg update</command> n'effectuera pas
    1.92 -la fusion, il ne veut pas mettre à jour l'espace de travail quand il
    1.93 -estime que nous pourrions avoir besoin d'une fusion, à moins de lui
    1.94 -forcer la main. À la place, il faut utiliser la commande <command role="hg-cmd">hg merge</command>
    1.95 -pour fusionner les deux \textit{heads}.
    1.96 -<!-- &interaction.tour.merge.merge; -->
    1.97 -</para>
    1.98 -
    1.99 -<informalfigure>
   1.100 -
   1.101 -<para>  <mediaobject><imageobject><imagedata fileref="tour-merge-merge"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
   1.102 -  \caption{Espace de travail et dépôt lors d'une fusion, et dans le
   1.103 -    \textit{commit} qui suit.}
   1.104 -  \label{fig:tour-merge:merge}
   1.105 -</para>
   1.106 -</informalfigure>
   1.107 -
   1.108 -<para>Ceci met à jour l'espace de travail de manière à ce qu'il contienne
   1.109 -les modifications des <emphasis>deux</emphasis> \textit{heads}, ce qui apparaît dans
   1.110 -les sorties de la commande <command role="hg-cmd">hg parents</command> et le contenu de
   1.111 -<filename>hello.c</filename>.
   1.112 -<!-- &interaction.tour.merge.parents; -->
   1.113 -</para>
   1.114 -
   1.115 -</sect2>
   1.116 -<sect2>
   1.117 -<title>Effectuer le \textit{commit} du résultat de la fusion</title>
   1.118 -
   1.119 -<para>Dès l'instant où vous avez effectué une fusion, <command role="hg-cmd">hg parents</command> vous
   1.120 -affichera deux parents, avant que vous n'exécutiez la commande
   1.121 -<command role="hg-cmd">hg commit</command> sur le résultat de la fusion.
   1.122 -<!-- &interaction.tour.merge.commit; -->
   1.123 -Nous avons maintenant un nouveau \textit{tip}, remarquer qu'il contient
   1.124 -<emphasis>à la fois</emphasis> nos anciennes \textit{heads} et leurs parents. Ce sont
   1.125 -les mêmes révisions que nous avions affichées avec la commande
   1.126 -<command role="hg-cmd">hg parents</command>.
   1.127 -</para>
   1.128 -
   1.129 -<para><!-- &interaction.tour.merge.tip; -->
   1.130 -Dans la figure <xref linkend="fig:tour-merge:merge"/>, vous pouvez voir une représentation
   1.131 -de ce qui se passe dans l'espace de travail pendant la fusion, et comment ceci
   1.132 -affecte le dépôt lors du \textit{commit}. Pendant la fusion, l'espace de travail,
   1.133 -qui a deux \texit{changesets} comme parents, voit ces derniers devenir le parent
   1.134 -%%% TODO: le parent ou "les parents" : plus logique mais si il reste seulement
   1.135 -%%% un changeset, alors c'est effectivement un parent (le changeset est hermaphrodite)
   1.136 -d'un nouveau \textit{changeset}.
   1.137 -</para>
   1.138 -
   1.139 -</sect2>
   1.140 -</sect1>
   1.141 -<sect1>
   1.142 -<title>Fusionner les modifications en conflit</title>
   1.143 -
   1.144 -<para>La plupart des fusions sont assez simple à réaliser, mais parfois
   1.145 -vous vous retrouverez à fusionner des fichiers où la modification touche
   1.146 -la même portion de code, au sein d'un même fichier. À moins que ces
   1.147 -modification ne soient identiques, ceci aboutira à un <emphasis>conflit</emphasis>,
   1.148 -et vous devrez décider comment réconcilier les différentes modifications
   1.149 -dans un tout cohérent.
   1.150 -</para>
   1.151 -
   1.152 -<informalfigure>
   1.153 -
   1.154 -<para>  <mediaobject><imageobject><imagedata fileref="tour-merge-conflict"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
   1.155 -  <caption><para>Modifications conflictuelles dans un document</para></caption>
   1.156 -  \label{fig:tour-merge:conflict}
   1.157 -</para>
   1.158 -</informalfigure>
   1.159 -
   1.160 -<para>La figure <xref linkend="fig:tour-merge:conflict"/> illustre un cas de modifications
   1.161 -conflictuelles dans un document. Nous avons commencé avec une version simple
   1.162 -de ce fichier, puis nous avons ajouté des modifications, pendant que
   1.163 -quelqu'un d'autre modifiait le même texte. Notre tâche dans la résolution
   1.164 -du conflit est de décider à quoi le fichier devrait ressembler.
   1.165 -</para>
   1.166 -
   1.167 -<para>Mercurial n'a pas de mécanisme interne pour gérer les conflits.
   1.168 -À la place, il exécute un programme externe appelé <command>hgmerge</command>.
   1.169 -Il s'agit d'un script shell qui est embarqué par Mercurial, vous
   1.170 -pouvez le modifier si vous le voulez. Ce qu'il fait par défaut est
   1.171 -d'essayer de trouver un des différents outils de fusion qui seront
   1.172 -probablement installés sur le système. Il commence par les outils
   1.173 -totalement automatiques, et si ils échouent (parce que la résolution
   1.174 -du conflit nécessite une intervention humaine) ou si ils sont absents,
   1.175 -le script tente d'exécuter certains outils graphiques de fusion.
   1.176 -</para>
   1.177 -
   1.178 -<para>Il est aussi possible de demander à Mercurial d'exécuter un autre
   1.179 -programme ou un autre script au lieu de la commande <command>hgmerge</command>,
   1.180 -en définissant la variable d'environnement <envar>HGMERGE</envar> avec le nom
   1.181 -du programme de votre choix.
   1.182 -</para>
   1.183 -
   1.184 -<sect2>
   1.185 -<title>Utiliser un outil graphique de fusion</title>
   1.186 -
   1.187 -<para>Mon outil de fusion préféré est <command>kdiff3</command>, que j'utilise ici
   1.188 -pour illustrer les fonctionnalités classiques des outils graphiques
   1.189 -de fusion. Vous pouvez voir une capture d'écran de l'utilisation de
   1.190 -<command>kdiff3</command> dans la figure <xref linkend="fig:tour-merge:kdiff3"/>. Cet outil
   1.191 -effectue une <emphasis>fusion \textit{three-way</emphasis>}, car il y a trois différentes
   1.192 -versions du fichier qui nous intéresse. Le fichier découpe la partie
   1.193 -supérieure de la fenêtre en trois panneaux:
   1.194 -</para>
   1.195 -
   1.196 -<itemizedlist>
   1.197 -<listitem><para>A gauche on la version de <emphasis>base</emphasis> du fichier, soit la plus
   1.198 -  récente version des deux versions qu'on souhaite fusionner.
   1.199 -</para>
   1.200 -</listitem>
   1.201 -<listitem><para>Au centre, il y a <quote>notre</quote> version du fichier, avec le contenu
   1.202 -  que nous avons modifié.
   1.203 -</para>
   1.204 -</listitem>
   1.205 -<listitem><para>Sur la droite, on trouve <quote>leur</quote> version du fichier, celui qui
   1.206 -  contient le \textit{changeset} que nous souhaitons intégré.
   1.207 -</para>
   1.208 -</listitem></itemizedlist>
   1.209 -
   1.210 -<para>Dans le panneau en dessous, on trouve le <emphasis>résultat</emphasis> actuel de notre
   1.211 -fusion. Notre tâche consiste donc à remplacement tous les textes en rouges,
   1.212 -qui indiquent des conflits non résolus, avec une fusion manuelle et pertinente
   1.213 -de <quote>notre</quote> version et de la <quote>leur</quote>.
   1.214 -</para>
   1.215 -
   1.216 -<para>Tous les quatre panneaux sont <emphasis>accrochés ensemble</emphasis>, si nous déroulons
   1.217 -les ascenseurs verticalement ou horizontalement dans chacun d'entre eux, les
   1.218 -autres sont mis à jour avec la section correspondante dans leurs fichiers
   1.219 -respectifs.
   1.220 -</para>
   1.221 -
   1.222 -<informalfigure>
   1.223 -
   1.224 -<para>  <mediaobject><imageobject><imagedata fileref="kdiff3"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
   1.225 -  <caption><para>Utilisation de \command{kdiff3</para></caption> pour fusionner différentes versions
   1.226 -  d'un fichier.}
   1.227 -  \label{fig:tour-merge:kdiff3}
   1.228 -</para>
   1.229 -</informalfigure>
   1.230 -
   1.231 -<para>Pour chaque portion de fichier posant problème, nous pouvons choisir
   1.232 -de résoudre le conflit en utilisant une combinaison
   1.233 -de texte depuis la version de base, la notre, ou la leur. Nous pouvons
   1.234 -aussi éditer manuellement les fichiers à tout moment, si c'est
   1.235 -nécessaire.
   1.236 -</para>
   1.237 -
   1.238 -<para>Il y a <emphasis>beaucoup</emphasis> d'outils de fusion disponibles, bien trop pour
   1.239 -en parler de tous ici. Leurs disponibilités varient selon les plate formes
   1.240 -ainsi que leurs avantages et inconvénients. La plupart sont optimisé pour
   1.241 -la fusion de fichier contenant un texte plat, certains sont spécialisé
   1.242 -dans un format de fichier précis (généralement XML).
   1.243 -</para>
   1.244 -
   1.245 -</sect2>
   1.246 -<sect2>
   1.247 -<title>Un exemple concret</title>
   1.248 -
   1.249 -<para>Dans cet exemple, nous allons reproduire la modification de l'historique
   1.250 -du fichier de la figure <xref linkend="fig:tour-merge:conflict"/> ci dessus. Commençons
   1.251 -par créer un dépôt avec une version de base de notre document.
   1.252 -</para>
   1.253 -
   1.254 -<para><!-- &interaction.tour-merge-conflict.wife; -->
   1.255 -Créons un clone de ce dépôt et faisons une modification dans le fichier.
   1.256 -<!-- &interaction.tour-merge-conflict.cousin; -->
   1.257 -Et un autre clone, pour simuler que quelqu'un d'autre effectue une
   1.258 -modification sur le fichier. (Ceci pour suggérer qu'il n'est pas rare
   1.259 -de devoir effectuer des \textit{merge} avec vos propres travaux quand
   1.260 -vous isolez les tâches dans des dépôts distincts. En effet, vous
   1.261 -aurez alors à trouver et résoudre certains conflits).
   1.262 -<!-- &interaction.tour-merge-conflict.son; -->
   1.263 -Maintenant que ces deux versions différentes du même fichier sont
   1.264 -créées, nous allons configurer l'environnement de manière appropriée pour
   1.265 -exécuter notre \textit{merge}.
   1.266 -<!-- &interaction.tour-merge-conflict.pull; -->
   1.267 -</para>
   1.268 -
   1.269 -<para>Dans cette exemple, je n'utiliserais pas la commande Mercurial
   1.270 -habituelle <command>hgmerge</command> pour effectuer le \textit{merge},
   1.271 -car il me faudrait abandonner ce joli petit exemple automatisé
   1.272 -pour utiliser un outil graphique. À la place, je vais définir
   1.273 -la variable d'environnement <envar>HGMERGE</envar> pour indiquer à
   1.274 -Mercurial d'utiliser la commande non-interactive <command>merge</command>.
   1.275 -Cette dernière est embarquée par de nombreux systèmes <quote>à la Unix</quote>.
   1.276 -Si vous exécutez cet exemple depuis votre ordinateur, ne vous
   1.277 -occupez pas de définir <envar>HGMERGE</envar>.
   1.278 -<!-- &interaction.tour-merge-conflict.merge; -->
   1.279 -Parce que <command>merge</command> ne peut pas résoudre les modifications
   1.280 -conflictuelles, il laisse des <emphasis>marqueurs de différences</emphasis>
   1.281 -\footnote{NdT: Oui, je traduis \textit{merge markers} par un sens
   1.282 -inverse en Français, mais je pense vraiment que c'est plus clair
   1.283 -comme ça...} à l'intérieur du fichier qui a des conflits, indiquant
   1.284 -clairement quelles lignes sont en conflits, et si elles viennent de
   1.285 -notre fichier ou du fichier externe.
   1.286 -</para>
   1.287 -
   1.288 -<para>Mercurial peut distinguer, à la manière dont la commande <command>merge</command>
   1.289 -se termine, qu'elle n'a pas été capable d'effectuer le \textit{merge},
   1.290 -alors il nous indique que nous devons effectuer de nouveau cette
   1.291 -opération. Ceci peut être très utile si, par exemple, nous exécutons un
   1.292 -outil graphique de fusion et que nous le quittons sans nous rendre compte
   1.293 -qu'il reste des conflits ou simplement par erreur.
   1.294 -</para>
   1.295 -
   1.296 -<para>Si le \textit{merge} automatique ou manuel échoue, il n'y a rien pour
   1.297 -nous empêcher de <quote>corriger le tir</quote> en modifiant nous même les fichiers,
   1.298 -et enfin effectuer le \textit{commit} du fichier:
   1.299 -<!-- &interaction.tour-merge-conflict.commit; -->
   1.300 -</para>
   1.301 -
   1.302 -</sect2>
   1.303 -</sect1>
   1.304 -<sect1>
   1.305 -<title>Simplification de la séquence pull-merge-commit</title>
   1.306 -<para>\label{sec:tour-merge:fetch}
   1.307 -</para>
   1.308 -
   1.309 -<para>La procédure pour effectuer la fusion indiquée ci-dessus est simple,
   1.310 -mais requiert le lancement de trois commandes à la suite.
   1.311 -</para>
   1.312 -<programlisting>
   1.313 -<para>  hg pull
   1.314 -  hg merge
   1.315 -  hg commit -m 'Merged remote changes'
   1.316 -</para>
   1.317 -</programlisting>
   1.318 -
   1.319 -<para>Lors du \textit{commit} final, vous devez également saisir un message,
   1.320 -qui aura vraisemblablement assez peu d'intérêt.
   1.321 -</para>
   1.322 -
   1.323 -<para>Il serait assez sympathique de pouvoir réduire le nombre d'opérations
   1.324 -nécessaire, si possible. De fait Mercurial est fourni avec une
   1.325 -extension appelé <literal role="hg-ext">fetch</literal> qui fait justement cela.
   1.326 -</para>
   1.327 -
   1.328 -<para>Mercurial fourni un mécanisme d'extension flexible qui permet à chacun
   1.329 -d'étendre ces fonctionnalités, tout en conservant le cœur de Mercurial
   1.330 -léger et facile à utiliser. Certains extensions ajoutent de nouvelles
   1.331 -commandes que vous pouvez utiliser en ligne de commande, alors que
   1.332 -d'autres travaillent <quote>en coulisse,</quote> par exemple en ajoutant des
   1.333 -possibilités au serveur.
   1.334 -</para>
   1.335 -
   1.336 -<para>L'extension <literal role="hg-ext">fetch</literal> ajoute une nouvelle commande nommée, sans
   1.337 -surprise, <command role="hg-cmd">hg fetch</command>. Cette extension résulte en une combinaison
   1.338 -de <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg update</command> and <command role="hg-cmd">hg merge</command>. Elle commence par
   1.339 -récupérer les modifications d'un autre dépôt dans le dépôt courant.
   1.340 -Si elle trouve que les modifications ajoutent une nouvelle \textit{head},
   1.341 -elle effectue un \textit{merge}, et ensuite \texit{commit} le résultat
   1.342 -du \textit{merge} avec un message généré automatiquement. Si aucune
   1.343 -\textit{head} n'ont été ajouté, elle met à jour le répertoire de travail
   1.344 -au niveau du nouveau \textit{changeset} \textit{tip}.
   1.345 -</para>
   1.346 -
   1.347 -
   1.348 -<para>Activer l'extension <literal role="hg-ext">fetch</literal> est facile. Modifiez votre <filename role="special">.hgrc</filename>,
   1.349 -et soit allez à la section <literal role="rc-extensions">extensions</literal> soit créer une
   1.350 -section <literal role="rc-extensions">extensions</literal>. Ensuite ajoutez une ligne qui consiste
   1.351 -simplement en <quote>\Verb+fetch =</quote>.
   1.352 -</para>
   1.353 -
   1.354 -<programlisting>
   1.355 -<para>  [extensions]
   1.356 -  fetch =
   1.357 -</para>
   1.358 -</programlisting>
   1.359 -<para>(Normalement, sur la partie droite de <quote><literal>=</literal></quote> devrait apparaître
   1.360 -le chemin de l'extension, mais étant donné que l'extension <literal role="hg-ext">fetch</literal>
   1.361 -fait partie de la distribution standard, Mercurial sait où la trouver.)
   1.362 -</para>
   1.363 -
   1.364 -</sect1>
   1.365 +        <listitem>
   1.366 +          <para id="x_33a">Alice et Bob ont chacun une copie personnelle du dépôt d'un
   1.367 +            projet sur lequel ils collaborent. Alice corrige un bug
   1.368 +            dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le
   1.369 +            sien. Ils veulent un dépôt partagé avec à la fois le correctif du
   1.370 +            bug et la nouvelle fonctionnalité.</para>
   1.371 +       </listitem>
   1.372 +       <listitem>
   1.373 +         <para id="x_33b">Je travaille régulièrement sur plusieurs tâches différentes sur
   1.374 +           un seul projet en même temps, chacun isolé dans son propre dépôt.
   1.375 +           Travailler ainsi signifie que je dois régulièrement fusionner une
   1.376 +           partie de mon code avec celui des autres.</para>
   1.377 +       </listitem>
   1.378 +     </itemizedlist>
   1.379 +
   1.380 +     <para id="x_33c">Parce que la fusion est une opération si commune à réaliser,
   1.381 +       Mercurial la rend facile. Étudions ensemble le déroulement des
   1.382 +       opérations. Nous commencerons encore par faire un clone d'un autre
   1.383 +       dépôt (vous voyez que l'on fait ça tout le temps ?) puis nous ferons 
   1.384 +       quelques modifications dessus.</para>
   1.385 +       
   1.386 +       &interaction.tour.merge.clone;
   1.387 +       
   1.388 +     <para id="x_33d">Nous devrions avoir maintenant deux copies de
   1.389 +       <filename>hello.c</filename> avec des contenus différents. Les
   1.390 +       historiques de ces deux dépôts ont aussi divergés, comme illustré dans
   1.391 +       la figure <xref linkend="fig:tour-merge:sep-repos"/>.</para>
   1.392 +
   1.393 +      &interaction.tour.merge.cat1;
   1.394 +     
   1.395 +     <para id="x_722">Et ici est notre légèrement différente version du
   1.396 +       dépôt.</para>
   1.397 +     
   1.398 +      &interaction.tour.merge.cat2;
   1.399 +     
   1.400 +     <figure id="fig:tour-merge:sep-repos">
   1.401 +       <title>Historique divergent des dépôts <filename
   1.402 +         class="directory">my-hello</filename> et <filename
   1.403 +         class="directory">my-new-hello</filename>.</title>
   1.404 +       <mediaobject>
   1.405 +         <imageobject><imagedata fileref="figs/tour-merge-sep-repos.png"/></imageobject>
   1.406 +         <textobject><phrase>XXX ajoute un test</phrase></textobject>
   1.407 +       </mediaobject>
   1.408 +     </figure>
   1.409 +
   1.410 +     <para id="x_33f">Nous savons déjà que récupérer les modifications depuis
   1.411 +       notre dépôt <filename class="directory">my-hello</filename> n'aura
   1.412 +       aucun effet sur l'espace de travail.</para>
   1.413 +
   1.414 +      &interaction.tour.merge.pull;
   1.415 +
   1.416 +     <para id="x_340">Néanmoins, la commande <command role="hg-cmd">hg
   1.417 +       pull</command> nous indique quelque chose au sujet des 
   1.418 +       <quote>heads</quote>.</para>
   1.419 +
   1.420 +     <sect2>
   1.421 +       <title>Les révisions 'heads'</title>
   1.422 +
   1.423 +       <para id="x_341">Rappellez vous que Mercurial enregistre quelle révision
   1.424 +         est le parent de chaque révision. Si une révision a un parent, nous
   1.425 +         l'appelons un enfant(child) ou un descendant de ce parent. Une
   1.426 +         "head" est une révision qui n'a donc pas d'enfant. La révision tip
   1.427 +         est donc une "head", car c'est la révision la plus récente du dépôt
   1.428 +         qui n'a pas d'enfant. Il y a des moments où un dépôt peut contenir
   1.429 +         plusieurs "head".</para>
   1.430 +
   1.431 +       <figure>
   1.432 +         <title>Contenu du dépôt après une récupération ("pull") depuis le
   1.433 +           dépôt <filename
   1.434 +           class="directory">my-hello</filename> vers le dépôt <filename
   1.435 +           class="directory">my-new-hello</filename></title>
   1.436 +         <mediaobject>
   1.437 +           <imageobject>
   1.438 +             <imagedata fileref="tour-merge-pull"/>
   1.439 +           </imageobject>
   1.440 +           <textobject><phrase>XXX ajoute un texte</phrase></textobject>
   1.441 +         </mediaobject>
   1.442 +       </figure>
   1.443 +
   1.444 +       <para id="x_343">Dans la figure <xref linkend="fig:tour-merge:pull"/>,
   1.445 +         vous pouvez constater l'effet d'un \textit{pull} depuis le dépôt
   1.446 +         <filename class="directory">my-hello</filename> dans le dépôt
   1.447 +         <filename class="directory">my-new-hello</filename>. L'historique qui
   1.448 +         était déjà présent dans le dépôt <filename
   1.449 +         class="directory">my-new-hello</filename> reste intact, mais une
   1.450 +         nouvelle révision a été ajoutée. En vous reportant à la figure <xref
   1.451 +         linkend="fig:tour-merge:sep-repos"/>, vous pouvez voir que le
   1.452 +         <emphasis>ID de révision (changeset ID)</emphasis> reste le même dans
   1.453 +         le nouveau dépôt, mais que le <emphasis>numéro de
   1.454 +         révision</emphasis> reste le même. (Ceci est un parfait exemple de
   1.455 +         pourquoi il n'est fiable d'utiliser les numéros de révision lorsque
   1.456 +         l'on discute d'un \textit{changeset}.) Vous pouvez voir les "heads"
   1.457 +         présentes dans le dépôt en utilisant la commande <command
   1.458 +         role="hg-cmd">hg heads</command>.</para>
   1.459 +
   1.460 +        &interaction.tour.merge.heads;
   1.461 +      </sect2>
   1.462 +
   1.463 +      <sect2>
   1.464 +        <title>Effectuer la fusion</title>
   1.465 +
   1.466 +        <para id="x_344">Que se passe-t-il quand vous essayez d'utiliser la
   1.467 +          commande <command role="hg-cmd">hg update</command> pour mettre à
   1.468 +          jour votre espace de travail au nouveau "tip"</para>
   1.469 +         
   1.470 +         &interaction.tour.merge.update;
   1.471 +
   1.472 +         
   1.473 +        <para id="x_345">Mercurial nous prévient que la commande <command
   1.474 +          role="hg-cmd">hg update</command> n'effectuera pas
   1.475 +          la fusion, il ne veut pas mettre à jour l'espace de travail quand il
   1.476 +          estime que nous pourrions avoir besoin d'une fusion, à moins de lui
   1.477 +          forcer la main. À la place, il faut utiliser la commande <command
   1.478 +          role="hg-cmd">hg merge</command> pour fusionner les deux
   1.479 +          "heads".</para>
   1.480 +
   1.481 +       <para id="x_723">Pour commencer une fusion (merge) entre deux "heads",
   1.482 +       nous utilisons la commande <command role="hg-cmd">hg merge</command>.</para>
   1.483 +
   1.484 +        &interaction.tour.merge.merge; 
   1.485 +      
   1.486 +       <para id="x_347">Nous résolvons les conflits dans le fichier
   1.487 +         <filename>hello.c</filename>. Ceci met à jour le répertoire de travail
   1.488 +         de sorte qu'il ne contienne les modifications ne provenance des
   1.489 +         <emphasis>deux</emphasis> "heads", ce qui est indiqué par la
   1.490 +         la sortie de la commande <command role="hg-cmd">hg
   1.491 +         parents</command> et le contenu du fichier
   1.492 +         <filename>hello.c</filename>.</para>
   1.493 +
   1.494 +        &interaction.tour.merge.parents;
   1.495 +     </sect2>
   1.496 +
   1.497 +     <sect2>
   1.498 +       <title>Effectuer l'ajout (commit) du résultat de la fusion</title>
   1.499 +
   1.500 +       <para id="x_348">Dès l'instant où vous avez effectué une fusion
   1.501 +         (merge), <command role="hg-cmd">hg parents</command> vous
   1.502 +         affichera deux parents, avant que vous n'exécutiez la commande
   1.503 +         <command role="hg-cmd">hg commit</command> sur le résultat de la
   1.504 +         fusion.</para>
   1.505 +
   1.506 +        &interaction.tour.merge.commit;
   1.507 +
   1.508 +      <para id="x_349">Nous avons maintenant un nouveau tip, remarquer qu'il
   1.509 +        contient <emphasis>à la fois</emphasis> nos anciennes "heads" et leurs
   1.510 +        parents. Ce sont les mêmes révisions que nous avions affichées avec
   1.511 +        la commande <command role="hg-cmd">hg parents</command>.</para>
   1.512 +
   1.513 +       &interaction.tour.merge.tip;
   1.514 +
   1.515 +      <para id="x_34a">Dans la figure <xref linkend="fig:tour-merge:merge"/>,
   1.516 +        vous pouvez voir une représentation de ce qui se passe dans l'espace
   1.517 +        de travail pendant la fusion, et comment ceci affecte le dépôt lors
   1.518 +        du "commit". Pendant la fusion, l'espace de travail, qui a deux
   1.519 +        révisions (changesets) comme parents, voit ces derniers devenir le parent
   1.520 +        d'une nouvelle révision (changeset).</para>
   1.521 +
   1.522 +      <figure id="fig:tour-merge:merge">
   1.523 +        <title>Working directory and repository during merge, and
   1.524 +          following commit</title>
   1.525 +        <mediaobject>
   1.526 +          <imageobject>
   1.527 +            <imagedata fileref="figs/tour-merge-merge.png"/>
   1.528 +          </imageobject>
   1.529 +          <textobject><phrase>XXX ajoute texte</phrase></textobject>
   1.530 +        </mediaobject>
   1.531 +      </figure>
   1.532 +
   1.533 +    </sect2>
   1.534 +  </sect1>
   1.535 +
   1.536 +  <sect1>
   1.537 +    <title>Fusionner les modifications en conflit</title>
   1.538 +
   1.539 +    <para id="x_34b">La plupart des fusions sont assez simple à réaliser, mais 
   1.540 +      parfois vous vous retrouverez à fusionner des fichiers où la modification 
   1.541 +      touche la même portion de code, au sein d'un même fichier. À moins 
   1.542 +      que ces modification ne soient identiques, ceci aboutira à un 
   1.543 +      <emphasis>conflit</emphasis>, et vous devrez décider comment réconcilier 
   1.544 +      les différentes modifications dans un tout cohérent.</para>
   1.545 +
   1.546 +    <figure>
   1.547 +      <title>Modifications en conflits dans un document</title>
   1.548 +      <mediaobject>
   1.549 +        <imageobject><imagedata fileref="tour-merge-conflict"/></imageobject>
   1.550 +        <textobject><phrase>XXX ajoute texte</phrase></textobject>
   1.551 +      </mediaobject>
   1.552 +    </figure>
   1.553 +
   1.554 +    <para id="x_34d">La figure <xref linkend="fig:tour-merge:conflict"/>
   1.555 +      illustre un cas de modifications conflictuelles dans un document. Nous
   1.556 +      avons commencé avec une version simple de ce fichier, puis nous avons
   1.557 +      ajouté des modifications, pendant que quelqu'un d'autre modifiait le même
   1.558 +      texte. Notre tâche dans la résolution du conflit est de décider à quoi le
   1.559 +      fichier devrait ressembler.</para>
   1.560 +
   1.561 +    <para id="x_34e">Mercurial n'a pas de mécanisme interne pour gérer 
   1.562 +      les conflits. À la place, il exécute un programme externe appelé 
   1.563 +      <command>hgmerge</command>. Il s'agit d'un script shell qui est 
   1.564 +      embarqué par Mercurial, vous pouvez le modifier si vous le voulez. 
   1.565 +      Ce qu'il fait par défaut est d'essayer de trouver un des différents 
   1.566 +      outils de fusion qui seront probablement installés sur le système. 
   1.567 +      Il commence par les outils totalement automatiques, et si ils 
   1.568 +      échouent (parce que la résolution du conflit nécessite une
   1.569 +      intervention humaine) ou si ils sont absents, le script tente
   1.570 +      d'exécuter certains outils graphiques de fusion.</para>
   1.571 +
   1.572 +    <para id="x_34f">Il est aussi possible de demander à Mercurial d'exécuter
   1.573 +      un autre programme ou un autre script en définissant la variable
   1.574 +      d'environnement <envar>HGMERGE</envar> avec le nom
   1.575 +      du programme de votre choix.</para>
   1.576 +
   1.577 +    <sect2>
   1.578 +      <title>Utiliser un outil graphique de fusion</title>
   1.579 +
   1.580 +      <para id="x_350">Mon outil de fusion préféré est
   1.581 +      <command>kdiff3</command>, que j'utilise ici pour illustrer les
   1.582 +        fonctionnalités classiques des outils graphiques de fusion. Vous pouvez
   1.583 +        voir une capture d'écran de l'utilisation de <command>kdiff3</command>
   1.584 +        dans la figure <xref linkend="fig:tour-merge:kdiff3"/>. Cet outil
   1.585 +        effectue une <emphasis>fusion \textit{three-way</emphasis>}, car il y a
   1.586 +        trois différentes versions du fichier qui nous intéresse. Le fichier
   1.587 +        découpe la partie supérieure de la fenêtre en trois panneaux:</para>
   1.588 +      <itemizedlist>
   1.589 +        <listitem><para id="x_351">A gauche on la version de
   1.590 +          <emphasis>base</emphasis> du fichier, soit la plus récente version
   1.591 +          des deux versions qu'on souhaite fusionner.</para></listitem>
   1.592 +        <listitem><para id="x_352">Au centre, il y a <quote>notre</quote>
   1.593 +          version du fichier, avec le contenu que nous avons modifié.</para></listitem>
   1.594 +        <listitem><para id="x_353">Sur la droite, on trouve
   1.595 +        <quote>leur</quote> version du fichier, celui qui contient la
   1.596 +        révision que nous souhaitons intégré.</para>
   1.597 +        </listitem></itemizedlist>
   1.598 +      <para id="x_354">Dans le panneau en dessous, on trouve le
   1.599 +        <emphasis>résultat</emphasis> actuel de notre fusion. Notre tâche
   1.600 +        consiste donc à remplacement tous les textes en rouges,
   1.601 +        qui indiquent des conflits non résolus, avec une fusion manuelle et 
   1.602 +        pertinente de <quote>notre</quote> version et de la <quote>leur</quote>.
   1.603 +      </para>
   1.604 +
   1.605 +      <para id="">Tous les quatre panneaux sont <emphasis>accrochés ensemble</emphasis>, 
   1.606 +        si nous déroulons les ascenseurs verticalement ou horizontalement dans chacun 
   1.607 +        d'entre eux, les autres sont mis à jour avec la section correspondante dans leurs 
   1.608 +        fichiers respectifs.</para>
   1.609 +
   1.610 +      <figure id="fig:tour-merge:kdiff3">
   1.611 +        <title>Utiliser <command>kdiff3</command> pour fusionner les
   1.612 +          différentes version d'un fichier.</title>
   1.613 +        <mediaobject>
   1.614 +          <imageobject>
   1.615 +            <imagedata width="100%" fileref="figs/kdiff3.png"/></imageobject>
   1.616 +            <textobject>
   1.617 +              <phrase>XXX ajoute texte</phrase>
   1.618 +            </textobject>
   1.619 +          </mediaobject>
   1.620 +       </figure>
   1.621 +
   1.622 +       <para id="x_357">Pour chaque portion de fichier posant problème, nous
   1.623 +         pouvons choisir de résoudre le conflit en utilisant une combinaison de
   1.624 +         texte depuis la version de base, la notre, ou la leur. Nous pouvons
   1.625 +         aussi éditer manuellement les fichiers à tout moment, si c'est nécessaire.</para>
   1.626 +
   1.627 +       <para id="x_358">Il y a <emphasis>beaucoup</emphasis> d'outils de
   1.628 +         fusion disponibles, bien trop pour en parler de tous ici. Leurs
   1.629 +         disponibilités varient selon les plate formes  ainsi que leurs
   1.630 +         avantages et inconvénients. La plupart sont optimisé pour
   1.631 +         la fusion de fichier contenant un texte plat, certains sont spécialisé
   1.632 +         dans un format de fichier précis (généralement XML).</para>
   1.633 +    </sect2>
   1.634 +
   1.635 +    <sect2>
   1.636 +      <title>Un exemple concret</title>
   1.637 +
   1.638 +      <para id="x_359">Dans cet exemple, nous allons reproduire la
   1.639 +        modification de l'historique du fichier de la figure <xref
   1.640 +        linkend="fig:tour-merge:conflict"/> ci dessus. Commençons par créer
   1.641 +        un dépôt avec une version de base de notre document.</para>
   1.642 +
   1.643 +      &interaction.tour-merge-conflict.wife; 
   1.644 +
   1.645 +      <para id="x_35a">Créons un clone de ce dépôt et faisons une
   1.646 +        modification dans le fichier.</para>
   1.647 +
   1.648 +      &interaction.tour-merge-conflict.cousin;
   1.649 +      
   1.650 +      <para id="x_35b">Et un autre clone, pour simuler que quelqu'un d'autre effectue une
   1.651 +        modification sur le fichier. (Ceci pour suggérer qu'il n'est pas rare
   1.652 +        de devoir effectuer des fusions (merges) avec vos propres travaux quand
   1.653 +        vous isolez les tâches dans des dépôts distincts. En effet, vous
   1.654 +        aurez alors à trouver et résoudre certains conflits).</para>
   1.655 +
   1.656 +      &interaction.tour-merge-conflict.son;
   1.657 +
   1.658 +      <para id="x_35c">Maintenant que ces deux versions différentes du même fichier sont
   1.659 +        créées, nous allons configurer l'environnement de manière appropriée pour
   1.660 +        exécuter notre fusion (merge).</para>
   1.661 +
   1.662 +      &interaction.tour-merge-conflict.pull;
   1.663 +
   1.664 +      <para id="x_35d">Dans cette exemple, je n'utiliserais pas la commande Mercurial
   1.665 +        habituelle <command>hgmerge</command> pour effectuer le
   1.666 +        fusion (merge), car il me faudrait abandonner ce joli petit exemple automatisé
   1.667 +        pour utiliser un outil graphique. À la place, je vais définir la
   1.668 +        variable d'environnement <envar>HGMERGE</envar> pour indiquer à
   1.669 +        Mercurial d'utiliser la commande non-interactive <command>merge</command>.
   1.670 +        Cette dernière est embarquée par de nombreux systèmes <quote>à la Unix</quote>.
   1.671 +        Si vous exécutez cet exemple depuis votre ordinateur, ne vous
   1.672 +        occupez pas de définir <envar>HGMERGE</envar>.</para>
   1.673 +
   1.674 +     &interaction.tour-merge-conflict.merge; 
   1.675 +
   1.676 +
   1.677 +     <para id="x_35f">Parce que <command>merge</command> ne peut pas résoudre
   1.678 +       les modifications conflictuelles, il laisse des <emphasis>marqueurs de
   1.679 +       différences</emphasis> à l'intérieur du fichier qui a des conflits,
   1.680 +       indiquant clairement quelles lignes sont en conflits, et si elles
   1.681 +       viennent de notre fichier ou du fichier externe.
   1.682 +     </para>
   1.683 +
   1.684 +     <para id="x_360">Mercurial peut distinguer, à la manière dont la
   1.685 +       commande <command>merge</command> se termine, qu'elle n'a pas été
   1.686 +       capable d'effectuer la fusion (merge), alors il nous indique que nous
   1.687 +       devons effectuer de nouveau cette opération. Ceci peut être très utile
   1.688 +       si, par exemple, nous exécutons un outil graphique de fusion et que
   1.689 +       nous le quittons sans nous rendre compte qu'il reste des conflits ou 
   1.690 +       simplement par erreur.</para>
   1.691 +
   1.692 +     <para id="x_361">Si la fusion (merge) automatique ou manuelle échoue, 
   1.693 +       il n'y a rien pour nous empêcher de <quote>corriger le tir</quote> en
   1.694 +       modifiant nous même les fichiers, et enfin effectuer le "commit" du 
   1.695 +       fichier:</para>
   1.696 +
   1.697 +     &interaction.tour-merge-conflict.commit;
   1.698 +
   1.699 +     <note>
   1.700 +       <title>Où est la <ocmmand>hg resolve</ocmmand> ?</title>
   1.701 +       
   1.702 +       <para id="x_724">La commande <command>hg resolve</command> a été
   1.703 +         introduit dans la version 1.1 de Mercurial, qui a été publié en
   1.704 +         décembre 2008. Si vous utilisez une version plus anciennne de
   1.705 +         Mercurial (exécutez la command <command>hg version</command> pour en
   1.706 +         avoir le coeur net), cette commande ne sera pas disponible. Si votre
   1.707 +         version de Mercurial est plus ancienne que la 1.1, vous devriez très
   1.708 +         fortement considérer une mise à jour à une version plus récente avant
   1.709 +         d'essayer de régler des fusions complexes.</para>
   1.710 +       </note>
   1.711 +     </sect2>
   1.712 +   </sect1>
   1.713 +
   1.714 +   <sect1 id="sec:tour-merge:fetch">
   1.715 +     <title>Simplification de la séquence pull-merge-commit</title>
   1.716 +
   1.717 +     <para id="x_362">La procédure pour effectuer la fusion indiquée
   1.718 +       ci-dessus est simple, mais requiert le lancement de trois commandes à la
   1.719 +       suite.</para>
   1.720 +
   1.721 +     <programlisting>hg pull -u
   1.722 +hg merge
   1.723 +hg commit -m 'Merged remote changes'</programlisting>
   1.724 +
   1.725 +     <para id="x_363">Lors du "commit" final, vous devez également saisir un
   1.726 +       message, qui aura vraisemblablement assez peu d'intérêt.</para>
   1.727 +
   1.728 +     <para id="x_364">Il serait assez sympathique de pouvoir réduire le
   1.729 +       nombre d'opérations nécessaire, si possible. De fait Mercurial est
   1.730 +       fourni avec une extension appelé <literal role="hg-ext">fetch</literal>
   1.731 +       qui fait justement cela.</para>
   1.732 +
   1.733 +     <para id="x_365">Mercurial fourni un mécanisme d'extension flexible qui permet à chacun
   1.734 +       d'étendre ces fonctionnalités, tout en conservant le cœur de Mercurial
   1.735 +       léger et facile à utiliser. Certains extensions ajoutent de nouvelles
   1.736 +       commandes que vous pouvez utiliser en ligne de commande, alors que
   1.737 +       d'autres travaillent <quote>en coulisse,</quote> par exemple en ajoutant des
   1.738 +       possibilités au serveur.</para>
   1.739 +
   1.740 +     <para id="x_366">L'extension <literal role="hg-ext">fetch</literal>
   1.741 +       ajoute une nouvelle commande nommée, sans surprise, <command
   1.742 +       role="hg-cmd">hg fetch</command>. Cette extension résulte en une
   1.743 +       combinaison de <command role="hg-cmd">hg pull</command>, <command
   1.744 +       role="hg-cmd">hg update</command> and <command role="hg-cmd">hg
   1.745 +       merge</command>. Elle commence par récupérer les modifications d'un
   1.746 +       autre dépôt dans le dépôt courant. Si elle trouve que les
   1.747 +       modifications ajoutent une nouvelle "head", elle effectue un "merge",
   1.748 +       et ensuite "commit" le résultat du "merge" avec un message généré
   1.749 +       automatiquement. Si aucune "head" n'ont été ajouté, elle met à jour le
   1.750 +       répertoire de travail au niveau de la nouvelle révision tip.</para>
   1.751 +     
   1.752 +     <para id="x_367">Activer l'extension <literal
   1.753 +       role="hg-ext">fetch</literal> est facile. Modifiez votre <filename
   1.754 +       role="special">.hgrc</filename>, et soit allez à la section <literal
   1.755 +       role="rc-extensions">extensions</literal> soit créer une section
   1.756 +       <literal role="rc-extensions">extensions</literal>. Ensuite ajoutez
   1.757 +       une ligne qui consiste simplement en <quote>\Verb+fetch =</quote>.</para>
   1.758 +
   1.759 +     <programlisting>[extensions]
   1.760 +fetch =</programlisting>
   1.761 +
   1.762 +    <para id="x_368">(Normalement, sur la partie droite de
   1.763 +      <quote><literal>=</literal></quote> devrait apparaître le chemin de
   1.764 +      l'extension, mais étant donné que l'extension <literal
   1.765 +      role="hg-ext">fetch</literal> fait partie de la distribution standard,
   1.766 +      Mercurial sait où la trouver.) </para>
   1.767 +
   1.768 +  </sect1>
   1.769 +  
   1.770 +  <sect1>
   1.771 +    <title>Renommer, copier, et fusionner (merge)</title>
   1.772 +
   1.773 +    <para id="x_729">En cours de la vie d'un projet, nous allons souvent 
   1.774 +      vouloir changer la disposition de ses fichiers et de ses répertoires. 
   1.775 +      Ceci peut être aussi simple que de changer le nom d'un seul fichier, 
   1.776 +      et aussi compliqué que de restructurer une hiérarchie entiere de fichier
   1.777 +      au sein du projet.</para>
   1.778 +
   1.779 +    <para id="x_72a">Mercurial permet de faire ce genre de modification de
   1.780 +      manière fluide, à condition de l'informer de ce que nous faisons. Si 
   1.781 +      vous voulez renommenr un ficher, vous devriez utiliser les commande
   1.782 +      <command>hg rename</command><footnote>
   1.783 +        <para id="x_72b">Si vous un utilisateur de Unix, vous serez content
   1.784 +          de savoir que la commande  <command>hg rename</command> command 
   1.785 +          peut être abrégée en <command>hg mv</command>.</para>
   1.786 +      </footnote> pour changer son nom, ainsi Mercurial peut ensuite prendre
   1.787 +      la bonne décision, plus tard, en cas de fusionv (merge).</para>
   1.788 +
   1.789 +    <para id="x_72c">Nous étudierojns en détail l'utilisation de ces commandes, 
   1.790 +      en détail, dans le chapitre <xref linkend="chap:daily.copy"/>.</para>
   1.791 +  </sect1>
   1.792  </chapter>
   1.793  
   1.794  <!--