Plusieurs développeurs

État des fichiers

La commande cvs status donne l'état des fichiers. Vous pouvez les obtenir en passant la commande :
$ cvs status [options] files

Mettre un fichier à jour

Quand vous voulez mettre à jour ou fusionner un fichier, utilisez la commande cvs update. Elle amène à votre copie de travail tous les changements que les autres développeurs auront récemment validés. Vos modifications à un fichier ne sont jamais perdues. Si aucune nouvelle révision n'est disponible, CVS fusionnera alors tous les changements dans votre copie de travail.

Résolution des conflits

Si deux personnes font simultanément des modifications sur différentes parties d'un fichier, CVS est suffisamment intelligent pour fusionner les changements tout seul. Mais si deux personnes font des changements sur la même partie d'un fichier, CVS ne peut savoir quel doit être le résultat final, et va donc abandonner en se plaignant : « Conflict ! » Les conflits surgissent quand un développeur valide un changement et qu'un second développeur, qui n'a pas utilisé la commande cvs update pour recevoir les modifications du premier développeur, essaie de valider ses propres changements incompatibles. La résolution des conflits peut prendre des heures voire des jours. Dans cette section, je vous expliquerai comment résoudre les conflits de source.

Quand vous utilisez la commande cvs commit pour envoyer automatiquement sur le serveur tous les fichiers que vous avez modifié ou ajouté à un projet, le serveur du dépôt CVS pourra vous informer que vos fichiers modifiés localement ne sont pas à jour avec le serveur, ou vous avez besoin de fusionner à la main un ou plusieurs fichiers avec les nouvelles versions déjà validées sur le serveur par un autre développeur. Voici un message d'avertissement typique survenant lors d'une session CVS :
$ cvs commit
cvs commit: Examining .
cvs commit: Up-to-date check failed for `andy.htm' 
cvs commit: Up-to-date check failed for `sample.htm' 
cvs commit: Up-to-date check failed for `index.htm'
...
cvs [commit aborted]: correct above errors first!
Vous pouvez utiliser la commande cvs update pour mettre à jour la copie locale de votre projet avec les derniers changements du dépôt CVS. Pour mettre à jour l'intégralité de votre copie locale, ouvrez un interpréteur de commandes, placez vous dans le répertoire contenant le projet que vous développez, et lancez la commande :
$ cvs update
Cela va mettre à jour et fusionner automatiquement tous les fichiers qui ont changé depuis la dernière extraction de nouveaux fichiers du dépôt CVS. Les mises à jour lignes à lignes sur des fichiers textes (comme des fichiers HTML) peuvent souvent être gérées automatiquement. CVS vous listera les fichiers qui requièreront votre attention en vue d'une modification et fusion manuelle.

Exemple de fusion automatique :

Vous modifiez localement un fichier nommé index.html et au moment où vous le validez dans l'entrepôt CVS, CVS vous répond avec l'erreur suivante :
$ cvs commit index.html
cvs commit: Up-to-date check failed for `index.html' 
cvs [commit aborted]: correct above errors first!
Cela survient car il y a une nouvelleversion de de ce fichier dans l'entrepôt CVS. Vous devez utiliser la commande cvs update pour en obtenir la dernière version sur votre machine :
$ cvs update index.html
RCS file: /usr/local/cvsroot/index.html,v
retrieving revision 1.4
retrieving revision 1.5
Merging differences between 1.4 and 1.5 into index.html 
M index.htm
Après la fusion automatique, vous devez vérifier la copie fusionnée afin qu'elle fonctionne correctement. Une fois satisfait de votre copie locale de index.html, vous la validez dans l'entrepôt CVS :
$ cvs commit index.htm
Checking in index.htm;
/usr/local/cvsroot/index.htm,v <-- index.htm
new revision: 1.6; previous revision: 1.5 
done

Exemple de fusion manuelle

Dans certains cas, votre récent travail sur certains fichiers peut être si important que le CVS aura besoin de votre intervention manuelle de façon à réintégrer les modifications de tout le monde dans l'entrepôt.
$ cvs commit index.html cvs commit: Up-to-date check failed for
`index.html' cvs [commit aborted]: correct above errors first!
Utilisez la commande update pour mettre à jour votre copie locale :
$ cvs update
cvs update: Updating .
RCS file: /usr/local/cvsroot/index.html,v
retrieving revision 1.5
retrieving revision 1.6
Merging differences between 1.5 and 1.6 into index.htm
rcsmerge: warning: conflicts during merge
cvs update: conflicts found in activity.htm
C index.htm
Cette fois-ci, CVS a été incapable de fusionner les fichiers automatiquement. Il a donc créé une copie spéciale du fichier provoquant le conflit en lieu et place du fichier originel. Ce fichier contient des lignes de marqueurs pour indiquer le début et la fin des régions conflictuelles, par exemple :
<<<<<<<< filename
Pour résoudre les conflits, modifiez simplement le fichier index.html et remplacez le texte entre les marqueurs et testez le résultat jusqu'à ce que ça marche. Vous devez aussi enlever les marqueurs :
<<<<<<<<========>>>>>>>> 
du fichier. Quand vous avez fini de corriger le fichier et l'avez testé, utilisez la commande cvs commit pour envoyer dans l'entrepôt cette dernière version de votre fichier :
$ cvs commit
Checking in index.html;
/usr/local/cvsroot/index.html,v <-- index.html
new revision: 1.7; previous revision: 1.6 
done

Les yeux (communication CVS)

CVS peut fonctionner en tant que moyen de communication de même que main courante. La fonctionnalité « garder un oeil » permet à plusieurs développeurs travaillant sur le même projet de notifier aux autres qui travaille sur quoi à un instant donné. En positionnant un oeil sur un fichier ou répertoire, un développeur peut demander à CVS de lui dire si quelqu'un d'autre commence à travailler sur ce fichier ou répertoire en lui envoyant un mél ou par un autre moyen.

Pour utiliser les yeux, vous devez modifier deux fichiers dans la partie administrative de l'entrepôt de code. Vous devez modifier le fichier $CVSROOT/CVSROOT/notify (qui spécifie à CVS comment doivent se faire les notifications) et le fichier $CVSROOT/CVSROOT/users (qui spécifie les adresses mél externes.) Le meilleur moyen de modifier