logo chat

Contact/Email

printImpression

Valid XHTML 1.0!

william dodé

Traduction du tutoriel Arch de Thomas Lord

Patch-logs et l'historique de l'arborescence d'un projet

Dans le chapitre précédent, nous avons commencé à apprendre le système de branche et de fusion. Nous avons vu comment des commandes comme missing, update, et replay pouvaient être utilisées pour surveiller et appliquer les changements des multiples branches d'un projet.

Dans ce chapitre, nous allons étudier quelques aspects des « patch logs » : le mécanisme utilisé pour surveiller l'historique de l'arborescence d'un projet, y compris la partie de l'historique qui est utilisée pour effectuer des fusions de manière intelligente.

Souvenez-vous d'abord lorsque nous avons rencontré les patch-logs dans les précédents chapitres (par exemple, lors de l'initialisation d'un projet, dans « Démarrer un nouveau projet »). Dans ce chapitre, les patch-logs seront expliqués en profondeur.

L'arborescence d'un projet contient des patch-logs

Souvenez vous qu'à chaque importation initiale, révision de tag, et révision de changeset dans une archive, un message de log est associé. Ce message consiste en un entête et un texte que vous envoyez dans des commandes telles que import et commit, en plus d'autres entêtes générés automatiquement par arch.

Lorsqu'un projet est importé pour la première fois dans une archive, le patch-log de cette nouvelle révision est ajouté à l'arborescence. Quand un commit est effectué, lors d'une opération d'archivage, le log de la nouvelle révision est ajouté à l'arborescence. Si vous récupérez (get) une révision créée par la commande tag, vous verrez qu'il contient également un patch-log pour cette révision de tag.

Les patch-logs s'accumulent. Ainsi, par exemple, chaque commit ajoute un nouveau log et tout les logs précédents sont préservés. Chaque révision de tag inclus non seulement le log de ce tag, mais aussi tous les logs hérités de la révision « taggés »

Revenons à nos exemples précédents, regardons la révision patch-2 de Alice et Bob :

% cd ~/wd

[... supprimer les répertoires des exemples précédents ...]

% tla get -A lord@emf.net--2003-example \
            hello-world--mainline--0.1--patch-2 \
            hw-AnB-2

[...]

% cd ~/hw-AnB-2

Premièrement, notons que les patch-logs sont triés par le nom arch de la version. Cette arborescence a des logs pour une version seulement :

% tla log-versions
lord@emf.net--2003-example/hello-world--mainline--0.1

Dans cette version, il y a des logs pour l'importation initiale, et deux changesets :

% tla logs -A lord@emf.net--2003-example \
              --summary \
              hello-world--mainline--0.1
base-0
    initial import
patch-1
    Fix bugs in the "hello world" string
patch-2
    commented return from main

Examinons un de ces logs en particulier :

% tla cat-log -A lord@emf.net--2003-example \
                hello-world--mainline--0.1--patch-2
Revision: hello-world--mainline--0.1--patch-2
Archive: lord@emf.net--2003-example
Creator: Tom (testing) Lord <lord@emf.net>
Date: Wed Jan 29 12:46:50 PST 2003
Standard-date: 2003-01-29 20:46:50 GMT
Summary: commented return from main
Keywords: 
New-files: \
  {arch}/[...]/hello-world--mainline--0.1/[...]/patch-log/patch-2
Modified-files: main.c
New-patches: \
  lord@emf.net--2003-example/hello-world--mainline--0.1--patch-2

Added a comment explaining how the return from `main'
relates to the exit status of the program.

nous pouvons voir, par exemple, que le changeset patch-2 modifie le fichier main.c et ajoute un nouveau fichier, le log lui-même (dont le nom est tronqué dans l'exemple affiché ci-dessus).

D'autres exemples méritent d'être étudiés sur l'arborescence de Candice. Souvenez-vous qu'elle a utilisé tag pour créer une branche (« fork ») à partir de la révision patch-1 d'Alice et Bob. Ainsi nous voyons :

% cd ~/wd

% tla get -A candice@candice.net--2003-candice \
            hello-world--candice--0.1--patch-2 \
            hw-C-0

[...]

% cd ~/hw-C-0

% tla log-versions
candice@candice.net--2003-candice/hello-world--candice--0.1
lord@emf.net--2003-example/hello-world--mainline--0.1

% tla logs  -A lord@emf.net--2003-example \
                --summary \
                hello-world--mainline--0.1
base-0
    initial import
patch-1
    Fix bugs in the "hello world" string


% tla logs  -A candice@candice.net--2003-candice \
                --summary \
                hello-world--candice--0.1
base-0
    tag of \
      lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1

Comment ça marche ? -- missing (ce qui manque)

Dans les chapitre précédents, vous avez appris comment la commande missing pouvait vous indiquer les modifications archivées, mais pas encore présentes dans une arborescence donnée (voir « Étudions pourquoi Alice ne peut pas faire de commit (archiver) »).

Il devrait être assez facile de comprendre comment ces commandes fonctionnent. Arch peut trouver la liste de toutes les révisions d'une version donnée en utilisant la commande revisions :

% tla revisions -A lord@emf.net--2003-example \
                  hello-world--mainline--0.1
base-0
patch-1
patch-2
patch-3

Ce sont les logs de l'archive. Arch peut trouver la liste des révisions pour laquelle le projet a des logs avec logs :

% tla logs -A lord@emf.net--2003-example \
               hello-world--mainline--0.1
base-0
patch-1
patch-2

La différence entre ces deux listes est le résultat de missing :

% tla missing -A lord@emf.net--2003-example \
              hello-world--mainline--0.1
patch-3

Le concept d'historique des changements et l'ascendance du projet

Les patch-logs indiquent des informations pertinentes sur l'historique d'une arborescence. Il y a deux visions qui méritent d'être mentionnées : l'« historique des changements », et « l'ascendance d'un projet ».

Historique des changements

Lorsqu'une arborescence a un log pour le commit d'un changeset, cela signifie que les modifications de ce commit ont été appliquées à l'arborescence : le commit de ce changeset fait partie de l'« l'historique des changements » de cette arborescence. Si le changeset était une correction de bogue, par exemple, c'est une indication comme quoi ce bogue a été corrigé dans cette arborescence.

Note

Le fait qu'un changeset donné fasse partie de l'historique des changement de cette arborescence n'est pas une preuve absolue que les modifications de ce changeset sont présentes dans l'arborescence. Par exemple, ces changements ont pu être annulés par un changement ultérieur. Néanmoins, l'historique des changements d'une arborescence est un outil utile pour explorer et comprendre son état.

Ascendance d'un projet

De manière informelle, nous dirons qu'une révision archivée est une « ascendance » d'un projet donné si elle a des patch-logs pour toutes les révisions de la version de cette révision archivée jusqu'à la version archivée elle-même.

Ainsi, par exemple, la révision de Candice issue du tag a la révision patch-1 d'Alice et Bob comme un ascendant puisqu'elle a les logs des révisions d'Alice et Bob :

base-0
patch-1

Et la révision patch-2 de Candice, qui fusionne les changements patch-2 et patch-3 d'Alice et Bob, a l'ensemble de ces révisions comme ascendants (voir « Mise à jour à partir d'une version issue d'une branche »).

Changelogs automatiques

La commande tla changelog génère un ChangeLog dans le style GNU à partir d'un patch-log :

% cd ~/wd

% tla get -A candice@candice.net--2003-candice \
            hello-world--candice--0.1 \
            hw-C-latest
[....]

% cd ~/wd/hw-C-latest

% tla changelog
# do not edit -- automatically generated by arch changelog
# arch-tag: automatic-ChangeLog-- [...]
#

2003-01-30 GMT  Tom (testing) Lord <lord@emf.net>       patch-2

    Summary:
      merge from mainline sources
    Revision:
      hello-world--candice--0.1--patch-2

    Patches applied:
    
      * lord@emf.net--2003-example/hello-world--mainline--0.1--patch-3
         added copywrong statements
    
      * lord@emf.net--2003-example/hello-world--mainline--0.1--patch-2
         commented return from main
    

    new files:
     {arch}/ [...] /hello-world--mainline--0.1 [...] /patch-2
     {arch}/ [...] /hello-world--mainline--0.1 [...] /patch-3

    modified files:
     hw.c main.c

    new patches:
     lord@emf.net--2003-example/hello-world--mainline--0.1--patch-2
     lord@emf.net--2003-example/hello-world--mainline--0.1--patch-3


2003-01-30 GMT  Tom (testing) Lord <lord@emf.net>       patch-1

    Summary:
      Punctuated the output correctly
    Revision:
      hello-world--candice--0.1--patch-1

    
    This program should say "hello, world" not "hello world".
    

    modified files:
     hw.c


2003-01-30 GMT  Tom (testing) Lord <lord@emf.net>       base-0

    Summary:
      tag of lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1
    Revision:
      hello-world--candice--0.1--base-0

    (automatically generated log message)
    

    new patches:
     lord@emf.net--2003-example/hello-world--mainline--0.1--base-0
     lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1

Notez que ce ChangeLog généré inclut un tagline. Si vous sauvegardez la sortie de cette commande changelog dans une arborescence, soit en utilisant un tagline ids ou en lui donnant un identifiant explicite qui correspond au tagline id, une commande telle que commit va automatiquement conserver le ChangeLog à jour.

Version du 31/05/2004 21h18 : wilk@flibuste.net--libre   docs-tla--fr--1.0     patch-99 ... base-0