Dans les chapitres précédents, vous avez appris à ajouter un projet à une archive, archiver l'arborescence initiale, archiver les changements effectués sur les sources, et récupérer les révisions de cette archive.
Dans le chapitre précédent, vous avez appris à rendre une archive accessible par le réseau.
Ce chapitre va commencer à explorer la manière dont plusieurs programmeurs peuvent partager une archive dans laquelle chacun d'eux effectue des modifications sur des projets particuliers.
Notez en premier lieu qu'il y a de nombreuses manières de partager des archives et d'organiser la coopération entre les développeurs d'un même projet. Nous démarrerons par la technique la plus simple.
Supposons qu'Alice et Bob soient tous les deux en train de travailler sur hello-world et qu'ils partagent la même archive. Dans les exemples suivants, nous allons jouer le rôle de chacun d'eux.
Pour commencer, chaque programmeur va avoir besoin de sa propre arborescence :
% cd ~/wd % [ ... effacez les répertoires laissés par les exemples précédents ...] % tla get hello-world--mainline--0.1 hello-world-Alice [....] % tla get hello-world--mainline--0.1 hello-world-Bob [....]
L'objectif d'Alice est d'ajouter quelques mentions légales à chaque fichier. Lorsque c'est fait (mais pas encore archivé par commit), les fichiers sont ainsi :
% cd ~/wd/hello-world-Alice % head -3 main.c /* Copywrong 1998 howdycorp inc. All rights reversed.*/ extern void hello_world (void); % head hw.c /* Copywrong 1998 howdycorp inc. All rights reversed. */ #include <stdio.h>
Bob, pendant ce temps, a ajouté un commentaire indispensable à main:
% cd ~/wd/hello-world-Bob
% cat main.c
extern void hello_world (void);
int
main (int argc, char * argv[])
{
hello_world ();
/* Exit with status 0
*/
return 0;
}
Notez que les deux programmeurs ont maintenant des versions modifiées de hello-world, mais aucun d'eux n'a les modifications de l'autre.
Supposons que Bob soit le premier à essayer d'archiver ses modifications. Pour se rappeler, voici les deux étapes :
En premier lieu, Bob prépare un message de log :
% cd ~/wd/hello-world-Bob % tla make-log ++log.hello-world--mainline--0.1--lord@emf.net--2003-example [Bob edits the log message.] % cat ++log.hello-world--mainline--0.1--lord@emf.net--2003-example Summary: commented return from main Keywords: Added a comment explaining how the return from `main' relates to the exit status of the program.
Ensuite il appelle commit:
% tla commit [...]
Maintenant c'est au tour d'Alice
% cd ~/wd/hello-world-Alice % tla make-log ++log.hello-world--mainline--0.1--lord@emf.net--2003-example [Alice edits the log message.] % cat ++log.hello-world--mainline--0.1--lord@emf.net--2003-example Summary: added copywrong statements Keywords: Added copywrong statements to the source files so that nobody can steal HowdyCorp's code.
Et ensuite elle essaye d'archiver :
% tla commit
commit: tree is not up-to-date
(missing latest revision is
lord@emf.net--2003b--2003-example/hello-world--mainline--0.1--patch-2)
Le problème ici est que les modifications de Bob ont déjà été archivées, mais l'arborescence d'Alice ne contient pas ces modifications.
La commande commit indique à Alice qu'elle n'est « pas à jour ». Ça signifie que son arborescence ne contient pas certaines modifications archivées.
Elle peut examiner la situation plus en détail en demandant ce qui manque à son arborescence :
% tla missing patch-2
ou plus en détail :
% tla missing --summary
patch-2
commented return from main
dans lequel vous pourrez reconnaître le « Summary: » du message de log de Bob.
Elle peut consulter le message de log de Bob en entier :
% tla cat-archive-log 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/[....]
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.
En regardant les entêtes de ce message, Alice peut voir, par exemple, que Bob a modifié le fichier main.c.
Dans des chapitres ultérieurs, nous explorerons davantage de commandes qu'Alice peut utiliser pour étudier les modifications que Bob a effectuées, mais pour l'instant, regardons comment Alice peut intégrer ces modifications dans son arborescence.
Alice a besoin d'associer ses modifications avec celles de Bob avant de pouvoir les archiver. La méthode la plus facile est d'utiliser la commande update.
% cd ~/wd % tla update hello-world-Alice [....]
Maintenant elle va retrouver les modifications de Bob dans son arborescence :
% cd hello-world-Alice
% cat main.c
/* Copywrong 1998 howdycorp inc. All rights reversed. */
extern void hello_world (void);
int
main (int argc, char * argv[])
{
hello_world ();
/* Exit with status 0
*/
return 0;
}
/* arch-tag: main module of the hello-world project
*/
Du fait, il ne manque plus rien :
% tla missing [rien]
La commande commit peut être utilisée joyeusement :
% tla commit [....]
Note
Si vous avez suivis les exemples jusqu'ici, vous devriez toujours avoir une arborescence hello-world-Bob contenant les modifications de Bob, mais pas ceux d'Alice. Essayez différentes commandes sur ce répertoire par curiosité (missing, update, changes etc.).Une explication complète du fonctionnement de la commande update dépasserait le cadre de ce chapitre. Vous serez capable de comprendre en détail la commande update dans les chapitres suivants (« changeset » et « patch-logs »).
Pour l'instant, si vous êtes familier avec diff et patch, vous pouvez considérer cette commande comme cela :
Lorsque update est lancée dans l'arborescence d'Alice, elle constate que l'archive est au niveau de la révision patch-2, mais que l'arborescence a été récupérée à partir d'un get de la révision patch-1. update fonctionne en 3 étapes :
Premièrement, elle utilise une commande appelée mkpatch (qui est une sorte de diff évolué) pour calculer un changeset (une sorte de patch-set) décrivant les modifications effectuées par Alice sur son arborescence.
Deuxièmement, elle récupère une copie de la révision patch-2 et remplace l'arborescence d'Alice avec celle-ci.
Troisièmement, update utilise dopatch (une sorte de patch) pour appliquer le changeset, créé lors de la première étape, à l'arborescence.
Vous vous demandez sûrement comment les conflits sont traités. Les exemples précédents étaient choisis pour éviter les conflits. Ne vous inquiétez pas -- nous allons aborder le sujet bientôt (voir « Problème de patch -- comment les conflits sont traités »).
Version du 18/09/2004 21h14 : wilk@flibuste.net--libre docs-tla--fr--1.0 patch-102 ... base-0