Concurrent Versions System : système pour versions concurrentes.

Besoin

Permettre à plusieurs personnes de travailler simultanément sur un ensemble de fichiers.

Analyse

CVS est un VCS utilisant un modèle copie/modification/fusion : tous les développeurs peuvent obtenir (check out) un fichier puisqu'il ne s'agit que de copies de travail (working copy). Lorsqu'ils valident (commit) leur version modifiée :

  • soit personne d'autre n'a modifié ce fichier et la copie de travail est placée dans le référentiel avec un commentaire (log message) de l'auteur.
  • soit d'autres ont déjà publié une version modifiée et CVS propose de mettre à jour (update) la copie de travail. Cette mise à jour détecte si les modifications de la version publiée et de la copie de travail sont compatibles (i.e. ont modifié des parties différentes du fichier)
    • si c'est le cas, CVS les fusionne (merge) dans la copie de travail, qui n'a plus qu'à être validée (committed) pour envoi dans le référentiel.
    • si ce n'est pas le cas, CVS place dans la copie de travail une fusion des deux versions avec des indicateurs de conflit (conflict). Le développeur résoud alors ces conflits manuellement (après discussion avec le développeur de la version publiée par exemple) puis valide (commit) la version résolue..

Conception

CVS stocke l'ensemble des versions dans un référentiel (repository).

Sous une arborescence du choix des utilisateurs se trouve :

  • leurs copies de travail
  • des sous-répertoires spécifiques à CVS par répertoire contenant les fichiers d'administration :
    • Root, qui contient le CVSROOT (:ext:javarome@cvs.kicsa.sourceforge.net:/cvsroot/kicsa par exemple)
    • Repository, qui contient le module dans le CVSROOT
    • Entries, qui contient la liste des fichiers pris en charge par CVS, sous la forme Type particulier/NomFichier/Revision/Date en temps universel// (ce qui permet de détecter le besoin de synchronisation par rapport à une version du référentiel ayant une date différente) donc par exemple :
      /MonFichier.java/1.1.1.1/Wed Dec 04 21:52:14 2002//
      D/MonRepertoire////

Implémentation

La localisation du référentiel est spécifiée par la variable d'environnement CVSROOT.

CVS Version 1 Commentaire
Domaine Technologie Release 0 1 2 3 4 5 6
Commandes co Check Out : Extraction de copie de travail
update Fusion les sources du référentiel avec les sources modifiées. Suivi d'un test (voir si le code fonctionne toujours après fusion) puis d'un commit typiquement.
commit ci Valide les modifications pour être placées dans le référentiel. Après update typiquement.
log Liste des modifications historisées
diff Affiche les différences entre deux versions
add Ajout d'un fichier dans le référentiel. Suivi de commit typiquement
rm ReMove : suppression d'un fichier du référentiel après suppression en local. A suivre d'un commit.
-P Prune empty directories
tag Marquer des sources (comme faisant partie d'une release typiquement)
Options -d pserver Password-authenticated server
ext External connection program tels que rsh, SSH, kserver (Kerberos 4), gserver (GSSAPI ou Kerberos 5)
Mots-clés Substitués Auteur $Author$
Nom de login de l'utilisateur ayant placé la révision.
Date $Date$ Date et heure (UTC) à laquelle la révision a été placée
En-tête $Header$ En-tête standard contenant le chemin complet du fichier, son numéro de révision, sa date (UTC), son auteur, son état (et celui qui l'a verrouillé le cas échéant, très rare)
Id $Id$ Comme En-tête, sauf que le fichier est sans son chemin complet
Révision $Revision$ Numéro affecté à cette révision
Source $Source$ Chemin complet du fichier
Protocole Distant Non Oui Protocole distant
Référentiel Format 1.3
Local Répertoire de travail 1.5

Notes

  • Adapté pour le partage de code source à travers le réseau (Internet y compris) entre développeurs indépendants éloignés.
  • Licence GPL et donc très souvent employé pour la gestion de configuration OSS
  • De plus en plus souvent intégré dans des IDE (TCC, JBuilder, WSAD, IDEA)
  • Ne pas confondre les numéros de révisions de fichier CVS (internes) et le numéro de version de votre produit (public).
  • Le premier numéro de version CVS vaut toujours 1.1.1.1.
  • On peut éviter de spécifier le référentiel à chaque commande :
    • en spécifiant sa valeur dans la variable d'environnement CVSROOT si vous n'utilisez pas plusieurs référentiels
    • parce que les copies de travail, une fois extraites (checked out), savent de quel référentiel elles proviennent (grâce aux informations contenues dans le sous-répertoire "CVS" de l'endroit où elles se trouvent).

Exemples

CVS est utilisé sur les projets :

Des exemples de commandes CVS sont :

cvs -z3 -d:pserver:anonymous@cvs.kicsa.sourceforge.net:/cvsroot/kicsa co MonModule

cvs -z3 -d:ext:
javarome@cvs.kicsa.sourceforge.net:/cvsroot/kicsa co MonModule

Limitations

  • Peu adapté au refactoring, en raison d'inadéquation :
    • à la suppression de fichiers et répertoires (supprimer le fichier local avant, suppression de répertoire différente, la suppression de répertoire vide ne supprime pas le répertoire dans le référentiel)
    • au renommage de fichier et répertoires (copie et
  • Impossibilité d'avoir un répertoire nommé CVS

Voir