Accueil > Développer sur Mac OS X > Contrôle de Version sur Mac OS X, Part 2

Contrôle de Version sur Mac OS X, Part 2

Par Kevin O’Malley, le 08/08/2003

traduit par Quentin, le 24/11/2003

Le Contrôle de Version sur Mac OS X, Part 1 premier article de cette série vous a introduit aux bases du contrôle de version, a abordé quelques exemples de son utilisation sur des projets, et a indiqué quels systèmes de contrôle de version sont disponibles sous Mac OS X. Dans cet article, vous aurez la chance d’appliquer cette connaissance en utilisant un des systèmes de contrôle de version les plus populaires, Concurrent Versions System (CVS, Système de Versions Concurrentes), sur un projet test bâti avec Project Builder. Plus spécifiquement, vous apprendrez à configurer CVS pour un accès à distance, à importer un projet dans CVS, et à utiliser les commandes CVS à partir de Project Builder. Avant de continuer, assurez-vous d’avoir lu le premier article de cette série et “Synchro Avec CVS,” de James Duncan Davidson. Assurez-vous aussi d’avoir installé les Outils de Développement d’Apple, disponible gratuitement sur le site développeur d’Apple.

Les outils de développement d’Apple comprennent un IDE appelé Project Builder, qui inclut un environnement de développement pour éditer, construire, déboguer, et lancer des applications Mac OS X. Project Builder n’inclut pas les principaux outils de développement (compilateur, éditeur de liens, contrôle de version, etc.) comme part du programme. A la place, il utilise des outils de développement UNIX tels que gcc, g++, gdb, et CVS. En un sens, Project Builder est évolutionnaire; il perpétue la famille des environnements de développement de type IDE pour le Macintosh, mais rompt avec la tradition en utilisant des outils externes à base UNIX pour l’implémentation de ses tâches de développement. Cela donne un bel équilibre tout en offrant une interface moderne pour le d&eacut;veloppement d’applications et en mettant l’ensemble des outils UNIX à portée de main.

Project Builder supporte l’accès à CVS à partir de son interface graphique. Comme vous l’avez appris dans le premier article, CVS n’est en aucun cas le seul système de contrôle de version sur Mac OS X. Cependant, c’est l’un des systèmes les plus populaires du monde UNIX existant sur Mac OS X, et il est supporté par Project Builder. Pour toutes ces raisons, ainsi que de par sa popularité dans la communauté open source, cela en fait un choix de contrôle de version judicieux sous Mac OS X.

La Configuration de CVS

Il y a deux manières de configurer CVS — pour l’accès en local ou à distance. L’accès en local signifie que le dépôt CVS se trouve sur votre machine de développement. Dans le cas de l’accès à distance, le dépôt se trouve sur une machine du réseau pendant que vous développez sur la machine que vous souhaitez, vous connectant au dépôt par le réseau.

Bien que les deux méthodes aient leurs avantages et leurs inconvénients, je préfère l’accès à distance. De nos jours, les réseaux sont présents partout, aussi puis-je conserver mon dépôt à un endroit et y accéder à partir de nombreux autres endroits. Une autre bonne raison de choisir l’accès à distance est la gestion de projets dont l’équipe de développement est géographiquement dispersée. Par exemple, envisagez ce qui suit: vous et quelques amis, vous voulez développer un nouvel éditeur pour Mac OS X. Chaque personne vit à différents endroits du pays. Il est requis pour le projet que les membres puissent accéder à et mettre à jour le travail de chacun à tout moment. Puisque CVS est destiné au travail à travers le réseau, un développeur configure un dépôt CVS sur une seule machine connectée au réseau. Les autres développeurs configurant leur environnement pour pouvoir accéder à distance au dépôt par le réseau. Maintenant tous les développeurs ont accès à CVS comme si le dépôt était accessible depuis leur système de fichiers.

Les étapes suivantes vous indiquent comment configurer CVS pour l’accès à distance. Pour cela, vous aurez besoin de deux machines connectées au réseau; l’une comporte le dépôt CVS et l’autre pour le développement. Appelons la machine qui comporte le dépôt “hôte CVS à distance”, et la machine de développement “hôte CVS client”.

La première étape est de configurer l’hôte CVS à distance. Pour cet exemple, je supposerai que le nom d’hôte de l’hôte CVS à distance est “cvshost.somedomain.edu”, que le nom d’utilisateur est “omalley”, et que le dépôt CVS se trouve dans
/Users/omalley/cvs-repository.

  1. Si nécessaire, créez un compte pour vous-même et ceux qui accèderont au dépôt.
  2. Ouvrez les Préférences Système (dans Applications), cliquez sur l’icône de Partage, puis cochez la case Connexion à distance. Cela lance le daemon SSH, qui vous permet de vous connecter à la machine par SSH.
  3. Ouvrez le Terminal (dans /Applications/Utilitaires), et créez un répertoire appelé cvs-repository, qui contiendra le dépôt (repository en anglais) CVS de vos projets. Placez ce répertoire sur une partition disque suffisamment grande pour gérer les demandes anticipées de stockage de fichier. Essayez d’être sur-conservateur dans l’estimation de votre espace disque requis. Pour cet exemple, placez le dépôt dans votre répertoire d’accueil.% mkdir ~/cvs-repository
  4. Lancez la commande d’initialissation CVS pour configurer le dépôt. Vous n’avez besoin de lancer cette commande qu’une fois, avant que quiconque n’utilise le nouveau dépôt.% cvs -d /Users/omalley/cvs-repository init
  5. Mettez à jour le fichier cvswrapper , dans /Users/omalley/cvs-repository/CVSROOT, pour manipuler les fichiers binaires et les bundles de façon appropriée. Pour cela, lisez Synchro avec CVS, et la documentation Apple concernant ProjectBuilder.

Maintenant que le dépôt est prêt, vous pouvez configurer l’hôte CVS client. Pour cela, effectuez les étapes suivantes sur l’hôte CVS client.

  1. Générez vos fichiers de paires de clés SSH, en utilisant le même mot de passe que celui de votre compte utilisateur sur l’hôte CVS à distance.
    % ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/omalley/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /Users/omalley/.ssh/id_rsa.
    Your public key has been saved in /Users/omalley/.ssh/id_rsa.pub.
    The key fingerprint is:
    1a:61:41:ad:a2:f2:e3:4b:d9:bd:49:af:c5:5e:46:66 omalley@G4.local.
  2. Ajoutez votre clé publique dans le fichier authorized_keys2 de l’hôte CVS à distance. L’exemple suivant suppose que vous n’avez pas de répertoire ~/.ssh ou de fichier authorized_keys2 sur l’hôte CVS à distance.
    % scp ~/.ssh/id_rsa.pub omalley@cvshost.somedomain.edu:
    The authenticity of host cvshost.somedomain.edu (123.123.12.3)'
    can't be established.
    RSA key fingerprint is
    1a:61:41:ad:a2:f2:e3:4b:d9:bd:49:af:c5:5e:46:66.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'cvshost.somedomain.edu,123.123.12.3'
    (RSA) to the list of known hosts.
    omalley@cvshost.somedomain.edu’s password:
    id_rsa.pub           100%
    |*******************************************|   227       00:00
    % ssh cvshost.somedomain.edu
    omalley@ cvshost.somedomain.edu’s password:
    Last login: Mon Jul 28 20:40:10 2003 from bgp786711bgs.na
    Welcome to Darwin!
    % mkdir .ssh
    % cat id_rsa.pub > ~/.ssh/authorized_keys2 
    % rm id_rsa.pub
    % exit
  3. Ajoutez les lignes suivantes à votre fichier ~/.cshrc de l’hôte client:
    setenv CVS_RSH ssh
    setenv CVSEDITOR emacs
    setenv CVSROOT :ext:omalley@
    cvshost.somedomain.edu:/Users/omalley/cvs-repository
    eval `ssh-agent`
    ssh-add
  4. Ajoutez les lignes à votre fichier ~/.logout de l’hôte client. Cela empêche les multiples ssh-agents de s’installer sur votre système en tuant le processus quand vous sortez du shell.
    eval `ssh-agent -k`
    sleep 1
  5. Créez un répertoire appelé ~/MacOSX sur l’hôte client, créez un fichier nommé ~/MacOSX/environment.plist, et ajoutez-lui les lignes suivantes:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist SYSTEM
    "file://localhost/System/Library/DTDs/PropertyList.dtd">
    <plist version="0.9">
    <dict>
            <key>CVS_RSH</key>
            <string>/usr/bin/ssh</string>
    </dict>
    </plist>

Fermez la session et reconnectez-vous pour que les réglages prennent effet.

Pour Tester Votre Configuration

  1. Ouvrez un nouveau shell dans le Terminal, et à l’invite, entrez la même passphrase (mot de passe) que pour la création de vos fichiers de paires clés SSH.
  2. Contrôlez CVSROOT dans un répertoire temporaire:
    % cvs co CVSROOT .
    cvs server: Updating CVSROOT
    U CVSROOT/checkoutlist
    U CVSROOT/commitinfo
    U CVSROOT/config
    U CVSROOT/cvswrappers
    U CVSROOT/editinfo
    U CVSROOT/loginfo
    U CVSROOT/modules
    U CVSROOT/notify
    U CVSROOT/rcsinfo
    U CVSROOT/taginfo
    U CVSROOT/verifymsg
    cvs server: Updating .
    cvs server: Updating CVSROOT

Programme d’Exemple : MyPing

Maintenant que CVS est configuré, nous pouvons commencer à l’étudier ainsi que Project Builder. Le programme d’exemple que nous utiliserons dans cet article est MyPing—un front end Cocoa pour l’outil UNIX ping. Vous utilisez ping pour tester si un hôte est disponible sur le réseau et pour mesurer combien de temps les paquets prennent pour l’atteindre. Par exemple, imaginons que que vous tentiez d’accéder à un site web, mais que pour une raison quelconque, cela prenne beaucoup de temps. Avec ping, vous pouvez vérifier que le site existe toujours (est en ligne), et mesurer le délai d’accès (pour déterminer l’origine du délai, utilisez traceroute).

# Determine if a host is alive.
% ping www.gnu.org
PING www.gnu.org (199.232.41.10): 56 data bytes
64 bytes from 199.232.41.10: icmp_seq=0 ttl=47 time=89.463 ms
64 bytes from 199.232.41.10: icmp_seq=1 ttl=47 time=45.884 ms   

# Determine if host is alive, waiting 2 seconds between pings,
# sending 4 pings.
% ping -i2 -c4 www.gnu.org
PING www.gnu.org (199.232.41.10): 56 data bytes
64 bytes from 199.232.41.10: icmp_seq=0 ttl=47 time=67.659 ms
64 bytes from 199.232.41.10: icmp_seq=1 ttl=47 time=45.732 ms
64 bytes from 199.232.41.10: icmp_seq=2 ttl=47 time=45.299 ms
64 bytes from 199.232.41.10: icmp_seq=3 ttl=47 time=47.636 ms

--- www.gnu.org ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 45.299/51.581/67.659 ms

MyPing ajoute une interface Cocoa à ping, rendant le programme accessible aux utilisateurs peu habitués à la ligne de commande UNIX. De plus, c’est un exemple sympathique pour illustrer la manière d’utiliser la puissance des outils de ligne de commande pour créer de nouveaux programmes—quelque chose que la communauté UNIX fait tout le temps avec des langages de script tels que Perl et Python.

Cette version de MyPing implémente les bases. Dans le prochain article, nous ajouterons quelques nouvelles fonctionnalités, y compris l’enregistrement de la sortie de ping dans un fichier. Avant de continuer,
téléchargez MyPing.

Importer MyPing dans CVS

Maintenant que votre environnement est configuré et que vous avez téléchargé le projet MyPing, il est temps de commencer à utiliser CVS sous Project Builder. Malheureusement, Project Builder ne supporte qu’un sous-ensemble des fonctionnalités de CVS avec son interface graphique. Pour accéder à toutes les commandes CVS, vous pouvez utiliser la ligne de commande ou le logiciel à interface graphique Concurrent Versions Librarian (CVL) (voir dernier article). Pour cet article, nous utiliserons la ligne de commande.

Une fonction CVS inaccessible à partir de ProjectBuilder est la commande import.
Comme vous le savez, avant que CVS puisse relever les changements de votre
projet, vous devez importer le projet dans CVS, ce qui le place sous contrôle
de version. Pour cela, vous utilisez la commande CVS import.
Cette commande prend les fichiers du répertoire de travail courant (et
ses sous-répertoires) et les ajoute au dépôt CVS.

cvs import [-options] repository vendortag releasetag

L’argument d’option spécifie les options appliquées par la commande import. L’argument repository indique le répertoire dans lequel CVS conservera le projet à l’intérieur du dépôt. Par exemple, si vous spécifiez MyPing comme nom de dépôt, le répertoire MyPing est conservé dans ${CVSROOT}/MyPing,
ou bien dans /Users/omalley/cvs-repository/MyPing, sur l’hôte CVS à distance. Consultez la page man de CVS ou le manuel en ligne pour plus d’informations sur la commande import .

Pour importer MyPing, déplacez-vous dans le répertoire du MyPing téléchargé et entrez la commande suivante (l’exemple suppose que MyPing a été téléchargé dans votre répertoire projects) :

% cd ~/projects/MyPing
% cvs import -m "Import of MyPing." MyPing example-
program-myping myping_0

Enfin, supprimez votre répertoire MyPing local et vérifiez la
version importée :

% cd ~/projects
% rm -rf MyPing
% cvs co MyPing

Lancer Project Builder

L’une des difficultés rencontrées quand Project Builder fonctionne avec un dépôt CVS à distance est la gestion du mot de passe avec Project Bulder. Pour ce faire, vous devez lancer Project Bulder à partir du bon environnement. IL y a deux techniques pour cela: lancer Project Builder à partir d’un shell avec les bonnes valeurs de variables d’environnement, ou utiliser le programme SSHPassKey . Nous utiliserons la méthode ouverte, mais si vous préférez, vous pouvez utiliser le programme SSHPassKey.

Pour permettre à Project Builder de gérer votre mot de passe:

  1. Assurez-vous de paramétrer vos variables d’environnement correctement, comme décrit dans la section de Configuration de CVS.
  2. Ouvrez un shell dans le Terminal, entrez votre phrase de passe, et entrez les commandes suivantes:
     % cd ~/projects/MyPing % open /Developer/Applications/Project\ Builder.app/ MyPing.pbproj

La commande open lance Project Builder comme si vous aviez double-cliqué sur l’icône du fichier, mais à l’intérieur de l’environnement adéquat. Project Builder peut maintenant se connecter au dépôt et utiliser le mot de passe pour accéder aux fichiers. Notez la barre de status de Project Builder, qui indique maintenant sa connexion au dépôt CVS.

L’Intégration CVS de Project Builder

L’une des premières choses que vous remarquerez quand Project Builder est connecté à un dépôt CVS est que la liste Groups & Files contient une nouvelle colonne, avec une icône CVS. Cela indique que Project Builder reconnaît que le projet est sous contrôle de version.

Project Builder utilise cette colonne pour afficher le statut de vos fichiers.
Le tableau suivant montre la signification du caractère d’information
de status.

Symbol Description
A
Fichier ajouté
C
Fichier fusionné, changements
E
Fichier exporté
F
Fichier supprimé
G
Fusion de fichier réussie
M
Fichier modifié
N
Nouveau fichier ajouté
O
Fichier détruit
R
Fichier retiré
T
Balise
U
Fichier existe dans l’entrepôt, nouvelle révision créée
W
Fichier retire du fichier des entrées
?
Fichier absent de l’entrepôt
-
Fichier, ou dossier , absent de l’entrepôt

Quand vous effectuez des opérations CVS telle que soumettre et ajouter des fichiers, cette colonne reflète le statut du fichier. Par exemple, si vous modifiez un fichier sur votre copie de travail, Project Builder affiche un M à côté du fichier, qui indique que vous avez modifié le fichier local et qu’il est différent de la version principale sur CVS.

Jetez un rapide coup d’œil aux préférences CVS de Project Builder en choisissant Preferences dans le menu Project Builder et en cliquant sur l’icône CVS. La plupart des options sont claires, mais un élément intéressant est le menu pop-up Tool for Comparisons (Outil de Comparaison). Ce menu vous permet de choisir le programme que Project Builder utilise pour afficher les différences entre fichiers locaux et fichiers du dépôt. Pour le moment, vous pouvez sélectionner le programme FileMerge d’Apple, la fonctionnalité de différence de fichiers de BBEdit, ou un autre outil diff. FileMerge, un programme de comparaison et de fusion de fichiers à interface graphique situé dans le dossier /Developer/Applications, est implémenté en tant qu’appllication utilisant la commande UNIX diff qui renvoie son résultat à un script ed.

Project Builder permet l’accès aux commandes CVS à travers son menu CVS. Jetons un coup d’œil aux commandes que Project Builder supporte et leur signification.

  • CVS > Refresh Status - Met à jour l’information de status CVS de l’item sélectionné.
  • CVS > Update To
    • CVS > Update To > Latest, Merge w/Local - Fusionne la version de base de CVS dans le fichier sélectionné.
    • CVS > Update To > Latest, Replace Local - Remplace la copie de travail du fichier sélectionné avec la version de base.
    • CVS > Update To > Previous - Supprime vos changements locaux du fichier sélectionné et renvoie la version vérifiée-originale.
    • CVS > Update To > Revision… - Supprime vos changements locaux du fichier sélectionné et utilise une version passée; Project Builder vous invite à à sélectionner le numéro de version dans une liste.
    • CVS > Update To > Specific Revision - Supprime vos changements locaux du fichier sélectionné et utilise une version passée; vous êtes invité à entrer le numéro de version.
  • CVS > Compare With
    • CVS > Compare With > Latest - Compare le fichier sélectionné (copie de travail) avec la version de base dans le dépôt.
    • CVS > Compare With > File - Compare le fichier sélectionné (copie de travail) avec un fichier du disque; Project Builder vous invite à sélectionner un fichier.
    • CVS > Compare With > Previous - Compare le fichier sélectionné (copie de travail) avec la version que vous avez vérifiée.
    • CVS > Compare With > Revision - Compare le fichier sélectionné (copie de travail) avec une version spécifique dans le dépôt CVS; Project Builder vous invite à sélectionner le numéro de version dans une liste.
    • CVS > Compare With > Specific Revision - Compare le fichier sélectionné (copie de travail) avec une version spécifique dans le dépôt CVS; Project Builder vous invite à entrer le numéro de version.
  • CVS > Add to repository - Ajoute, ou inscrit, le fichier sélectionné (copie de travail); dans les enregistrements CVS; vous devez soumettre le fichier
    (CVS > Commit
    Change) pour l’ajouter au dépôt.
  • CVS > Commit Changes - Ajoute, ou publie, les changements du fichier sélectionné au dépôt CVS.
  • CVS > Show CVS - Affiche une table de tous les fichiers du projet avec les informations de status.
  • CVS > Cancel Pending CVS Operation - Stoppe une opération CVS courante.
  • CVS > Disable CVS Integration - Eteint temporairement le support CVS.

Une opération courante, non listée dans le menu CVS, consiste à effacer les fichiers du dépôt. Pour effacer un fichier, sélectionnez le fichier que vous voulez effacer, appuyez sur la touche Delete, et suivez les instructions à l’écran. Une autre action utile est d’obtenir les informations de statut d’un fichier. Pour cela, choisissez un fichier dans la liste de fichiers, sélectionnez Project > Show Info, et sélectionnez la tabulation CVS.

Utiliser CVS dans Project Builder

Regardons maintenant comment utiliser CVS et Project Builder avec le programme test. Pour commencer, compilez MyPing (Build > Build) et lancez-le quelques fois. Essayez de pinger quelques sites pour voir comment le programme fonctionne.

Le premier changement que nous effectuerons sera d’afficher un nom d’hôte par défaut dans le champ de texte Host. D’abord, cliquez sur, et ouvrez, le triangle d’affichage du fichier Classes (dans Files & Groups), sélectionnez PingController.m, et trouvez la méthode init. Cette méthode utilise trois messages setValue pour initialiser le nom d’hôte et les éléments de menu affichés. Comme vous pouvez le constater, ces messages initialisent en fait le nom d’hôte à une chaîne vide et les éléments de menu aux positions 2 et 1 en utilisant des nombres magiques.

[param setValue:@"-c":@"2"];
[param setValue:@"-i":@"1"];
[param setValue:@"-host":@""];

Modifions ceci en ajoutant trois constantes et en initialisant les valeurs à ces constantes. Mettez le code à jour au début de PingController.m avec les lignes de code suivantes (en gras).

#import "PingController.h"
#import "AppSupport.h"

NSString *PING_CMD = @"/sbin/ping";
NSString *PING_BUTTON_IDLE = @"Ping";
NSString *PING_BUTTON_RUNNING = @"Stop";

NSString *DEFAULT_NUM_PINGS_POS = @"2";
NSString *DEFAULT_SECS_BETWEEN_PINGS = @"1";
NSString *DEFAULT_HOST = @"localhost";

@implementation PingController

- (id) init {
  self = [super init];
  param = [[PingParameters alloc] init];
  directory = NSHomeDirectory();
  pingInProgress = NO;

  [param setValue:@"-c":DEFAULT_NUM_PINGS_POS];
  [param setValue:@"-i":DEFAULT_SECS_BETWEEN_PINGS];
  [param setValue:@"-host":DEFAULT_HOST];

  return self;
}

Remarquez qu’après avoir sauvegardé le fichier, Project Builder affiche un M dans la colonne CVS. Ceci indique que vous avez modifié le fichier. Recompilez le programme et lancez-le. Maintenant le nouveau nom d’hôte, “localhost”, apparaît dans le champ de texte Host.

Puisque vous avez ajouté une nouvelle fonctionnalité au programme, vous devriez enregistrer, ou soumettre, votre changement au dépôt CVS. Pour cela, sélectionnez le fichier modifié, PingController.m, dans la liste de fichiers, choisissez CVS > Commit Changes, entrez une description du changement, puis cliquez sur le bouton Commit. Project Builder ajoute vos changements au dépôt CVS. Notez que Project Builder a enlevé le M de la colonne CVS et mis à jour le marqueur d’ID en haut du fichier.

Une autre opération commune est de comparer deux versions d’un fichier pour voir ce qui a changé entre les révisions. Par exemple, pour comparer ce qui a changé entre les deux versions de PingController.m, sélectionnez PingController.m dans la liste de fichiers et sélectionnez CVS > Compare With > Previous. Project Builder utilise l’outil spécifié dans ses préférences CVS pour comparer les fichiers, dans ce cas FileMerge.

Cliquez pour agrandir la vue

Une autre action classique consiste à regarder les informations de
statut d’un fichier. Une fois encore, sélectionnez PingController.m dans
la liste de fichiers, choisissez Project > Show Info, et sélectionnez
la tabulation CVS.

A ce niveau, prenez un peu de temps pour explorer les autres commandes de Project Builder. Par exemple, essayez de revenir à la version originale du fichier PingController.m en le sélectionnant dans la liste de fichiers, puis en choisissant CVS > Update To > Revision, en sélectionnant la version 1.1, et en cliquant sur le bouton Update. Souvenez-vous, vos changements ne sont pas perdus; ils sont encore dans CVS en tant que version de base du fichier. Cette commande modifie juste votre copie de travail.

Réflexions Finales

Ceci conclut notre rapide survol de l’utilisation de CVS sous Project Builder. Comme vous l’avez constaté, Project BUilder utilise CVS comme système de contrôle de version par défaut, ce qui signifie que si vous développez sous Project Builder, vous vous devez d’apprendre CVS. En dépit du fait que Project Builder ne supporte qu’un sous-ensemble de commandes CVS, il inclut quand même assez de fonctionnalités pour le rendre très utile.

Dans le prochain article, nous ajouterons quelques fonctionnalités à MyPing et mettrons une version à disposition en utilisant les commandes CVS tag et branch. En plus, nous étudierons les autres interfaces Mac OS X de CVS à GUI, avec BBEdit et Concurrent Versions Librarian.

Textes originaux en anglais sur O’Reilly : Version Control On Mac OS X, Part 2 par Kevin O’Malley

admin Développer sur Mac OS X , , ,

  1. Pas encore de commentaire
  1. Pas encore de trackbacks
Vous devez être identifié pour poster un commentaire