Utiliser CVS avec les paquets Debian

Ce court document est seulement destiné à donner une petite aide à la conversion de paquets pour qu'ils puissent être gérés avec CVS. Cela n'intéressera probablement que les quelques personnes qui ne connaissent pas très bien CVS et la gestion des versions. Il y a aussi un script dans /usr/share/doc/cvs-buildpackage appelé cvs-pkginit (à la fois le script et la page de manuel sont gzippées) qui affichera un résumé de ce HOWTO.

Par exemple, pour convertir un paquet foo, version bar1, révision Debian 3, essayez :

% cvs-pkginit foo bar1 3
et regardez le résumé.
Oldenburg, 6/2/97                           Joey (joey@debian.org)
                                            / Martin Schulze   /
Mobile,                                     Manoj Srivastava
                                            srivasta@debian.org

Note : dans la discussion suivante, les éléments entre les signes < et > doivent être remplacés suivant le contexte ; tout le reste doit être pris littéralement. Par exemple, si vous parlez d'un paquet dont la version originale est 2.1.82, alors « <$version> » doit être remplacé par « 2.1.82 », et « upstream_version_<$version | tr . _> » par « upstream_version_2_1_82 ».

  1. Configurer CVS
       $ CVSROOT=/où/va/se/trouver/votre/référentiel
       $ export CVSROOT
       $ cvs init
       $ mkdir $CVSROOT/debian
    

    Ceci permet de séparer vos paquets Debian de tout le reste dans votre référentiel CVS. Même si vous pensez que vous n'aurez pas besoin de CVS pour autre chose, c'est plus facile de ranger les choses correctement tout de suite plutôt que de devoir le faire ensuite (car c'est compliqué de déplacer des choses dans un référentiel).

    Si plusieurs personnes doivent utiliser CVS, vous devez être sûr qu'elles peuvent modifier le référentiel avec CVS. Choisissez un groupe (ou un ensemble de groupes) qui pourra avoir accès à une partie du référentiel, et mettez les permissions suivantes :

       # chgrp <archive> $CVSROOT/debian
       # chmod g+ws    $CVSROOT/debian
    

    Cela garantit que les membres du groupe archive peuvent créer le référentiel. Maintenant vous devez faire en sorte que les bons groupes de personnes puissent modifier certaines parties du référentiel.

       # mkdir $CVSROOT/debian/<paquet1>
       # chgrp <group1> $CVSROOT/debian/<paquet1>
       # chmod g+ws     $CVSROOT/debian/<paquet1>
       # mkdir $CVSROOT/debian/<paquet2>
       # chgrp <group2> $CVSROOT/debian/<paquet2>
       # chmod g+ws     $CVSROOT/debian/<paquet2>
    

    En tant que simple utilisateur vous devriez aussi rendre votre répertoire CVS public, soit en utilisant « -d /où/va/se/trouver/votre/référentiel » soit en mettant dans votre fichier profile du code comme celui-ci :

       $ CVSROOT=/où/va/se/trouver/votre/référentiel
       $ export CVSROOT
    
  2. Utiliser les modules
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    Dans ce qui suit, <paquet> doit être le nom du paquet comme dans le fichier debian/changelog.

    Ajoutez les lignes suivantes, la première étant essentielle, la seconde pouvant être dupliquée et s'expliquant toute seule :

       modules   CVSROOT modules
       <paquet> debian/<paquet>
    
       # cvs commit -m 'Définit les premiers modules'
    
  3. Préparer l'utilisation de CVS

    Ajoutez votre arborescence source avec les commandes suivantes (en supposant que vous l'avez déjà débianisée, et qu'il y a un fichier orig.tar.gz). Notez que les sources originales sont importées avec -ko (ce qui prend soin des fichiers binaires), mais pas les changements que nous faisons en local. Merci de noter que les numéros d'époque (nombre de secondes écoulées depuis 1970) sont ignorés lorsque l'on détermine l'étiquette CVS (ils sont utilisés d'habitude pour changer l'idée que se fait dpkg de l'ordre des paquets et ne sont généralement pas pertinents pour les étiquettes CVS).

    Mettez vous dans le répertoire dans lequel vous avez votre arborescence des sources debianisées de développement, c'est ce que nous allons mettre sous CVS (on n'est pas encore sous CVSROOT, habituellement).

    JE LE RÉPÈTE : Dans ce qui suit, <paquet> doit être le nom du paquet identique à celui qui se trouve dans le fichier debian/changelog.

       $ cd /où/se/trouve/votre/arborescence/des/sources
       $ tar zvfx <paquet>_<version>.orig.tar.gz
       $ cd <paquet>_<version>.orig
       $ cvs import -ko -m 'Import des sources' debian/<paquet> source-dist upstream_version_<version|tr . _>
    

    Vous pouvez remplacer l'étiquette de branche source-dist par ce que vous voulez. (Le responsable de cvs-buildpackage utilise généralement la marque « upstream » (ce qui est un exemple de redondance ;-) )).

    Si vous avez installé CVS en tant que root, et n'avez pas donné les droits d'écriture au groupe, vous devez créer $CVSROOT/debian/<paquet> en tant que root et modifier l'utilisateur et le groupe propriétaire dans le référentiel. L'import CVS affichera un avertissement disant qu'il ne peut pas créer le répertoire debian/<paquet>, mais ça ne pose pas de problèmes.

    L'étape suivante est de récupérer l'ensemble de l'arborescence et d'y incorporer vos modifications.

       $ cd /où/va/se/trouver/votre/arborescence/des/sources
       $ cvs checkout <paquet>
    

    Si vous avez déjà créé une version debianisée mais n'avez pas utilisé CVS avant cela, vous pouvez lancer les commandes suivantes pour incorporer vos modifications. Après cela, vous devriez mettre une étiquette à cette version pour pouvoir la récupérer plus tard si nécessaire.

       $ cd /où/se/trouve/votre/arborescence/des/sources/<paquet>-<version>
       $ diff -qrBbw . /où/va/se/trouver/votre/arborescence/des/sources/<paquet>/ | grep -v CVS
       $ FICHIERS_MODIFIES_LOCALEMENT="<résultats de la commande ci-dessus>"
       $ tar cf - $FICHIERS_MODIFIES_LOCALEMENT | tar -C /où/va/se/trouver/votre/arborescence/des/sources/<paquet> -xvpf -
       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
    

    Merci de vérifier que le fichier debian/rules est bien exécutable, car de cette façon il sera aussi exécutable une fois exporté, et il n'y aura pas de problèmes au lancement de dpkg-buildpackage sur les sources exportées. En général, vérifiez que tous les fichiers ont les bonnes permissions avant de les ajouter au référentiel CVS.

       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
       $ cvs add debian <tout autre fichier à ajouter>
    

    Merci aussi de noter que vous devez ajouter à la main tout autre fichier qui doit se trouver dans le référentiel, en particulier tous les fichiers du sous-répertoire debian. Et merci aussi de noter que la commande cvs add ne fonctionne pas de façon récursive, vous devez donc ajouter à la main tout sous-répertoire que vous avez. (cd debian; cvs add *)

    Une bonne chose à savoir est que la commande « cvs update » vous montrera l'état de tous les fichiers du répertoire.

       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
       $ cvs update
    

    Le résultat ressemble à ceci :

           cvs update: Updating .
           M Makefile
           cvs update: Updating debian
           A rules
           ? exemple1
    
    M signifie modifié (doit être committé), A signifie ajouté (doit être committé), ? signifie que CVS ne connaît pas ce fichier (doit peut-être être ajouté). Quand vous êtes satisfaits, que rien n'a été oublié, et que tous les fichiers ont les bonnes permissions, vous êtes paré à committer :
       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
       $ cvs commit -m 'Modifications relatives à Debian'
       $ cvs tag debian_version_<version|tr . _>-<debian-revision|tr . _> .
    

    La nouvelle arborescence des sources se trouvera dans un répertoire qui ne contient pas le numéro de version. Ce n'est pas un problème, comme nous le verrons plus tard.

    Si au contraire vous créez le répertoire à partir de zéro (peut-être plus simple, bien que moins automatisé) :

       $ mkdir debian
    

    Créez tous les fichiers Debian nécessaires et ajoutez-les dans l'outil de gestion des sources :

       $ cvs add debian
       $ cd debian
       $ cvs add *
    

    Après cela, le prochain commit inclura tous vos fichiers :

       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
       $ cvs commit -m <un message>
    
  4. Préparer une nouvelle version

    Avant de lancer les commandes Debian qui construiront un paquet, vous devez récupérer le module sans les autres sous-répertoires CVS. Ceci est fait par la commande « export ». Mais tout d'abord vous devez enregistrer dans le référentiel CVS toutes vos modifications et y apposer une marque contenant le numéro de version.

       $ cvs commit -m <message>
       $ cvs tag debian_version_<version|tr . _>-<debian-revision|tr . _>
    
  5. Faire une nouvelle version

    Vous pouvez soit utiliser la mécanique de cvs-buildpackage (ce qui est la solution recommandée), soit un export manuel. Tout d'abord testez cvs-buildpackage à blanc (soyez certain que les étiquettes correspondent) comme ceci (vous devez avoir configuré /etc/cvsdeb.conf) :

       $ cvs-buildpackage -d -n -rsudo
    

    Ensuite lancez-le pour de bon, en supposant que sudo est un programme avec lequel vous pouvez avoir un accès root, avec :

       $ cvs-buildpackage -rsudo
    

    Ou, pour faire tout à la main :

    Récupérez le paquet.

       $ cvs export -d <paquet>-<version> -r debian_version_<version|tr . _>-<debian-revision|tr . _> <paquet>
    

    Maintenant vous pouvez continuer avec un simple mécanisme d'export pour faire de nouvelles versions.


    Vous avez fini ! Bravo ! Voici ce que vous pouvez faire sur votre arborescence de sources :


  6. Supprimer ou renommer un fichier

    La façon normale de déplacer un fichier est de copier ANCIEN vers NOUVEAU, et ensuite de lancer les commandes CVS normales pour supprimer ANCIEN du référentiel, et d'y ajouter NOUVEAU. (À la fois ANCIEN et NOUVEAU peuvent contenir des chemins relatifs, par exemple « foo/bar.c »).

       $ mv ANCIEN NOUVEAU
       $ cvs remove ANCIEN
       $ cvs add NOUVEAU
       $ cvs commit -m "ANCIEN renommé en NOUVEAU" ANCIEN NOUVEAU
    

    Ceci est la façon la plus simple de déplacer un fichier, elle n'est pas sujette à erreurs, et elle préserve l'historique de ce qui a été fait. Notez que pour accéder à l'historique du fichier vous devez spécifier l'ancien ou le nouveau nom, suivant la portion de l'historique à laquelle vous voulez accéder. Par exemple, « cvs log ANCIEN » donne l'historique jusqu'au moment où le fichier a été renommé.

  7. Mettre à jour un module avec la commande « import »

    Quand une nouvelle version des sources est disponible, vous l'importez dans le référentiel avec la même commande « import » que vous utilisez pour installer le référentiel la première fois. La seule différence est que vous spécifiez une étiquette de version différente cette fois-ci, et un message différent.

       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<nouveau répertoire des sources>
       $ cvs import -m "Import d'une nouvelle version" debian/<paquet> source-dist upstream_version_<version|tr . _>
    

    Maintenant, nous devons incorporer dans la nouvelle version les modifications que nous avons faites. La meilleure façon de faire est de mettre de côté notre copie de travail (basée sur l'ancien code source original), et de récupérer une nouvelle copie du paquet incorporant les modifications faites dans les sources originales. Voici la façon de procéder :

       $ cd /où/va/se/trouver/votre/arborescence/des/sources
       $ mv <paquet> <paquet>.old
       $ cvs checkout -jsource-dist:yesterday -jsource-dist <paquet>
       $ cd /où/va/se/trouver/votre/arborescence/des/sources/<paquet>
    

    La commande ci-dessus va récupérer la dernière révision du <paquet>, en fusionnant les modifications faites sur la branche originale « source-dist » depuis hier dans la copie de travail. Si un conflict se produit pendant la fusion, il doit être résolu de la façon normale. Ensuite les fichiers modifiés peuvent être committés.

    L'utilisation d'une date, comme suggérée plus haut, suppose que vous n'importiez pas plus d'une version d'un produit par jour. Si c'est votre cas, vous pouvez toujours utiliser à la place quelque chose comme ceci :

       $ cvs checkout -jupstream_version_<oldversion|tr . _> -jupstream_version_<newversion|tr . _> <paquet>
    

    Dans le cas courant, les deux commandes ci-dessus sont équivalentes.

    Pour les fichiers qui n'ont pas été modifiés en local, la révision qui vient d'être créée devient la révision principale (« head »).

    Donc, vérifiez bien que tous les fichiers ont été correctement mis à jour. En particulier, n'oubliez pas de modifier le fichier debian/changelog !

    Quand vous êtes satisfait, vous pouvez supprimer la vieille version du répertoire de travail. Soyez bien certain que vous supprimez le bon répertoire !

       $ rm -rf ../<paquet>.old
    

    Maintenant vous êtes prêt à créer une nouvelle version.

  8. Supprimer l'arborescence source pour préserver de l'espace disque

    Pour supprimer l'arborescence des sources courante il vous est conseillé de ne pas utiliser rm -rf mais d'utiliser la commande CVS qui vérifie s'il y a des modifications en local qui n'ont pas été committées.

       $ cd /où/se/trouve/votre/arborescence/des/sources
       $ cvs release -d <paquet>
    
  9. Glossaire
       Étiquettes    noms symboliques pour les révisions (tags)
       Référentiel   archive des fichiers sources (repository)
    
  10. Annexe

    A : CONVENTIONS POUR LES MARQUES CVS

     |===========================================================================|
     | Version originale       | <version>                                       |
     | Révision Debian         | <revision>                                      |
     | Nom de fichier original | paquet_<version>.orig.tar.gz                    |
     | Nom de paquet Debian    | paquet_<version>-<revision>_<arch>.deb          |
     | Étiquette CVS originale | upstream_version_<version | tr . _>             |
     | Étiquette CVS courante  | debian_version_<revision | tr . _>              |
     |===========================================================================|
    

    Exemples :

     |===========================================================================|
     |                         | sources originales     | paquet Debian          |
     |===========================================================================|
     | Version originale       | 2.76                   | 3.38                   |
     | Révision Debian         | 1.2                    |                        |
     | Nom de fichier original | make_2.76.orig.tar.gz  |                        |
     | Nom de paquet Debian    | make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb     |
     | Étiquette CVS originale | upstream_version_2_76  | upstream_version_3_38  |
     | Étiquette CVS courante  | debian_version_2_76-1_2| debian_version_3_38    |
     |===========================================================================|
    

    Notez que les numéros d'époque sont ignorés pour déterminer le nom de l'étiquette CVS (ils sont généralement utilisés pour modifier l'idée que se fait dpkg de l'ordre des paquets, et ne sont généralement pas pertinents pour les marques CVS).