belaran@964: <!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
belaran@964: 
bos@559: <chapter id="chap:concepts">
bos@572:   <?dbhtml filename="behind-the-scenes.html"?>
youshe@993:   <title>Derrière le décor</title>
youshe@993:   
wilk@1008:   <para id="x_2e8">À la différence de beaucoup d'outils de gestion de révisions,
youshe@993:     les concepts sur lesquels se base Mercurial sont assez simples pour
youshe@993:     qu'il soit facile de comprendre comment le logiciel fonctionne.
wilk@1008:     Bien que leur connaissance ne soit pas indispensable, je trouve utile
youshe@993:     d'avoir un <quote>modèle mental</quote> de ce qui se passe.</para>
youshe@993: 
youshe@993:   <para id="x_2e9">En effet, cette compréhension m'apporte la confiance que
youshe@993:     Mercurial a été développé avec soin pour être à la fois
youshe@993:     <emphasis>sûr</emphasis> et <emphasis>efficace</emphasis>. De surcroît,
wilk@1008:     s'il m'est facile de garder en tête ce que le logiciel fait lorsque
andre@1017:     j'accomplis des tâches de révision, j'aurai moins de risques d'être
youshe@993:     surpris par son comportement.</para>
youshe@993: 
youshe@993:   <para id="x_2ea">Dans ce chapitre, nous décrirons tout d'abord les concepts
youshe@993:     essentiels de l'architecture de Mercurial, pour ensuite discuter quelques
andre@1017:     détails intéressants de son implémentation.</para>
bos@559: 
bos@559:   <sect1>
youshe@993:     <title>Conservation de l'historique sous Mercurial</title>
youshe@993:     <sect2>
youshe@993:       <title>Suivi de l'historique pour un seul fichier</title>
youshe@993:       
youshe@993:       <para id="x_2eb">Lorsque Mercurial effectue un suivi des modifications
youshe@993:         faites à un fichier, il conserve l'historique pour ce fichier dans un
youshe@993:         <emphasis>filelog</emphasis> sous forme de métadonnées. Chaque entrée
wilk@1008:         dans le <quote>filelog</quote> contient assez d'informations pour reconstituer une
wilk@1008:         révision du fichier correspondant. Les <quote>filelogs</quote> sont des fichiers
youshe@993:         stockés dans le répertoire  <filename role="special"
wilk@1008:             class="directory">.hg/store/data</filename>. Un <quote>filelog</quote> contient
andre@1017:         des informations de deux types : les données de révision, et un index
youshe@993:         pour permettre à Mercurial une recherche efficace d'une révision
youshe@993:         donnée.</para>
youshe@993: 
youshe@993:       <para id="x_2ec">Lorsqu'un fichier devient trop gros ou a un long
wilk@1008:           historique, son <quote>filelog</quote> se voit stocké dans un fichier de données
youshe@993:         (avec un suffixe <quote><literal>.d</literal></quote>) et un fichier
youshe@993:         index (avec un suffixe<quote><literal>.i</literal></quote>)
youshe@993:         distincts. La relation entre un fichier dans le répertoire de travail
wilk@1008:         et le <quote>filelog</quote> couvrant le suivi de son historique dans le dépôt est
youshe@993:         illustré à la figure <xref linkend="fig:concepts:filelog"/>.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:filelog">
youshe@993:         <title>Relations entre les fichiers dans le répertoire de travail et
wilk@1008:             leurs <quote>filelogs</quote> dans le dépôt</title> 
youshe@993:         <mediaobject> <imageobject><imagedata
youshe@993:               fileref="figs/filelog.png"/></imageobject>
youshe@993:           <textobject><phrase>XXX add text</phrase></textobject>
youshe@993:         </mediaobject> </figure>
youshe@993: 
youshe@993:     </sect2>
youshe@993:     <sect2>
youshe@993:       <title>Gestion des fichiers suivis</title>
youshe@993:       
youshe@993:       <para id="x_2ee">Mercurial a recours à une structure nommée
youshe@993:         <emphasis>manifest</emphasis> pour rassembler les informations sur
wilk@1008:         les fichiers dont il gère le suivi. Chaque entrée dans ce <quote>manifest</quote>
youshe@993:         contient des informations sur les fichiers présents dans une révision
youshe@1001:         donnée. Une entrée enregistre la liste des fichiers faisant partie de la
youshe@993:         révision, la version de chaque fichier, et quelques autres
youshe@993:         métadonnées sur ces fichiers.</para>
bos@559: 
bos@559:     </sect2>
bos@559:     <sect2>
wilk@1008:         <title>Enregistrer les informations des <quote>changesets</quote></title>
youshe@1001: 
youshe@1001:       <para id="x_2ef">Le <emphasis>changelog</emphasis> contient les
wilk@1008:           informations sur chaque <quote>changeset</quote>. Chaque révision enregistre qui a
wilk@1008:           <quote>committé</quote> un changement, le commentaire du <quote>changeset</quote>, d'autres
wilk@1008:           morceaux d'information relatives au <quote>changeset</quote> et la révision du
wilk@1008:           <quote>manifest</quote> à utiliser.</para>
youshe@1001: 
youshe@1001:     </sect2>
youshe@1001:     <sect2>
youshe@1001:       <title>Relations entre les révisions</title>
youshe@1001: 
andre@1017:       <para id="x_2f0">À l'intérieur d'un <quote>changelog</quote>, d'un <quote>manifest</quote>, ou d'un
wilk@1008:           <quote>filelog</quote>, chaque révision enregistre un pointeur vers son parent
youshe@1001:         immédiat (ou à ses deux parents s'il s'agit d'une révision
youshe@1001:         correspondant à une fusion (merge)). Comme mentionné plus haut, il y
youshe@1001:         a aussi des relations entre les révisions <emphasis>à
youshe@1001:           travers</emphasis> ces structures, qui sont de nature
youshe@1001:         hiérarchique.</para>
youshe@1001: 
wilk@1008:     <para id="x_2f1">Pour chaque <quote>changeset</quote> dans un dépôt, il y a exactement
wilk@1008:         une révision stockée dans le <quote>changelog</quote>. Chaque révision du <quote>changelog</quote>
wilk@1008:         contient un pointeur vers une unique révision du <quote>manifest</quote>. Une
wilk@1008:         révision du <quote>manifest</quote> garde un pointeur vers une unique révision pour
wilk@1008:         chaque <quote>filelog</quote> suivi lorsque le <quote>changeset</quote> est créé. Ces relations
youshe@1001:         sont illustrées dans <xref linkend="fig:concepts:metadata"/>.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:metadata">
youshe@1001:         <title>Metadata relationships</title>
youshe@1001:         <mediaobject> <imageobject><imagedata
youshe@1001:               fileref="figs/metadata.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject> 
youshe@1001:         </mediaobject>
bos@591:       </figure>
bos@559: 
wilk@1008:       <para id="x_2f3">Comme l'illustration le montre, il
youshe@1001:         <emphasis>n'</emphasis>y a <emphasis>pas</emphasis> de relation
wilk@1008:         <quote>un à un</quote> entre les révisions dans un <quote>changelog</quote>,
wilk@1008:         <quote>manifest</quote> ou <quote>filelog</quote>. Si un fichier que Mercurial suit n'a pas changé
wilk@1008:         entre deux <quote>changesets</quote>, l'entrée pour ce fichier dans les deux
wilk@1008:         révisions du <quote>manifest</quote> pointera vers la même révision de son <quote>filelog</quote>
youshe@1001:         <footnote> <para id="x_725">Il est possible (bien qu'inhabituel)
wilk@1008:                 qu'un <quote>manifest</quote> reste le même entre deux <quote>changesets</quote>, auquel cas
wilk@1008:                 l'entrée du <quote>changelog</quote> pour ces <quote>changesets</quote> pointera vers la même
wilk@1008:                 révision du <quote>manifest</quote>.</para>
youshe@1001:         </footnote>.</para>
bos@559: 
bos@559:     </sect2>
bos@559:   </sect1>
bos@559:   <sect1>
youshe@1001:     <title>Stockage sûr et efficace</title>
youshe@1001: 
wilk@1008:     <para id="x_2f4">Les fondements des <quote>changelogs</quote>, des <quote>manifests</quote> et des
wilk@1008:         <quote>filelogs</quote> sont fournis par une unique structure appelée le
bos@559:       <emphasis>revlog</emphasis>.</para>
bos@559: 
bos@559:     <sect2>
andre@1017:       <title>Stockage efficace</title>
youshe@1001: 
wilk@1008:       <para id="x_2f5">Le <quote>revlog</quote> fournit un stockage efficace des révisions en
andre@1017:         utilisant un mécanisme <emphasis>delta</emphasis>. Au lieu de stocker
youshe@1001:         une copie complète d'un fichier à chaque révision, il stocke les
wilk@1008:         changements requis pour transformer une révision plus ancienne en une
andre@1017:         nouvelle révision. Pour plusieurs types de données, ces deltas sont
youshe@1001:         typiquement une fraction de pourcentage de la taille de la copie
youshe@1001:         complète d'un fichier.</para>
youshe@1001: 
wilk@1008:       <para id="x_2f6">Certains systèmes de gestion de révisions obsolètes
youshe@1001:         peuvent seulement travailler avec les deltas de fichiers texte. Il
youshe@1001:         doivent d'ailleurs stocker les fichiers binaires comme des images
youshe@1001:         complètes ou encodées avec une représentation texte, chacune de ces
youshe@1001:         approches étant gaspilleuse. Mercurial peut traiter les deltas de
youshe@1001:         fichiers avec du contenu binaire arbitraire ; il n'a pas besoin de
youshe@1001:         traiter spécialement du texte.</para>
bos@559: 
bos@559:     </sect2>
bos@559:     <sect2 id="sec:concepts:txn">
youshe@1001:       <title>Opérations sûres</title>
youshe@1001: 
youshe@1001:       <para id="x_2f7">Mercurial <emphasis>empile</emphasis> toujours les
wilk@1008:           données à la fin d'un fichier <quote>revlog</quote>. Il ne modifie jamais la section
wilk@1008:         d'un fichier après qu'il l'ait écrite. C'est à la fois plus robuste
youshe@1001:         et efficace que les schémas qui ont besoin de modifier ou réécrire
youshe@1001:         les données.</para>
youshe@1001: 
wilk@1008:       <para id="x_2f8">De plus, Mercurial traite chaque écriture comme la
youshe@1001:         partie d'une <emphasis>transaction</emphasis> qui peut comprendre
youshe@1001:         plusieurs fichiers. Une transaction est <emphasis>atomique</emphasis>
andre@1017:         : soit la transaction entière réussit et ses effets sont tous
youshe@1001:         visibles aux lecteurs en une étape, soit la totalité est annulée.
youshe@1001:         Cette garantie de l'atomicité signifie que si vous exécutez deux
youshe@1001:         copies de Mercurial, où une lit les données et l'autre les écrit, le
youshe@1001:         lecteur ne verra jamais un résultat partiellement écrit qui pourrait
youshe@1001:         le perturber.</para>
youshe@1001: 
youshe@1001:       <para id="x_2f9">Le fait que Mercurial ne fasse qu'ajouter aux fichiers
youshe@1001:         fait qu'il est facile de fournir cette garantie de transaction. Plus
youshe@1001:         les choses sont faites simplement comme ça, plus vous pouvez être
youshe@1001:         rassurés qu'elles sont bien faites.</para>
youshe@1001:     
youshe@1001:     </sect2>
youshe@1001:     <sect2>
youshe@1001:       <title>Récupération rapide</title>
youshe@1001: 
youshe@1001:       <para id="x_2fa">Mercurial évite habillement un piège commun à tous les
youshe@1001:         vieux systèmes de gestion de révisions : le problème de la
andre@1017:         <emphasis>récupération inefficace</emphasis>. La plupart des systèmes
youshe@1001:         de gestion de révisions stockent le contenu d'une révision comme une
youshe@1001:         série incrémentale de modifications faites à un
wilk@1008:         <quote>snapshot</quote>. (Certains basent le <quote>snapshot</quote> sur la plus
youshe@1001:         vieille révision, d'autres sur la plus récente.) Pour reconstruire
wilk@1008:         une révision spécifique, vous devez d'abord lire le <quote>snapshot</quote>, et
wilk@1008:         ensuite toutes les révisions entre le <quote>snapshot</quote> et votre révision
youshe@1001:         cible. Plus vous avez d'historique accumulé dans un fichier, plus de
youshe@1001:         révisions vous avez à lire, d'où la longueur que cela prend à
youshe@1001:         reconstruire une révision particulière.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:snapshot">
wilk@1008:           <title><quote>Snapshot</quote> d'un <quote>revlog</quote>, avec des deltas incrémentaux</title>
youshe@1001:         <mediaobject> <imageobject><imagedata
youshe@1001:               fileref="figs/snapshot.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject>
youshe@1001:         </mediaobject>
bos@591:       </figure>
bos@559: 
andre@1017:       <para id="x_2fc">L'innovation que Mercurial apporte à ce problème est
andre@1017:         simple mais efficace. Une fois que la quantité cumulée de deltas
youshe@1001:         d'informations stockées depuis le dernier snapshot excède un seuil
wilk@1008:         fixé, il stocke un nouveau <quote>snapshot</quote> (compressé bien sûr), plutôt qu'un
youshe@1001:         nouveau delta. Ceci rend possible la reconstruction de
youshe@1001:         <emphasis>toute</emphasis> révision d'un fichier rapidement. Cette
youshe@1001:         approche fonctionne si bien que depuis, elle a été copiée par
youshe@1001:         plusieurs autres systèmes de gestion de révisions.</para>
youshe@1001: 
youshe@1001:       <para id="x_2fd"><xref linkend="fig:concepts:snapshot"/> illustre
wilk@1008:           l'idée. Dans une entrée d'un fichier d'index de <quote>revlog</quote>, Mercurial
wilk@1008:         stocke l'intervalle des entrées depuis le fichier de données qu'il doit
youshe@1001:         lire pour reconstruire une révision particulière.</para>
bos@559: 
bos@559:       <sect3>
andre@1017:         <title>Aparté : l'influence de la compression vidéo</title>
youshe@1001:       
youshe@1001:         <para id="x_2fe">Si vous êtes familiés de la compression vidéo ou
andre@1017:           avez déjà regardé un programme TV par câble ou par un service
youshe@1001:           satellite, vous devez savoir que la plupart des schémas de
andre@1017:           compression vidéo stockent chaque trame de vidéo comme un delta
andre@1017:           vis-à-vis de la trame précédente.</para>
youshe@1001:       
youshe@1001:         <para id="x_2ff">Mercurial emprunte cette idée pour rendre possible
youshe@1001:           la reconstruction d'une révision à partir d'un snapshot et d'un
youshe@1001:           petit nombre de deltas.</para>
bos@559: 
bos@559:       </sect3>
bos@559:     </sect2>
bos@559:     <sect2>
youshe@1001:       <title>Identification et intégrité forte</title>
youshe@1001: 
youshe@1001:       <para id="x_300">Avec les deltas ou l'information du snapshot, une
youshe@1001:         entrée d'un revlog contient un hash cryptographique des données qu'il
youshe@1001:         représente. Ceci fait qu'il est difficile de construire les données
youshe@1001:         d'une révision, mais facile de détecter une corruption
youshe@1001:         accidentelle.</para>
youshe@1001: 
youshe@1001:       <para id="x_301">Les hash fournissent plus qu'un bon moyen de
youshe@1001:         vérification contre la corruption ; il sont aussi utilisés comme
wilk@1008:         identifiants pour les révisions. Les <quote>hashs</quote> d'identifications d'un
wilk@1008:         <quote>changeset</quote> que vous voyez comme utilisateur final proviennent des
wilk@1008:         révisions du <quote>changelog</quote>. Bien que les <quote>filelogs</quote> et le <quote>manifest</quote>
andre@1017:         utilisent aussi des <quote>hashs</quote>, Mercurial ne les utilise qu'en
andre@1017:         arrière-plan.</para>
youshe@1001: 
wilk@1008:     <para id="x_302">Mercurial vérifie que les <quote>hashs</quote> sont corrects lorsqu'il
youshe@1001:         récupère les révisions de fichiers et lorsqu'il récupère (pull) les
youshe@1001:         changements d'un autre dépôt. S'il rencontre un problème d'intégrité,
wilk@1008:         il se plaindra et arrêtera tout ce qu'il est en train de faire.</para>
youshe@1001: 
youshe@1001:       <para id="x_303">En plus de l'effet qu'il a sur l'efficacité des
wilk@1008:           récupérations, l'utilisation par Mercurial de <quote>snapshots</quote> périodiques
youshe@1001:         fait qu'il est plus robuste contre la corruption partielle de
wilk@1008:         données. Si un <quote>revlog</quote> devient partiellement corrompu à cause d'une
youshe@1001:         erreur matérielle ou d'un bug système, il est souvent possible de
youshe@1001:         reconstruire certaines ou la plupart des révisions à partir des
wilk@1008:         sections non corrompues du <quote>revlog</quote>, avant et après la section
youshe@1001:         corrompue. Ceci ne serait pas possible à partir d'un modèle de
wilk@1008:         stockage de deltas seul.</para>
bos@559:     </sect2>
bos@559:   </sect1>
bos@701: 
bos@559:   <sect1>
youshe@1001:     <title>Historique des révisions, branches et fusions (merge)</title>
youshe@1001: 
wilk@1008:     <para id="x_304">Chaque entrée dans un <quote>revlog</quote> Mercurial connaît
wilk@1008:       l'identité de l'ancêtre immédiat de la révision, habituellement désignée
youshe@1001:       comme son <emphasis>parent</emphasis>. En fait, une révision contient
youshe@1001:       de la place pour non pas un parent, mais deux. Mercurial utilise un
wilk@1008:       <quote>hash</quote> spécial, appelé le <quote>null ID</quote> pour représenter l'idée
wilk@1008:       qu'<quote>il n'y a pas de parent ici</quote>. Ce <quote>hash</quote> est simplement
youshe@1001:       une chaîne de zéros.</para>
youshe@1001: 
youshe@1001:     <para id="x_305">Dans <xref linkend="fig:concepts:revlog"/>, vous pouvez
wilk@1008:         voir un exemple de la structure conceptuelle d'un <quote>revlog</quote>. Les <quote>filelogs</quote>,
wilk@1008:         <quote>manifests</quote> et <quote>changelogs</quote> ont tous cette même structure ; ils diffèrent
youshe@1001:       simplement dans le type de donnée stockée dans chaque delta ou
wilk@1008:       <quote>snapshot</quote>.</para>
wilk@1008: 
wilk@1008:   <para id="x_306">La première révision d'un <quote>revlog</quote> (au bas de l'image) a
wilk@1008:       le <quote>null ID</quote> dans chacune de ses cases parent. Pour une révision
youshe@1001:       <quote>normale</quote>, sa première case parent contient l'ID de sa
wilk@1008:       révision parent et la seconde contient le <quote>null ID</quote>, indiquant que cette
youshe@1001:       révision n'a qu'un seul vrai parent. Si deux révisions ont le même
youshe@1001:       parent, il s'agit de branches. Une révision qui représente une fusion
youshe@1001:       (merge) entre deux branches a deux identifiants de révision normaux
youshe@1001:       dans ses cases parents.</para>
bos@559: 
bos@591:     <figure id="fig:concepts:revlog">
wilk@1008:         <title>Le concept de la structure d'un <quote>revlog</quote></title>
youshe@1001:       <mediaobject> <imageobject><imagedata
youshe@1001:             fileref="figs/revlog.png"/></imageobject> <textobject><phrase>XXX
youshe@1001:             add text</phrase></textobject>
bos@591:       </mediaobject>
bos@591:     </figure>
bos@559: 
bos@559:   </sect1>
bos@559:   <sect1>
youshe@1001:     <title>Le répertoire de travail</title>
youshe@1001: 
wilk@1008:     <para id="x_307">Dans un répertoire de travail, Mercurial stocke une image
wilk@1008:         des fichiers du dépôt à un <quote>changeset</quote> particulier.</para>
youshe@1001: 
youshe@1001:     <para id="x_308">Le répertoire de travail <quote>sait</quote> quel
wilk@1008:         <quote>changeset</quote> il contient. Lorsque vous mettez à jour (update) le
wilk@1008:         répertoire de travail à un certain <quote>changeset</quote>, Mercurial regarde la
wilk@1008:         révision appropriée du <quote>manifest</quote> pour trouver quels fichiers il suivait
wilk@1008:         au moment où le <quote>changeset</quote> a été <quote>committé</quote>, et quelle révision de chaque
youshe@1001:       fichier était alors courante. Il recrée ensuite une copie de chacun de
wilk@1008:       ces fichiers, avec le même contenu qu'ils avaient lorsque le <quote>changeset</quote>
wilk@1008:       a été <quote>committé</quote>.</para>
youshe@1001: 
youshe@1001:     <para id="x_309">La structure spéciale <emphasis>dirstate</emphasis>
youshe@1001:       contient la connaissance de Mercurial sur le répertoire de travail.
youshe@1001:       Elle est maintenue par un fichier appelé
youshe@1001:       <filename>.hg/dirstate</filename> dans un dépôt. Les détails du
wilk@1008:       dirstate sont le <quote>changeset</quote> vers lequel le répertoire de travail se met
youshe@1001:       à jour (update), et tous les fichiers que Mercurial suit dans le
wilk@1008:       répertoire de travail. Il permet aussi à Mercurial de connaître
wilk@1008:       rapidement les fichiers modifiés, en enregistrant l'heure de
wilk@1008:       dernière modification et la taille de chacun.</para>
wilk@1008: 
wilk@1008:   <para id="x_30a">Puisqu'une révision de <quote>revlog</quote> a des emplacements pour
youshe@1001:       deux parents et peut représenter aussi bien une révision normale (avec
wilk@1008:       un parent) ou une fusion de deux révisions anciennes, le <quote>dirstate</quote> a des
youshe@1001:       emplacements pour deux parents. Lorsque vous utilisez la commande
wilk@1008:       <command role="hg-cmd">hg update</command>, le <quote>changeset</quote> que vous
youshe@1001:       mettez à jour est stocké dans l'emplacement du <quote>premier
wilk@1008:           parent</quote>, et le <quote>null ID</quote> l'est dans le second. Lorsque vous
youshe@1001:       utilisez la commande <command role="hg-cmd">hg merge</command> avec un
youshe@1001:       autre changeset, le premier parent reste inchangé, et le second est
wilk@1008:       rempli avec le <quote>changeset</quote> à partir duquel vous êtes en train de
youshe@1001:       fusionner. La commande <command role="hg-cmd">hg parents</command> vous
youshe@1001:       donne les parents du dirstate.</para>
youshe@1001: 
youshe@1001:     <sect2>
andre@1017:         <title>Que se passe-t-il lorsque vous <quote>committez</quote></title>
wilk@1008: 
wilk@1008:         <para id="x_30b">Le <quote>dirstate</quote> stocke les informations sur les parents
andre@1017:         pour plus qu'une simple comptabilité. Mercurial utilise les
andre@1017:         parents du <quote>dirstate</quote> comme <emphasis>les parents d'un nouveau
wilk@1008:             <quote>changeset</quote></emphasis> lorsque vous <quote>committez</quote>.</para>
youshe@1001: 
youshe@1001:       <figure id="fig:concepts:wdir"> 
youshe@1001:         <title>Le répertoire de travail peut avoir deux parents</title>
youshe@1001:         <mediaobject>
youshe@1001:           <imageobject><imagedata fileref="figs/wdir.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject></mediaobject>
bos@591:       </figure>
bos@559: 
youshe@1001:       <para id="x_30d"><xref linkend="fig:concepts:wdir"/> montre l'état
wilk@1008:           normal d'un répertoire de travail, où il n'y a qu'un seul <quote>changeset</quote>
wilk@1008:           comme parent. Ce <quote>changeset</quote> est le <emphasis>tip</emphasis>, le
wilk@1008:           <quote>changeset</quote> le plus récent dans le dépôt n'a pas d'enfant.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:wdir-after-commit">
youshe@1001:         <title>Le répertoire de travail gagne de nouveaux parents après un
wilk@1008:             <quote>commit</quote></title>
youshe@1001:         <mediaobject>
youshe@1001:           <imageobject><imagedata
youshe@1001:               fileref="figs/wdir-after-commit.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject>
youshe@1001:         </mediaobject>
bos@591:       </figure>
bos@559: 
wilk@1008:       <para id="x_30f">On peut se représenter le répertoire de travail comme
wilk@1008:         <quote>le changeset que je vais committer</quote>. Chaque fichier
wilk@1008:         que vous demandez à Mercurial d'ajouter, de supprimer, de renommer ou de
wilk@1008:         copier va être intégré dans ce changeset, tout comme les
youshe@1001:         modifications de n'importe quel fichier que Mercurial est déjà en
wilk@1008:         train de suivre ; le nouveau <quote>changeset</quote> aura les mêmes parents que le
youshe@1001:         répertoire de travail.</para>
youshe@1001: 
youshe@1001:       <para id="x_310">Après un commit, Mercurial va mettre à jour les
wilk@1008:         parents du répertoire de travail, ainsi, le premier parent est l'ID
wilk@1008:         du nouveau <quote>changeset</quote>, et le second, le <quote>null ID</quote>. Ceci est illustré dans
youshe@1001:         <xref linkend="fig:concepts:wdir-after-commit"/>. Mercurial ne touche
wilk@1008:         à aucun des fichiers du répertoire de travail lorsque vous <quote>committez</quote>
youshe@1001:         ; il modifie simplement le dirstate pour noter ses nouveaux
youshe@1001:         parents.</para>
youshe@1001: 
youshe@1001:     </sect2>
youshe@1001:     <sect2>
youshe@1001:       <title>Création d'une nouvelle <quote>head</quote></title>
youshe@1001: 
wilk@1008:       <para id="x_311">Il est parfaitement normal de faire un <quote>update</quote> du
wilk@1008:           répertoire de travail à un <quote>changeset</quote> autre que le <quote>tip</quote> courant. Par
wilk@1008:         exemple, vous pourriez vouloir savoir à quoi votre projet
wilk@1008:         ressemblait mardi dernier, ou regarder le <quote>changeset</quote> qui a
youshe@1001:         introduit un bug. Dans des cas comme ça, la chose naturelle à faire
wilk@1008:         est de faire un <quote>update</quote> du répertoire de travail au <quote>changeset</quote> qui vous
youshe@1001:         intéresse, et ensuite d'en examiner les fichiers pour regarder leurs
andre@1017:         contenus comme ils l'étaient lorsque vous avez <quote>committé</quote> ce <quote>changeset</quote>.
youshe@1001:         L'effet de ceci est montré dans <xref
youshe@1001:           linkend="fig:concepts:wdir-pre-branch"/>.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:wdir-pre-branch">
wilk@1008:           <title>Le répertoire de travail, <quote>updaté</quote> pour un <quote>changeset</quote> plus
youshe@1001:         ancien</title>
youshe@1001:         <mediaobject> <imageobject><imagedata
youshe@1001:               fileref="figs/wdir-pre-branch.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject>
youshe@1001:         </mediaobject>
bos@591:       </figure>
bos@559: 
wilk@1008:       <para id="x_313">En ayant fait un <quote>update</quote> du répertoire de travail vers
andre@1017:           un <quote>changeset</quote> plus ancien, que se passe-t-il si vous faites des
wilk@1008:           changements et ensuite <quote>committez</quote> ? Mercurial se comporte comme je
youshe@1001:         l'ai fait remarqué plus haut. Les parents du répertoire de travail
wilk@1008:         deviennent les parents du nouveau <quote>changeset</quote>. Ce nouveau <quote>changeset</quote> n'a
wilk@1008:         pas d'enfant, donc il devient le nouveau <quote>tip</quote>. Le dépôt contient
wilk@1008:         maintenant deux <quote>changesets</quote> qui n'ont pas d'enfant ; on appelle ceci
wilk@1008:         des <emphasis>heads</emphasis>. Vous pouvez voir la structure que
youshe@1001:         cela crée dans <xref linkend="fig:concepts:wdir-branch"/>.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:wdir-branch">
wilk@1008:           <title>Après un <quote>commit</quote> fait pendant la synchronisation avec un ancien
wilk@1008:               <quote>changeset</quote></title>
youshe@1001:         <mediaobject> <imageobject><imagedata
youshe@1001:               fileref="figs/wdir-branch.png"/></imageobject>
youshe@1001:           <textobject><phrase>XXX add text</phrase></textobject>
youshe@1001:         </mediaobject>
bos@591:       </figure>
bos@559: 
bos@559:       <note>
andre@1017:         <para id="x_315">Si vous êtes un nouvel utilisateur de Mercurial, vous devez garder
youshe@1001:           à l'esprit une <quote>erreur</quote> commune, qui est d'utiliser la
youshe@1001:           commande <command role="hg-cmd">hg pull</command> sans aucune
youshe@1001:           option. Par défaut, la commande <command role="hg-cmd">hg
wilk@1008:               pull</command> <emphasis>ne fait pas</emphasis> d'<quote>update</quote> sur le
youshe@1001:           répertoire de travail, ainsi, vous allez récupérer les nouveaux
youshe@1001:           changesets dans votre dépôt, mais le répertoire de travail va
wilk@1008:           rester synchronisé au même <quote>changeset</quote> qu'il l'était avant le <quote>pull</quote>.
wilk@1008:           Si vous faites des changements et <quote>committez</quote> ensuite, vous allez
wilk@1008:           créer une nouvelle <quote>head</quote> puisque votre répertoire de travail n'est
wilk@1008:           pas synchronisé au <quote>tip</quote> actuel. Pour combiner les
wilk@1008:           opérations d'un <quote>pull</quote> suivi d'un <quote>update</quote>, exécutez <command>hg
youshe@1001:             pull -u</command>.</para>
youshe@1001:       
youshe@1001:         <para id="x_316">Je place le mot <quote>erreur</quote> entre
andre@1017:           guillemets parce que tout ce dont vous avez besoin de faire pour
wilk@1008:           rectifier la situation où vous avez créé une nouvelle <quote>head</quote> par
youshe@1001:           accident est un <command role="hg-cmd">hg merge</command> suivi
youshe@1001:           d'un <command role="hg-cmd">hg commit</command>.  En d'autres mots,
youshe@1001:           ceci n'a presque jamais de conséquences négatives ; il s'agit juste
youshe@1001:           d'une surprise pour les nouveaux arrivants. Je discuterai d'autres
youshe@1001:           moyens d'éviter ce comportement, et pourquoi Mercurial agit de
youshe@1001:           cette façon surprenante plus tard.</para>
bos@559:       </note>
bos@559: 
bos@559:     </sect2>
bos@559:     <sect2>
youshe@1001:       <title>Fusionner (merge) les changements</title>
youshe@1001: 
youshe@1001:       <para id="x_317">Lorsque vous exécutez la commande <command
youshe@1001:           role="hg-cmd">hg merge</command>, Mercurial laisse le premier
youshe@1001:         parent du répertoire de travail inchangé et fixe le second au
wilk@1008:         <quote>changeset</quote> avec lequel vous fusionnez (merge), comme montré dans <xref
youshe@1001:           linkend="fig:concepts:wdir-merge"/>.</para>
bos@559: 
bos@591:       <figure id="fig:concepts:wdir-merge">
wilk@1008:           <title>Fusionner (merge) deux <quote>heads</quote></title>
youshe@1001:         <mediaobject>
youshe@1001:           <imageobject> <imagedata fileref="figs/wdir-merge.png"/>
youshe@1001:         </imageobject> <textobject><phrase>XXX add text</phrase></textobject>
youshe@1001:       </mediaobject>
bos@591:       </figure>
bos@559: 
youshe@1001:       <para id="x_319">Mercurial doit aussi modifier le répertoire de
wilk@1008:           travail pour fusionner les fichiers gérés dans les deux <quote>changesets</quote>.
youshe@1001:         Un peu simplifié, le processus de fusion fonctionne comme ça : pour
wilk@1008:         chaque fichier dans le <quote>manifest</quote> de chaque <quote>changeset</quote>.</para>
youshe@1001: 
bos@559:       <itemizedlist>
wilk@1008:           <listitem><para id="x_31a">Si aucun <quote>changeset</quote> n'a modifié un fichier,
youshe@1001:             ne rien faire avec ce fichier.</para> </listitem>
wilk@1008:     <listitem><para id="x_31b">Si un <quote>changeset</quote> a modifié un fichier et
youshe@1001:             que l'autre ne l'a pas fait, créer une copie modifiée du fichier
youshe@1001:             dans le répertoire de travail.</para> </listitem>
wilk@1008:     <listitem><para id="x_31c">Si un <quote>changeset</quote> a modifié un fichier, et
youshe@1001:             que l'autre ne l'a pas fait (ou l'a supprimé), supprimer le
youshe@1001:             fichier du répertoire de travail.</para> </listitem>
wilk@1008:     <listitem><para id="x_31d">Si un <quote>changeset</quote> a supprimé un fichier,
youshe@1001:             mais que l'autre a modifié le fichier, demander à l'utilisateur
youshe@1001:             quoi faire : garder le fichier modifié ou le supprimer ?</para>
youshe@1001:         </listitem>
andre@1017:         <listitem><para id="x_31e">Si chacun des <quote>changesets</quote> a modifié un
youshe@1001:             fichier, invoquer le programme externe de fusion pour choisir les
youshe@1001:             nouveaux contenus pour le fichier fusionné. Ceci peut demander
andre@1017:             une intervention de l'utilisateur.</para></listitem>
wilk@1008:     <listitem><para id="x_31f">Si un <quote>changeset</quote> a modifié un fichier, et
youshe@1001:             que l'autre a renommé ou copié le fichier, être sûr que les
youshe@1001:             changements suivent le nouveau nom du fichier.</para></listitem>
youshe@1001:       </itemizedlist>
youshe@1001:       
youshe@1001:       <para id="x_320">Il y a plus de détails&emdash;fusionner a beaucoup de
andre@1017:         <quote>corner cases</quote>&emdash;mais ceux-ci sont des choix plus communs qui sont
andre@1017:         liés à une fusion (merge). Comme vous pouvez le voir, la
youshe@1001:         plupart des cas sont entièrement automatiques, et effectivement, la
andre@1017:         plupart des fusions (merge) se terminent automatiquement, sans nécessiter
andre@1017:         votre intervention pour résoudre un conflit.</para>
youshe@1001: 
youshe@1001:       <para id="x_321">Lorsque vous pensez à ce qu'il se passe lorsque vous
wilk@1008:           <quote>committez</quote> après un <quote>merge</quote>, une fois encore, le répertoire de travail
youshe@1001:         est <quote>le changeset que je suis sur le point de
youshe@1001:           committer</quote>. Après que la commande <command role="hg-cmd">hg
andre@1017:           merge</command> soit terminée, le répertoire de travail a deux
youshe@1001:         parents ; ceux ci vont devenir les parents du nouveau
wilk@1008:         <quote>changeset</quote>.</para>
youshe@1001: 
youshe@1001:       <para id="x_322">Mercurial vous permet d'exécuter de multiples fusions,
wilk@1008:           mais vous devez <quote>committer</quote> le résultat de chaque fusion individuellement
wilk@1008:         au fur et à mesure. Ceci est nécessaire puisque Mercurial ne stocke
youshe@1001:         que deux parents pour chaque révision et le répertoire de travail.
wilk@1008:         Alors qu'il serait techniquement faisable de fusionner de multiples
andre@1017:         <quote>changesets</quote> en même temps, Mercurial interdit cela pour être plus simple. Avec
wilk@1008:         des fusions multiples, les risques de confusion pour l'utilisateur, de
andre@1017:         mauvaie résolution de conflits, et de pagaille dans les fusions
andre@1017:         augmenteraient de façon intolérable.</para>
youshe@1001: 
youshe@1001:     </sect2>
youshe@1001: 
youshe@1001:     <sect2>
youshe@1001:       <title>Fusions et renommages</title>
youshe@1001: 
youshe@1001:       <para id="x_69a">Un nombre surprenant de systèmes de gestion de
andre@1017:         révisions fait peu ou pas attention à un <emphasis>nom</emphasis> de fichier au
youshe@1001:         cours du temps. Par exemple, il était habituel que si un fichier
youshe@1001:         était renommé d'un coté de la fusion, les changements à partir de
youshe@1001:         l'autre coté étaient supprimés silencieusement.</para>
youshe@1001: 
youshe@1001:       <para id="x_69b">Mercurial enregistre les metadata lorsque vous lui
andre@1017:         dites d'exécuter un renommage ou une copie. Il utilise ces metadatas
youshe@1001:         durant une fusion pour faire les bonnes choses dans le cas d'un
wilk@1008:         <quote>merge</quote>. Par exemple, si je renomme un fichier et que vous l'éditez
youshe@1001:         sans le renommer, lorsque l'on fusionne, le fichier sera renommé et
wilk@1008:         aura les changements appliqués.</para>
youshe@1001: 
bos@620:     </sect2>
bos@559:   </sect1>
bos@620: 
bos@559:   <sect1>
youshe@1001:     <title>D'autres fonctionnalités intéressantes</title>
youshe@1001: 
wilk@1008:     <para id="x_323">Dans les sections au-dessus, j'ai tenté de mettre
youshe@1001:       l'accent sur certains aspects importants du design de Mercurial pour
youshe@1001:       illustrer l'attention particulière qui a été portée à la fiabilité et à
wilk@1008:       la performance. Cependant, l'attention aux détails ne s'arrête pas ici.
youshe@1001:       Il y a de nombreux aspects sur la construction de Mercurial que je
andre@1017:       trouve personnellement intéressants. J'en détaillerai quelques-uns 
wilk@1008:       ici, séparément des éléments du <quote>big ticket</quote> ci-dessus,
youshe@1001:       ainsi, si vous êtes intéressés, vous pourrez avoir une meilleure idée
wilk@1008:       de la quantité d'ingéniosité qu'il y a derrière un système bien
wilk@1008:       conçu.</para>
youshe@1001: 
youshe@1001:     <sect2>
andre@1017:       <title>Compression astucieuse</title>
youshe@1001: 
youshe@1001:       <para id="x_324">Lorsque cela est approprié, Mercurial stocke les
wilk@1008:           <quote>snapshots</quote> et deltas sous une forme compressée. Il le fait en
wilk@1008:           <emphasis>essayant</emphasis> toujours de compresser un <quote>snapshot</quote> ou
wilk@1008:         un delta, mais en ne stockant la version compressée que si celle-ci
youshe@1001:         est plus petite que la version non compressée.</para>
youshe@1001: 
youshe@1001:       <para id="x_325">Ceci signifie que Mercurial fait <quote>la bonne
youshe@1001:           chose</quote> lorsqu'il stocke un fichier dont la forme native est
youshe@1001:         compressée, comme une archive <literal>zip</literal> ou une image
youshe@1001:         JPEG. Lorsque ces types de fichiers sont compressés une seconde fois,
youshe@1001:         le fichier obtenu est habituellement plus gros que la forme
youshe@1001:         compressée une seule fois et Mercurial stockera alors le
youshe@1001:         <literal>zip</literal> ou JPEG.</para>
youshe@1001: 
andre@1017:       <para id="x_326">Les deltas entre les révisions d'un fichier compressé
youshe@1001:         sont habituellement plus gros que les snapshots du fichier, et
youshe@1001:         Mercurial fait à nouveau <quote>la bonne chose</quote> dans ces cas.
youshe@1001:         Il trouve qu'un delta dépasse le seuil auquel il devrait stocker un
wilk@1008:         <quote>snapshot</quote> complet du fichier, alors il stocke le <quote>snapshot</quote>, en gagnant
wilk@1008:         encore de la place en comparaison d'une approche naïve avec un delta
youshe@1001:         seulement.</quote>
bos@559: 
bos@559:       <sect3>
andre@1017:         <title>Recompression sur le réseau</title>
youshe@1001:       
youshe@1001:         <para id="x_327">Lors du stockage des révisions sur le disque,
youshe@1001:           Mercurial utilise l'algorithme de compression
andre@1017:           <quote>deflate</quote> (le même que celui utilisé pour le format populaire
andre@1017:           d'archive <literal>zip</literal>), qui est un bon
wilk@1008:           compromis entre la vitesse et le taux de compression. Cependant,
youshe@1001:           lors de la transmission d'une révision de données par une connexion
youshe@1001:           réseau, Mercurial décompresse les données de révision
youshe@1001:           compressées.</para>
youshe@1001:       
wilk@1008:         <para id="x_328">Si la connexion passe par HTTP, Mercurial
youshe@1001:           recompresse le flux entier de données en utilisant un algorithme de
youshe@1001:           compression qui donne un meilleur taux de compression (l'algorithme
wilk@1008:           Burrows-Wheeler utilisé principalement par le logiciel de
youshe@1001:           compression <literal>bzip2</literal>). Cette combinaison de
andre@1017:           l'algorithme et de la compression du flux entier (plutôt que pour une
wilk@1008:           révision à la fois) réduit substantiellement le nombre de bits qui
wilk@1008:           sont transférés, résultant en une performance réseau accrue sur
youshe@1001:           la plupart des supports.</para>
youshe@1001:       
wilk@1008:         <para id="x_329">Si la connexion passe par
youshe@1001:           <command>ssh</command>, Mercurial <emphasis>ne</emphasis>
youshe@1001:           recompresse <emphasis>pas</emphasis> le flux puisque
andre@1017:           <command>ssh</command> peut déjà le faire par lui-même. Vous pouvez
youshe@1001:           demander à Mercurial de toujours utiliser la compression
youshe@1001:           <command>ssh</command> en éditant le fichier
wilk@1008:           <filename>.hgrc</filename> de votre répertoire personnel comme ci-dessous.
wilk@1008:       </para>
youshe@1001:       
youshe@1001:         <programlisting>[ui]
bos@701: ssh = ssh -C</programlisting>
bos@559: 
bos@559:       </sect3>
bos@559:     </sect2>
bos@559:     <sect2>
andre@1017:       <title>Ordre de lecture/écriture et atomicité</title>
youshe@1001: 
wilk@1008:       <para id="x_32a">L'histoire ne se résume pas à ajouter à la fin des fichiers
wilk@1008:         lorsque l'on cherche à garantir que le lecteur ne verra
youshe@1001:         pas qu'une écriture partielle. Si vous relisez <xref
wilk@1008:             linkend="fig:concepts:metadata"/>, les révisions dans le <quote>changelog</quote>
wilk@1008:         pointent vers les révisions dans le <quote>manifest</quote>, et les révisions du
wilk@1008:         <quote>manifest</quote> pointent vers les révisions du <quote>filelog</quote>. Cette hiérarchie est
youshe@1001:         délibérée.</para>
youshe@1001: 
wilk@1008:       <para id="x_32b">L'écriture commence par une transaction en écrivant dans
wilk@1008:           le <quote>filelog</quote> et dans les données du <quote>manifest</quote>, et n'écrit aucune donnée
wilk@1008:         du  <quote>changelog</quote> tant que ce n'est pas terminé. La lecture commence en
wilk@1008:         lisant les données du <quote>changelog</quote>, puis les données du <quote>manifest</quote>, et
wilk@1008:         enfin les données du <quote>filelog</quote>.</para>
youshe@1001: 
youshe@1001:       <para id="x_32c">Puisque que l'écriture ne finit pas d'écrire les
wilk@1008:           données du <quote>filelog</quote> et du <quote>manifest</quote> avant d'écrire dans le <quote>changelog</quote>,
wilk@1008:           la lecture ne verra jamais un pointeur vers une révision du <quote>manifest</quote>
wilk@1008:           partiellement écrite à partir du <quote>changelog</quote>, et ne lira jamais un
wilk@1008:           pointeur vers une révision du <quote>filelog</quote> partiellement écrite dans le
wilk@1008:           <quote>manifest</quote>.</para>
youshe@1001: 
youshe@1001:     </sect2>
youshe@1001:     <sect2>
youshe@1001:       <title>Accès concurrent</title>
youshe@1001: 
youshe@1001:       <para id="x_32d">La garantie de l'ordre de lecture/écriture et
wilk@1008:         de l'atomicité signifie que Mercurial n'a jamais besoin de poser de
youshe@1001:         <emphasis>lock</emphasis> sur un dépôt lorsqu'il lit des données,
youshe@1001:         même si le dépôt est en train d'être écrit au même moment que la
wilk@1008:         lecture a lieu. Ceci a un grand impact sur la fiabilité ; vous
youshe@1001:         pouvez avoir un nombre arbitraire de processus Mercurial qui lisent
wilk@1008:         sans risque les données d'un dépôt en même temps, peu importe s'il
youshe@1001:         est en train d'être lu ou non.</para>
youshe@1001: 
youshe@1001:       <para id="x_32e">La nature sans <quote>lock</quote> de la lecture
youshe@1001:         signifie que si vous partagez un dépôt sur un système
youshe@1001:         multi-utilisateurs, vous n'avez pas besoin de donner aux autres
youshe@1001:         utilisateurs locaux la permission d'<emphasis>écrire</emphasis> sur
wilk@1008:         votre dépôt pour qu'ils soient capable de faire un clone ou un <quote>pull</quote>
andre@1017:         des changements à partir de celui-ci ; ils ont seulement besoin de la
youshe@1001:         permission en <emphasis>lecture</emphasis>. (Il
youshe@1001:         <emphasis>ne</emphasis> s'agit <emphasis>pas</emphasis> d'une
wilk@1008:         fonctionnalité commune à travers les systèmes de gestion de révisions,
andre@1017:         donc ne prenez pas ça pour argent comptant ! La plupart ont besoin que les
youshe@1001:         lecteurs soient capables de mettre un lock sur le dépôt pour y
youshe@1001:         accéder en toute sécurité, et ceci demande des permissions en
wilk@1008:         écriture, sur au moins un répertoire, ce qui provoque bien sûr toutes
andre@1017:         sortes de problèmes pénibles et agaçants relatifs à la sécurité et à
youshe@1001:         l'administration.)</para>
youshe@1001: 
wilk@1008:     <para id="x_32f">Mercurial utilise des <quote>locks</quote> pour assurer qu'un seul
youshe@1001:         processus peut écrire dans le dépôt à un moment donné (le mécanisme
wilk@1008:         de <quote>lock</quote> est sûr, même sur des systèmes de fichiers qui sont connus
wilk@1008:         pour être hostiles aux <quote>locks</quote>, comme NFS). Si un dépôt dispose d'un
wilk@1008:         <quote>lock</quote>, un processus qui cherche à écrire va attendre un peu avant de
wilk@1008:         retenter pour voir si le dépôt perd son <quote>lock</quote>, mais si le dépôt garde
wilk@1008:         trop longtemps son <quote>lock</quote>, le processus qui tente d'écrire va expirer
wilk@1008:         (time out) après un moment. Cela veut dire par exemple que vos
wilk@1008:         scripts lancés quotidiennement n'attendront pas toujours et boucleront
wilk@1008:         si un système plantait sans avertissement, par exemple. (Oui, le
youshe@1001:         timeout est configurable, de zéro à l'infini.)</para>
bos@559: 
bos@559:       <sect3>
wilk@1008:           <title>Accès <quote>dirstate</quote> sûr</title>
wilk@1008: 
wilk@1008: 	<para id="x_330">Comme avec les données de révision, Mercurial n'utilise pas
wilk@1008:         de <quote>lock</quote> pour lire le fichier <quote>dirstate</quote> ; il n'acquiert pas un <quote>lock</quote> pour
wilk@1008:     y écrire. Pour empêcher la possibilité de lire une copie partiellement
wilk@1008:     écrite du fichier <quote>dirstate</quote>, Mercurial écrit sur un fichier avec un nom
wilk@1008:     unique dans le même répertoire que le fichier <quote>dirstate</quote>, ensuite renomme
youshe@1001:     le fichier temporaire automatiquement en <filename>dirstate</filename>.
youshe@1001:     Le fichier nommé <filename>dirstate</filename> est ainsi garanti d'être
youshe@1001:     écrit totalement, et non partiellement.</para>
bos@559: 
bos@559:       </sect3>
bos@559:     </sect2>
bos@559:     <sect2>
wilk@1008:       <title>Empêcher les recherches</title>
youshe@1001: 
youshe@1001:       <para id="x_331">L'absence de recherche sur les têtes de disques est
youshe@1001:         critique pour la performance de Mercurial, puisque toute recherche
youshe@1001:         est beaucoup plus coûteuse comparativement à une grosse opération de
youshe@1001:         lecture.</para>
youshe@1001: 
wilk@1008:     <para id="x_332">C'est pour ça, par exemple, que le <quote>dirstate</quote> est stocké
wilk@1008:         dans un fichier unique. S'il y avait eu un <quote>dirstate</quote> par répertoire
wilk@1008:         que Mercurial suivrait, le disque aurait recherché une fois par
wilk@1008:         répertoire. Au lieu de ça, Mercurial lit entièrement un 
wilk@1008:         fichier unique, en une étape.</para>
youshe@1001: 
youshe@1001:       <para id="x_333">Mercurial utilise aussi un schéma <quote>copie à
youshe@1001:           l'écriture</quote> lorsqu'il clone un dépôt sur un stockage local.
wilk@1008:       Au lieu de copier chaque <quote>fichier</quote> revlog depuis l'ancien dépôt vers le
youshe@1001:         nouveau dépôt, il crée un <quote>lien physique</quote>, qui est le
youshe@1001:         plus court chemin pour dire <quote>Ces deux noms pointent vers le
youshe@1001:           même fichier</quote>. Lorsque Mercurial est sur le point d'écrire
youshe@1001:         sur l'un des revlogs de ces fichiers, il vérifie si le nombre de noms
youshe@1001:         pointant sur ce fichier est plus grand que un. Si c'est le cas, plus
youshe@1001:         d'un dépôt utilise le fichier, donc Mercurial crée une nouvelle copie
youshe@1001:         du fichier qui est privée à ce dépôt.</para>
youshe@1001: 
youshe@1001:       <para id="x_334">Quelques développeurs de systèmes de gestion de
wilk@1008:         révisions ont montré que cette idée de faire une copie privée complète
wilk@1008:         d'un fichier n'est pas vraiment efficace au niveau du
youshe@1001:         stockage. Bien que ce soit vrai, le stockage est peu onéreux, et
youshe@1001:         cette méthode donne la plus grande performance lorsque l'on reporte
youshe@1001:         la plupart des journalisations au système d'exploitation. Un schéma
youshe@1001:         alternatif réduirait certainement la performance tout en augmentant
wilk@1008:         la complexité du logiciel, mais la vitesse et la simplicité sont les
wilk@1008:         clefs du <quote>confort</quote> de l'utilisation
youshe@1001:         quotidienne.</para>
youshe@1001: 
youshe@1001:     </sect2>
youshe@1001:     <sect2>
wilk@1008:         <title>Autres contenus du <quote>dirstate</quote></title>
wilk@1008: 
wilk@1008:       <para id="x_335">Puisque Mercurial ne vous force pas à signaler que
wilk@1008:           vous modifiez un fichier, il utilise le <quote>dirstate</quote> pour stocker
youshe@1001:         certaines informations supplémentaires pour déterminer efficacement
youshe@1001:         si vous avez ou non modifié un fichier. Pour chaque fichier du
youshe@1001:         répertoire de travail, il stocke l'heure à laquelle il a été modifié,
youshe@1001:         ainsi que la taille du fichier à cette heure.</para>
youshe@1001: 
youshe@1001:       <para id="x_336">Lorsque vous faites explicitement un <command
youshe@1001:           role="hg-cmd">hg add</command>, <command role="hg-cmd">hg
youshe@1001:           remove</command>, <command role="hg-cmd">hg rename</command> ou
youshe@1001:         <command role="hg-cmd">hg copy</command> sur des fichiers, Mercurial
andre@1017:         met à jour le <quote>dirstate</quote> afin de savoir que faire lorsque vous
wilk@1008:         effectuez un <quote>commit</quote>.</para>
wilk@1008: 
wilk@1008:     <para id="x_337">Le <quote>dirstate</quote> aide Mercurial à vérifier efficacement le
wilk@1008:         statut des fichiers dans un dépôt.</para>
bos@701: 
bos@701:       <itemizedlist>
youshe@1001:         <listitem> <para id="x_726"> Lorsque Mercurial vérifie l'état d'un
youshe@1001:             fichier du répertoire de travail, il compare d'abord la date de
youshe@1001:             dernière modification du fichier avec celle enregistrée dans le
wilk@1008:             <quote>dirstate</quote> qui correspond à celle que Mercurial a écrit en dernier sur ce
andre@1017:             fichier. Si la date de dernière modification correspond à la date
youshe@1001:             où Mercurial a écrit le fichier, celui ci n'a pas été modifié,
andre@1017:             donc Mercurial n'a pas besoin de revérifier.</para> </listitem>
wilk@1008:     <listitem> <para id="x_727"> Si la taille du fichier a changé, celui-ci 
wilk@1008:             a été modifié. Si la date de modification a changé mais que la
youshe@1001:             taille est restée inchangée, seulement à ce moment là Mercurial
youshe@1001:             doit vérifier le contenu du fichier pour savoir s'il a été
youshe@1001:             modifié.</para> </listitem>
bos@701:       </itemizedlist>
bos@701: 
youshe@1001:       <para id="x_728">Enregistrer la date de modification et la taille
youshe@1001:         réduit grandement le nombre d'opérations de lecture que Mercurial
youshe@1001:         doit effectuer lorsque l'on utilise une commande comme <command>hg
youshe@1001:           status</command>. Le résultat est un grand gain de
youshe@1001:         performance.</para>
bos@559:     </sect2>
bos@559:   </sect1>
belaran@964: </chapter>
belaran@964: 
belaran@964: <!--
belaran@964: local variables: 
belaran@964: sgml-parent-document: ("00book.xml" "book" "chapter")
belaran@964: end:
bos@559: -->