Corrigé

Transcription

Corrigé
UNIVERSITÉ DE NICE – SOPHIA ANTIPOLIS
Licence 3 d’Informatique
UFR FACULTÉ DES SCIENCES
Environnement de Programmation 2005-2006
Parc Valrose – BP 71 – F 06108 NICE Cedex 2
Philippe Collet
Séance de TP n◦ 01 de la semaine du 27 janvier 2006
Gestion de versions et de configurations
Corrigé
Conventions pour les TPs de cet enseignement
• Créez un répertoire “EnvProg” pour tous les Tps de cet enseignement.
• Pour chaque TP, créez un sous-répertoire de séance qui indique un numéro et un identifiant du TP, par exemple
“01.CVS” pour ce TP. Placez-vous sous ce répertoire de séance.
• Les sujets des TPs en format HTML (hypertexte avec des liens pour se déplacer sur internet ou récupérer des
fichiers de fournitures) sont disponibles sous
http://deptinfo.unice.fr/twiki/bin/view/Linfo/GLEnvtProg0506
Objectifs
•
•
•
•
Comprendre les mécanismes de gestion de versions, puis de gestion de configurations
Savoir utiliser et interpréter les commandes de base de cvs.
Comprendre la différentiation textuelle sous-jacente et la problématique des conflits.
Savoir résoudre les conflits avec un outil graphique.
1. Petites opérations avec RCS
• Téléchargez le fichier “cvsQuickRef.html”.
Réponse ⇒ Utilisez votre navigateur...
• Placez le dans une archive “RCS” avec la commande ci avec une description appropriée (par exemple, Memento CVS en format html...). En cas de besoin, faites ci --help ou man ci pour obtenir la syntaxe et le
manuel de la commande.
Réponse ⇒
~> ci --help
ci: unknown option: --help
ci usage: ci -{fIklMqru}[rev] -d[date] -mmsg -{nN}name -sstate -ttext \
-T -Vn -wwho -xsuff -zzone file ...
~> ci cvsQuickRef.html
cvsQuickRef.html,v <-- cvsQuickRef.html
enter description, terminated with single ’.’ or end of file:
NOTE: This is NOT the log message!
>> Memento de la commande CVS (format html)
>> .
initial revision: 1.1
done
~> ls -l
total 48
-r--r--r-- 1 rr profs 48778 Jan 26 14:29 cvsQuickRef.html,v
On remarque que le fichier de base a le suffixe , V (comme version) et que cette base est protégée contre les
écritures. Cela évite de l’effacer malencontreusement.
• Sortez une nouvelle version de la base RCS avec la commande co.
Réponse ⇒
~> co --help
co: unknown option: --help
co usage: co -{fIlMpqru}[rev] -ddate -jjoins -ksubst -sstate \
-T -w[who] -Vn -xsuff -zzone file ...
~> co cvsQuickRef.html
cvsQuickRef.html,v --> cvsQuickRef.html
Séance de TP n◦ 01– Gestion de versions et de configurations
2
revision 1.1
done
• Remarquez les protections associées au fichier.
Réponse ⇒
~> ls -l
total 96
-r--r--r-- 1 rr profs 48556 Jan 26 14:35 cvsQuickRef.html
-r--r--r-- 1 rr profs 48778 Jan 26 14:29 cvsQuickRef.html,v
Le fichier extrait de la base est également protégé contre les écritures. Cela signifie que plusieurs utilisateurs
peuvent en même temps lire le même fichier, avec la même version. Mais si l’on veut le modifier, il faut prévenir
le fichier de base de cette intention, pour qu’il bloque toute autre sortie en vue d’une modification. C’est ce
qu’on obtient en verrouillant la sortie, avec l’option -l (lock).
• Sortez une version en la verrouillant.
Réponse ⇒
~> co -l cvsQuickRef.html
cvsQuickRef.html,v --> cvsQuickRef.html
revision 1.1 (locked)
done
~> ls -l
total 96
-rw-r--r-- 1 rr profs 48556 Jan 26 14:44 cvsQuickRef.html
-r--r--r-- 1 rr profs 48786 Jan 26 14:44 cvsQuickRef.html,v
Cette fois, le fichier autorise les modifications.
• Modifiez le fichier avec E MACS (rajoutez quelques lignes de html, enlevez en quelques unes que vous pourrez
repérer à la visualisation).
Réponse ⇒
~> emacs cvsQuickRef.html &
~> ls -l
total 96
-rw-r--r-- 1 rr profs 48549 Jan 26 15:11 cvsQuickRef.html
-r--r--r-- 1 rr profs 48786 Jan 26 14:44 cvsQuickRef.html,v
ctrl M de chaque fin de ligne utilisés par
On a modifié le fichier avec Emacs, ici en supprimant les caractères Windows et en modifiant un commentaire (indiqué en HTML par <!-- commentaire -->).
• Rentrez la version modifiée dans la base avec un message « modif de td » en lui donnant le numéro « 2.0 ».
Réponse ⇒
~> ci -r2.0 cvsQuickRef.html
cvsQuickRef.html,v <-- cvsQuickRef.html
new revision: 2.0; previous revision: 1.1
enter log message, terminated with single ’.’ or end of file:
>> modifs du TD
>> .
~> ls -l
total 48
-r--r--r-- 1 rr profs 49116 Jan 26 15:11 cvsQuickRef.html,v
Pour indiquer le numéro de version (ou revision), il faut utiliser l’option -r sans espace. Lorsqu’un numéro de
version est a deux composantes, la première indique une révision majeure (qui modifie les fonctionnalités) et
la seconde une révision mineure (qui corrige un défaut sans modifier les fonctionnalités). Lorsqu’un numéro
de version a plus de deux composantes, il s’agit d’un document situé dans une branche d’une hiérarchie de
révisions. L’intérêt des branches est par exemple pour distinguer différentes lignes d’un même produit, des
versions pour différents systèmes ou machines, etc.
Le fichier a disparu mais est entré dans la base. On remarque que la taille de la base est très inférieure à deux
fois la somme des deux versions du fichier, ce qui montre bien que seule une version (la dernière dans le cas de
RCS) et les différences successives sont stockées dans la base, pour gagner de la place.
Séance de TP n◦ 01– Gestion de versions et de configurations
3
• Obtenez les informations sur la base “RCS” avec la commande rlog.
Réponse ⇒
~> ~> rlog cvsQuickRef.html,v
RCS file: cvsQuickRef.html,v
Working file: cvsQuickRef.html
head: 2.0
branch:
locks: strict
rr: 2.0
access list:
symbolic names:
keyword substitution: kv
total revisions: 2; selected revisions: 2
description:
Memento de la commande CVS (format html)
---------------------------revision 2.0 locked by: rr;
date: 2006/01/26 14:09:04; author: rr; state: Exp; lines: +8 -8
modifs du TD
---------------------------revision 1.1
date: 2006/01/26 13:28:33; author: rr; state: Exp;
Initial revision
=============================================================================
La commande rlog indique les caractéristiques de l’état courant de la base (son état, la dernière version,
l’état verrouillé ou non, le nombre de révisions, le titre général du fichier (description), et pour chaque révision,
son numéro, qui a fait la modification, le commentaire de celle-ci et à quelle date, bref tout l’historique des
modifications successives qui ont été conservées (car on peut supprimer certaines versions non pertinentes).
• Utilisez la commande rcsdiff pour visualiser les différences entre les deux versions.
Réponse ⇒
~> rcsdiff -r1.1 -r2.0 cvsQuickRef.html,v
===================================================================
RCS file: cvsQuickRef.html,v
retrieving revision 1.1
retrieving revision 2.0
diff -r1.1 -r2.0
...
18,19c18
< <!-- vim:tabstop=2:shiftwidth=2
< -->
--> <!-- vim:tabstop=2:shiftwidth=2 -->
1371,1372c1370,1372
...
Les différences sont exprimées comme pour la commande diff. Par exemple, 18,19c18, signifie que les
lignes 18 à 19 du premier fichier (ici la version 1.1) sont remplacées (change) par une seule ligne 18 dans le
deuxième fichier (ici la version 2.0). Le contenu des lignes du premier fichier sont préfixées par le signe "<" et
celui du deuxième fichier par le signe ">".
• Etudiez le contenu du fichier cvsQuickRef.html,v avec E MACS. Que constatez-vous ?
Réponse ⇒
~> emacs cvsQuickRef.html
head 2.0;
access;
symbols;
locks
rr:2.0; strict;
comment @# @;
Séance de TP n◦ 01– Gestion de versions et de configurations
4
2.0
date 2006.01.26.14.09.04; author rr; state Exp;
branches;
next 1.1;
1.1
date 2006.01.26.13.28.33; author rr; state Exp;
branches;
next ;
desc
@Memento de la commande CVS (format html)
@
2.0
log
@modifs du TD
@
text
@<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1">
...
La base est constituée du contenu intégral de la dernière version, précédée d’entêtes en format textuel : les
informations qu’on lit en clair avec la commande rlog.
2. Prise en main de CVS
• Créez un sous-répertoire “Q2cvs” spécifique pour cette partie du TD.
Réponse ⇒
~> mkdir Q2cvs
~> cd Q2cvs
• Vérifiez que vous pouvez bien lancer la commande cvs.
Réponse ⇒
~> whence cvs # sous zsh
/usr/bin/cvs
# A t t e n t i o n , i l e x i s t e d ’ a u t r e s v e r s i o n s d e CVS q u i
# V é r i f i e z que vous avez b i e n c e t t e v e r s i o n .
peuvent
ne pas
marcher .
~> cvs --version
Concurrent Versions System (CVS) 1.11.17 (client/server)
...
Specify the --help option for further information about CVS
# cvs
marche
~> cvs --help # ou cvs -H
Usage: cvs [cvs-options] command [command-options-and-arguments]
where cvs-options are -q, -n, etc.
(specify --help-options for a list of options)
where command is add, admin, etc.
(specify --help-commands for a list of commands
or --help-synonyms for a list of command synonyms)
where command-options-and-arguments depend on the specific command
(specify -H followed by a command name for command-specific help)
Specify --help to receive this message
The Concurrent Versions System (CVS) is a tool for version control.
For CVS updates and additional information, see
Séance de TP n◦ 01– Gestion de versions et de configurations
the CVS home page at http: / / www . c v s h o m e . o r g / o r
Pascal Molli’s CVS site at http: / / www . l o r i a . f r / ~ m o l l i / c v s − i n d e x . h t m l
~> cvs --help-commands
CVS commands are:
add
Add a new file/directory to the repository
admin
Administration front end for rcs
annotate
Show last revision where each line was modified
checkout
Checkout sources for editing
commit
Check files into the repository
diff
Show differences between revisions
edit
Get ready to edit a watched file
editors
See who is editing a watched file
export
Export sources from CVS, similar to checkout
history
Show repository access history
import
Import sources into CVS, using vendor branches
init
Create a CVS repository if it doesn’t exist
kserver
Kerberos server mode
log
Print out history information for files
login
Prompt for password for authenticating server
logout
Removes entry in .cvspass for remote repository
pserver
Password server mode
rannotate
Show last revision where each line of module was modified
rdiff
Create ’patch’ format diffs between releases
release
Indicate that a Module is no longer in use
remove
Remove an entry from the repository
rlog
Print out history information for a module
rtag
Add a symbolic tag to a module
server
Server mode
status
Display status information on checked out files
tag
Add a symbolic tag to checked out version of files
unedit
Undo an edit command
update
Bring work tree in sync with repository
version
Show current CVS version(s)
watch
Set watches
watchers
See who is watching a file
(Specify the --help option for a list of other help options)
~> cvs --help-synonyms
CVS command synonyms
add
admin
annotate
checkout
commit
diff
export
history
import
log
login
rannotate
rdiff
release
remove
rlog
rtag
status
tag
update
version
are:
ad new
adm rcs
ann
co get
ci com
di dif
exp ex
hi his
im imp
lo
logon lgn
rann ra
patch pa
re rel
rm delete
rl
rt rfreeze
st stat
ta freeze
up upd
ve ver
• Faites un man cvs pour vous remémorer les sous-commandes les plus utiles et leurs options.
Réponse ⇒
~> man cvs
5
Séance de TP n◦ 01– Gestion de versions et de configurations
6
Le manuel occupe 42 pages !!! Pour avoir un aperçu, il vaut mieux lire le document Quick reference to CVS
commands saisi lors de la question sur RCS ou essayer les différentes commandes cvs -help qui suffisent
généralement. Il existe aussi sur Internet des CVS quick reference cards comme celle distribuée. Mais attention
aux différentes versions, car certaines sont anciennes. Le site http://ximbiot.com/cvs/wiki/index.php donne un
manuel en hypertexte très complet et récent.
• Suivant les indications de l’enseignant, exportez la variable CVSROOT avec la valeur
/u/profs/collet/l3info/envtprog/TP1/cvsroot1
/u/profs/collet/l3info/envtprog/TP1/cvsroot2
/u/profs/collet/l3info/envtprog/TP1/cvsroot3
/u/profs/collet/l3info/envtprog/TP1/cvsroot4
/u/profs/collet/l3info/envtprog/TP1/cvsroot5
/u/profs/collet/l3info/envtprog/TP1/cvsroot6
/u/profs/collet/l3info/envtprog/TP1/cvsroot7
/u/profs/collet/l3info/envtprog/TP1/cvsroot8
• CVS utilise l’éditeur de texte par défaut vi pour saisir des messages de log. Si vous ne connaissez pas cet
éditeur, le mieux est de définir une variable d’environnement EDITOR qui contient le nom de votre éditeur
favori (par exemple E MACS).
Réponse ⇒
~> export CVSROOT=/u/profs/collet/l3info/envtprog/TP1/cvsroot1
~> export EDITOR=emacs
Si vous entrez par mégarde dans l’éditeur vi, voici les commandes de secour pour s’en sortir :
• pour avoir l’invite des commandes, tapez : en début de ligne. Si cela ne marche pas parce que vous êtes en
mode insertion de caractères, tapez ESC .
: • Une fois que vous l’invite “:” de commande en bas de l’écran, tapez w pour sauvegarder (si vous le voulez
!) et
•q pour quiter Vi.
3. Récupération d’une configuration pour modification
• Utilisez l’opération checkout sur la base pour récupérer la hiérarchie du module nommé “Java2D”.
Réponse ⇒
~> cvs -H checkout
Usage:
cvs checkout [-ANPRcflnps] [-r rev] [-D date] [-d dir]
[-j rev1] [-j rev2] [-k kopt] modules...
-A
Reset any sticky tags/date/kopts.
-N
Don’t shorten module paths if -d specified.
-P
Prune empty directories.
-R
Process directories recursively.
-c
"cat" the module database.
-f
Force a head revision match if tag/date not found.
-l
Local directory only, not recursive
-n
Do not run module program (if any).
-p
Check out files to standard output (avoids stickiness).
-s
Like -c, but include module status.
-r rev Check out revision or tag. (implies -P) (is sticky)
-D date Check out revisions as of date. (implies -P) (is sticky)
-d dir Check out into dir instead of module name.
-k kopt Use RCS kopt -k option on checkout. (is sticky)
-j rev Merge in changes made between current revision and rev.
~> cvs checkout Java2D
cvs checkout: Updating Java2D
U Java2D/Java2Demo.html
U Java2D/Java2Demo.jar
U Java2D/README.txt
Séance de TP n◦ 01– Gestion de versions et de configurations
7
cvs checkout: Updating Java2D/src
U Java2D/src/AnimatingControlsSurface.java
U Java2D/src/AnimatingSurface.java
U Java2D/src/CloningFeature.java
U Java2D/src/ControlsSurface.java
..
cvs checkout: Updating Java2D/src/demos
cvs checkout: Updating Java2D/src/demos/Arcs_Curves
U Java2D/src/demos/Arcs_Curves/Arcs.java
U Java2D/src/demos/Arcs_Curves/BezierAnim.java
U Java2D/src/demos/Arcs_Curves/Curves.java
...
• Interprétez le résultat à l’écran.
Réponse ⇒
La commande cvs checkout Java2D réalise l’équivalent d’une copie récursive du module “Java2D”
(répertoire) situé dans le répertoire indiqué dans la variable CVSROOT. Chaque fois que cvs met à jour un
sous-répertoire, cela est indiqué par un message du genre :
cvs checkout: Updating Java2D/src/demos/Paths
suivi des noms de fichiers qui sont mis-à-jour (up to date) :
U Java2D/src/demos/Paths/Append.java
U Java2D/src/demos/Paths/CurveQuadTo.java
U Java2D/src/demos/Paths/FillStroke.java
...
• Observez le résultat dans le répertoire. Quels répertoires spéciaux existent maintenant ? Que contiennent-ils ?
Réponse ⇒
~> ls
Java2D
~> du
11
12
11
11
45
11
53
11
41
11
49
11
46
11
44
11
41
11
55
11
52
11
31
11
53
529
761
1189
1197
./Java2D/CVS
./Java2D/src/CVS
./Java2D/src/demos/CVS
./Java2D/src/demos/Arcs_Curves/CVS
./Java2D/src/demos/Arcs_Curves
./Java2D/src/demos/Clipping/CVS
./Java2D/src/demos/Clipping
./Java2D/src/demos/Colors/CVS
./Java2D/src/demos/Colors
./Java2D/src/demos/Composite/CVS
./Java2D/src/demos/Composite
./Java2D/src/demos/Fonts/CVS
./Java2D/src/demos/Fonts
./Java2D/src/demos/Images/CVS
./Java2D/src/demos/Images
./Java2D/src/demos/Lines/CVS
./Java2D/src/demos/Lines
./Java2D/src/demos/Mix/CVS
./Java2D/src/demos/Mix
./Java2D/src/demos/Paint/CVS
./Java2D/src/demos/Paint
./Java2D/src/demos/Paths/CVS
./Java2D/src/demos/Paths
./Java2D/src/demos/Transforms/CVS
./Java2D/src/demos/Transforms
./Java2D/src/demos
./Java2D/src
./Java2D
.
~> cd Java2D/CVS
~> ls -lsRa
Séance de TP n◦ 01– Gestion de versions et de configurations
8
8
1
1
1
drwxr-xr-x
drwxr-xr-x
-rw-r--r--rw-r--r--rw-r--r--
2
4
1
1
1
rr
rr
rr
rr
rr
8
deptinfo 8192 jan 26 17:14 .
deptinfo 8192 jan 26 17:14 ..
deptinfo 158 jan 26 17:14 Entries
deptinfo
7 jan 26 17:14 Repository
deptinfo
45 jan 26 17:14 Root
~> more Root
/u/profs/collet/l3info/envtprog/TP1/cvsroot1
~> more Repository
Java2D
~> more Entries
/Java2Demo.html/1.1.1.1/Mon Oct 7 15:58:18 2002 / /
/Java2Demo.jar/1.1.1.1/Mon Oct 7 15:58:17 2002 / /
/README.txt/1.1.1.1/Mon Oct 7 15:58:18 2002 / /
D/src / / / /
On observe que chacun des répertoires qui ont été récupérés sont maintenant équipés d’un sous-répertoire
“CVS”, comme celui situé sous la racine “Java2D”. Dans tous ces répertoires “CVS” se trouvent trois
fichiers (ici, mais il peut il y en avoir d’autres selon les manipulations effectuées) :
“Root” : donne l’URL de la base au cas où la variable CVSROOT ne serait pas définie.
“Repository” : donne le nom de chemin du répertoire racine de l’entrepôt (repository). Par opposition,
on appelle l’environnement local de travail (working files le bac à sable (sandbox).
“Entries” : donne pour chaque fichier du répertoire le nom du fichier, son numéro de version (au sens
RCS) et la date de dernière mise à jour. Dans le cas d’un sous-répertoire, on voit apparaître la lettre “D”
comme pour “src”.
• Modifiez un fichier java (mettez vous d’accord pour qu’ils soient différents entre les étudiants, on verra les
conflits par la suite) en rajoutant quelques lignes, en en supprimant d’autres et en modifiant certaines. Profitezen pour ajouter des commentaires dans le source Java comme
$Revision: 1.1 $, $Author: rr $, $Date: 2006/01/27 06:08:23 $
Réponse ⇒
~> emacs Java2D/src/Intro.java &
On ajoute en tête du fichier des lignes de commentaires du genre
//
//
//
$Revision : 1.1 $
$Author : rr $
$Date : 2006/01/27
06:08:23 $
L’intérêt de ces marques entre deux signes dollar est qu’elles sont reconnues par RCS lorsqu’on lui demande
d’extraire des versions de ses bases (CVS utilise une base RCS pour chaque fichier qu’il gère). Lors d’une
commande co, RCS effectue des substitutions en remplaçant des identificateurs prédéfinis pazr la veleur qu’il
connait : date de la dernieère version, numéro de version, auteur du fichier... Ces informations marquent ainsi
les documents avec ces informations d’identification et celles-ci peuvent être affichées par des commandes
comme ident. Bien entendu, il ne faut pas que ces marques polluent les fichiers, aussi on les place dans des
commentaires du langage ou des chaînes pour des programmes, car elle resteront ainsi dans les programmes
binaires.
• Trouver l’opération cvs qui montre quels fichiers sont modifiés dans votre vision locale. Appliquez la à toute
l’arborescence, puis à votre fichier.
Réponse ⇒
La commande cvs update compare l’entrepôt distant avec le tas de sable local en vue de mettre à jour le
tas de sable. Elle annote les différents fichiers et répertoires avec une lettre M (modifié), U (remis à jour), etc.
(cf. le cours, page 24). Comme cette commande prend en argument des fichiers ou répertoires à comparer,
on peut demander une comparaison plus ou moins large, récursive (option -R) par défaut ou non (option -l
local). Lorsque des fichiers sont différents de la version de l’entrepôt, par défaut cvs update indique la
différence. Mais avec l’option -C (clean), la version locale est remplacée par la version de l’entrepôt. Au
contraire, l’option générale de cvs -n ne touche pas aux fichiers locaux, affiche seulement les différences. C’est
ce qu’il faut faire ici.
Séance de TP n◦ 01– Gestion de versions et de configurations
9
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs/Java2D
~> cvs -n update .
cvs update: Updating
cvs update: Updating
M src/Intro.java
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
cvs update: Updating
.
src
src/demos
src/demos/Arcs_Curves
src/demos/Clipping
src/demos/Colors
src/demos/Composite
src/demos/Fonts
src/demos/Images
src/demos/Lines
src/demos/Mix
src/demos/Paint
src/demos/Paths
src/demos/Transforms
~> cvs -n update Intro.java
M Intro.java
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs
~> ls
Java2D
~> cvs -n update Intro.java
cvs update: cannot open CVS/Entries for reading: No such file or directory
cvs update: nothing known about Intro.java
cvs [update aborted]: cannot open CVS/Root: No such file or directory
~> cd Java2D
~> ls
CVS
Java2Demo.html
Java2Demo.jar
README.txt
src
~> cvs -n update Intro.java
cvs update: nothing known about Intro.java
~> cvs -n update src/Intro.java
M src/Intro.java
~> cvs -n update -l src
cvs update: Updating src
M src/Intro.java
? src/cvs
• Trouvez l’opération cvs qui visualise les modifications effectuées.
Réponse ⇒
La commande cvs diff compare les fichiers locaux à ceux de l’entrepôt, dans une certaine version (par
défaut la plus récente). On peut comparer des fichiers explicites ou des répertoires, de manière récursive ou
non. Cette commande ne modifie pas le tas de sable, donc inutile de mettre l’option -n.
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs/Java2D/src
~> cvs diff -l .
cvs diff: Diffing .
Index: Intro.java
===================================================================
RCS file: /u/profs/collet/l3info/envtprog/TP1/cvsroot1/Java2D/src/Intro.java,v
retrieving revision 1.3
Séance de TP n◦ 01– Gestion de versions et de configurations
10
diff -r1.3 Intro.java
19,20d18
<
<
23,25d20
< *
< * @version @( # ) I n t r o . j a v a
1.11 00/08/21
< * @author Brian Lichtenwalter
26a22
>
Ici, on compare le répertoire courant, tous ses fichiers, mais de façon non récursive (option -l local).
4. Mise à jour de la base CVS pour diffuser vos modifications
• Utilisez l’opération commit sur le seul fichier modifié pour mettre à jour la base “CVS” en ajoutant comme
message « modification de votre_nom pour le TP ».
Réponse ⇒
On utilise la commande commit. On peut lui demander ses options et ses arguments avant de l’exécuter.
~> cvs -H commit
Usage: cvs commit [-Rlf] [-m msg | -F logfile] [-r rev] files...
-R
Process directories recursively.
-l
Local directory only (not recursive).
-f
Force the file to be committed; disables recursion.
-F logfile Read the log message from file.
-m msg
Log message.
-r rev
Commit to this branch or trunk revision.
(Specify the --help global option for a list of other help options)
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs
~> cvs commit -m "modif de rr pour le TP" Java2D
cvs commit: Examining Java2D
cvs commit: Examining Java2D/src
cvs commit: Examining Java2D/src/demos
cvs commit: Examining Java2D/src/demos/Arcs_Curves
cvs commit: Examining Java2D/src/demos/Clipping
cvs commit: Examining Java2D/src/demos/Colors
cvs commit: Examining Java2D/src/demos/Composite
cvs commit: Examining Java2D/src/demos/Fonts
cvs commit: Examining Java2D/src/demos/Images
cvs commit: Examining Java2D/src/demos/Lines
cvs commit: Examining Java2D/src/demos/Mix
cvs commit: Examining Java2D/src/demos/Paint
cvs commit: Examining Java2D/src/demos/Paths
cvs commit: Examining Java2D/src/demos/Transforms
Checking in Java2D/src/Intro.java;
/u/profs/collet/l3info/envtprog/TP1/cvsroot1/Java2D/src/Intro.java,v
new revision: 1.2; previous revision: 1.1
done
<--
• Vérifiez le résultat de cette opération avec une opération cvs appropriée.
Réponse ⇒ On réutilise la commande cvs -n update pour voir si les deux arborescences sont synchronisées.
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs
~> cvs -n update Java2D/
cvs update: Updating
cvs update: Updating
? Java2D/src/cvs
cvs update: Updating
cvs update: Updating
Java2D
Java2D/src
Java2D/src/demos
Java2D/src/demos/Arcs_Curves
Intro.java
Séance de TP n◦ 01– Gestion de versions et de configurations
cvs
cvs
cvs
cvs
cvs
cvs
cvs
cvs
cvs
cvs
update:
update:
update:
update:
update:
update:
update:
update:
update:
update:
Updating
Updating
Updating
Updating
Updating
Updating
Updating
Updating
Updating
Updating
11
Java2D/src/demos/Clipping
Java2D/src/demos/Colors
Java2D/src/demos/Composite
Java2D/src/demos/Fonts
Java2D/src/demos/Images
Java2D/src/demos/Lines
Java2D/src/demos/Mix
Java2D/src/demos/Paint
Java2D/src/demos/Paths
Java2D/src/demos/Transforms
5. Mise à jour de votre répertoire pour prendre en compte les nouveautés dans la base
CVS
• Utilisez l’opération update pour obtenir les modifications effectuées par les autres développeurs sur le serveur
CVS.
Réponse ⇒ On réutilise la commande cvs update, mais cette fois sans l’option -n pour mettre à jour le tas de sable. Si
on utilise l’option -C c’est la version des autres étudiants qui écrasera la modification locale. Si un fichier n’a
pas été modifié localement, mais a été modifié par d’autres étudiants dans leur tas de sable et qu’ils ont fait un
cvs commit, alors c’est leur version qui écrasera la version locale, avec l’indication U.
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs
~> cvs update Java2D
cvs update: Updating Java2D
cvs update: Updating Java2D/src
U Java2D/src/Surface.java
? Java2D/src/cvs
cvs update: Updating Java2D/src/demos
cvs update: Updating Java2D/src/demos/Arcs_Curves
...
Ici, c’est le fichier “Java2D/src/Surface.java” qui a été modifié par d’autres étudiants.
• Visualisez le résultat de l’update sur la sortie de la commande et dans le répertoire.
Réponse ⇒ La commande update précédente a affiché sur la voie d’erreur une trace des mises-à-jour effectuées.
Si on veut voir les modifs effectuées, on peut regarder la date des fichiers mis à jour et les informations
d’identifications, s’il y en a.
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs/Java2D/src
~> ident Surface.java
Surface.java:
{\sffamily
Surface.java v1.2
27/01/2006 08:32 Exp }
~> ident Intro.java
Intro.java:
$Revision: 1.4 $
$Author: rr $
$Date: 2006/01/26 22:18:46 $
• Vérifiez les modifications en cherchant et en visualisant les modifications faites par les autres binômes.
Réponse ⇒ Comme la version des autres étudiants est maintenant dans le tas de sable local, si on veut voir les modifications apportées, il faut demander à l’entrepôt de fournir la version d’origine. Cela peut être obtenbu avec la
commande diff en précisant les versions.
~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs/Java2D/src
~> cvs diff -r1.1 Surface.java
Index: Surface.java
===================================================================
Séance de TP n◦ 01– Gestion de versions et de configurations
12
RCS file: /u/profs/collet/l3info/envtprog/TP1/cvsroot1/Java2D/src/Surface.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -r1.1 -r1.2
1,30c1
< /*
< * @( # ) S u r f a c e . j a v a
1.41 00/06/19
< *
< * Copyright (c) 1998, 1999 by Sun Microsystems, Inc. All Rights Reserved.
...
< * the design, construction, operation or maintenance of any nuclear
< * facility. Licensee represents and warrants that it will not use or
< * redistribute the Software for such purposes.
< */
<
--> / / { \ s f f a m i l y « S u r f a c e . j a v a v1 . 2 » 2 7 / 0 1 / 2 0 0 6 0 8 : 3 2 Exp }
Ceci montre que la nouvelle version a remplacé l’ancien commentaire d’entête par le commentaire $Id: ...
qui est exploité par la commande ident vue précédemment.
6. Gestion des conflits
• Editez tous (au moins deux binômes à la fois) le fichier « README » en ajoutant une ligne au début ou à la
fin, avec votre nom.
• Faites un commit...
• Que se passe-t-il ? et que faire ?
Réponse ⇒ On suppose que deux étudiants ont modifié le fichier “Java2D/src/Tools.java”. On suppose que
l’étudiant ETU2 fait son commit avant l’étudiant ETU1. Le premier commit est enregistré comme d’habitude,
mais le deuxième va produire une erreur d’incompatibilité.
~etu2> cvs commit -m "modif de l’étudiant ETU2" Java2D
cvs commit: Examining Java2D
cvs commit: Examining Java2D/src
cvs commit: Examining Java2D/src/demos
...
Checking in Java2D/src/Tools.java;
/u/profs/collet/l3info/envtprog/TP1/cvsroot1/Java2D/src/Tools.java,v
new revision: 1.2; previous revision: 1.1
done
<--
~etu1> cvs commit -m "modif de l’étudiant ETU1" Java2D
cvs commit: Examining Java2D
cvs commit: Examining Java2D/src
cvs commit: Up-to-date check failed for Java2D/src/Tools.java’cvs commit:
Java2D/src/demos...cvs [commit aborted]: correct above errors first!
Tools.java
Examining
Face à cet échec, il faut que l’étudiant qui arrive en 2e position face une fusion de ses changements avec
ceux de l’autre, puis enregistre le résultat avec commit. Par défaut, la fusion se fait avec la dernière version
enregistrée. Sinon, on peut préciser une version de l’entrepôt avec l’option -j rev.
etu1~> pwd
/u/deptinfo/rr/l3i8/01.CVS/Q2cvs/Java2D/src
etu1~> cvs update Tools.java
RCS file: /u/profs/collet/l3info/envtprog/TP1/cvsroot1/Java2D/src/Tools.java,v
retrieving revision 1.1.1.1
retrieving revision 1.2
Merging differences between 1.1.1.1 and 1.2 into Tools.java
M Tools.java
etu1~> more Tools.java
# On v o i t
# fichier
b i e n que l e s m o d i f i c a t i o n s
ont été e f f e c t u é e s .
faites
par
les
deux
étudiants ,
au d é b u t
et à la
fin
du
Séance de TP n◦ 01– Gestion de versions et de configurations
13
Si les deux modifications portent sur la même partie du texte, la fusion ne peut pas être autotisée et il faut alors
faire appel à un éditeur de texte.
7. Outil graphique pour CVS : Cervisia
• Lancez l’application cervisia
• Configurez la base CVS avec la syntaxe utilisée pour désigner la base CVS.
• Ouvrez votre répertoire et vérifiez que l’état des fichiers s’affiche correctement (dépliez complètement la hiérarchie si nécessaire).
• Utilisez le menu déroulant et la commande resolve pour visualiser le conflit et tentez de le résoudre.
• Naviguez dans la hiérarchie et visualisez l’arbre de version des fichiers que vous avez modifiés (le premier et
celui en conflit).
• Refaites une modification simple comme dans les exercices 4 et 5, mais en effectuant les opération à l’aide de
l’outil (modification, visualisation des différences, filtrage des fichiers modifiés, propagation, mise a jour).
8. Utilisation de bases CVS distantes
• Allez sur le site “http://winmerge.sourceforge.net”
• Sélectionnez l’onglet D̈eveloper", puis dans la section CVS client access, naviguez dans CVS et lisez les instructions.
• Profitez-en pour naviguer dans l’arborescence CVS par le web (Browse CVS repository).
• Créez un nouveau projet dans cervisia et connectez vous au serveur anonyme.
• Récupérez une arborescence : il existe deux modules, CVSROOT pour l’administration, et WinMerge, qui
contient tous les sources. Commencez par récupérer CVSROOT car la récupération est longue. S’il vous reste
du temps, récuperez le module WinMerge et observez les fichiers sources (numéros de version, modifications
effectuées, etc.).