Subversion

Par Jacques Déry
 
Dans cette présentation je vous ferai part de l'historique des logiciels de contrôle de revision et de l'utilisation des logiciels de contrôle de revision dans le développement du logiciel libre.
 
Je comparerai les différents logiciels disponibles et l'installation de Subversion.
 
Je parlerai aussi de la gestion de code source, des astuces, des commandes essentielles en ligne de commande et des outils graphiques disponibles.
 
Finalement, je demontrerai la mise en place d'un garde source et de quelques commandes.

Historique

Il était une fois "rcs" le système de contrôle de révision

RCS

 
Dates importantes

 
Pour plus de détail

 

Introduction

Développement de logiciel

Outils requis pour le developpement de logiciel:

 

 
La cathédrale et le bazar
http://www.linux-france.org/article/these/cathedrale-bazar/cathedrale-ba...

Développement de logiciel

Il y a 2 mondes: Propriétaire et Libre

Propriétaire

 
Libre

Approche

Logiciel de contrôle de source: Est-ce nécessaire???
 

Avec un logiciel de contrôle de source:

 
Type de logiciel de contrôle de source

Vocabulaire

 
 

Logiciel de contrôle de version

Dans le monde libre on utilise les logiciels de contrôle de version suivant:
  cvs:
    -Garde-source centralisé
    -cvs a été développé pour remplacer rcs qui ne fonctionnait qu'avec des fichiers uniques.
    -cvs est capable de gérer des projets et le fait assez bien.
    -C'est toujours le standard des logiciels de contrôle de version même si d'autres sont supérieurs.
    -Le logiciel a été amélioré mais garde beaucoup de ses déficiences à cause de sa conception initiale

  subversion:
    -Garde-source centralisé
    -Concu pour être un remplacement à cvs.
    -Inclus des outils pour convertir un garde-source (repository) cvs à subversion.
    -Possibilité d'accès local, protocole svn (subversion) et http (web)
 
  git (www.kernel.org):
    -Garde-source décentralisé
    -A été développé par Linus Torvald pour faire le développement du noyau de Linux.
    -A remplacé "bitkeeper" qui est maintenant propriétaire.

  arch (www.gnu.org):
    -Garde-source décentralisé
    -Développé par GNU.
 

Comparaison de Subversion et de cvs

Subversion par rapport à cvs
  svn fait les retours (commit) par transactions, pas cvs.
    -Si la transaction est intérompue au milieu, svn laissera le repository en bon état. Pas cvs.
  svn gère mieux les changements de nom de fichiers et de répertoires (garde l'historique). Pas cvs.
  svn peut copier des fichiers et répertoires en gardant l'historique des changements. Pas cvs
  svn permet de gérer les permissions par répertoire. Pas cvs
  svn enregistre les deltas, cvs enregistre tout les ficiers
    -svn prend moins d'espace disque
  svn doit appliquer les deltas avant de récupérer les fichiers. cvs récupère les fichiers directement
    -cvs est plus rapide

Installation de Subversion

Installation du paquetage

  yum install subversion
  apt-get install subversion

Vérification
  svn --version

svnadmin (Pour administrer svn)

  Taper svnadmin --help

  Options importantes
   create
   dump
   help (?, h)
   hotcopy
   load
   setlog

  Options avancées
   deltify, list-dblogs, list-unused-dblogs, lstxns, recover, rmtxns, verify

Mise en place d'un garde-source

   1. Aller en root
   2. Créer l'utilisateur svn: useradd svn[Enter]. Ceci créé aussi l'ustilisateur sous le groupe svn
   3. Changer le mot de passe de l'usager svn: passwd svn[Enter]
   4. Ajouter d'autres utilisateurs au groupe svn:
          * usermod -G svn deryj[Enter]
          * usermod -G svn usager[Enter] ("usager" est le nom de l'usager que l'on veut ajouter)
          * more /etc/group
            root:x:0:root
            bin:x:1:root,bin,daemon
            daemon:x:2:root,bin,daemon
            sys:x:3:root,bin,adm
            ...
            mysql:x:27:
            deryj:x:500:
            svn:x:501:deryj

   5. Quitter la session pour que les nouveaux paramètres d'accès soient reconnus
   6. Ouvrir une session avec l'usager svn
   7. Changer la permission sur le répertoire /home/svn: chmod 770 /home/svn[Enter]
   8. Créer le garde-source: svnadmin create /home/svn/repos[Enter]
   9. Quitter root: exit[Enter]

*Accès svn local (file://)

  Aller dans notre répertoire
    cd[ENTER]
  Checkout
    svn co file:///home/svn/repos/ copie-de-travail
  Ceci va créer le repertoire source dans note répertoire local avec les fichiers du garde-source
 

Commandes essentielles (ligne de commande)

Taper svn --help

  Options de bases de svn (Mode ligne de commande)
   *add
   *checkout (co)
   *commit (ci)
   *copy (cp)
   *delete (del, remove, rm)
   *diff (di)
   *export
   *help (?, h)
   *import
   *log
   *merge
   *mkdir
   *move (mv, rename, ren)
   *resolved
   *status (stat, st)
   *update (up)

  Options avancées de svn (Mode ligne de commande)
    blame (praise, annotate, ann), cat, cleanup, info, list (ls), propdel (pdel, pd), propedit (pedit, pe), propget (pget, pg), proplist, plist, pl), propset (pset, ps), revert, switch (sw)

  Options importantes de svnlook
    svnlook info /home/svn/repos/      # Information qui peut être ustilisé dans une script
    svnlook tree /home/svn/repos/      # Donne la structure de l'arbre
    svnlook log /home/svn/repos/       # Montre la dernière entrée au régistre
    svnlook youngest /home/svn/repos/  # Donne la révisiondu garde-source

  Autres options de svnlook
   author, cat, changed, date, diff, dirs-changed, help (?, h), history, propget (pget, pg), proplist (plist, pl), uuid

*Introduction à la gestion d'un garde-source

*Démonstration: Démarrer et travailler sur un Projet

Situation de départ:

  On a un garde source sous /home/svn/repos

On créé les répertoires du projets
  svn mkdir file:///home/svn/repos/tronc
  svn mkdir file:///home/svn/repos/branches
  svn mkdir file:///home/svn/repos/etiquettes

On prend un code source, on l'extrait
  cd
  tar xvzf ffe-0.1.9.tar.gz

On importe un projet dans le tronc
  cd ffe-0.1.9
  svn import file:///home/svn/repos/tronc

On fait un retrait (check-out) d'une copie de travail
  cd
  svn checkout file:///home/svn/repos/tronc ffe-0.1.9

On fait des changement successifs au point ou le code est prêt pour être publié (release)
  Modifier le fichier README

(Si on travaille à plusieurs.) On reviens le lendemain matin: On va chercher la dernière version
  Login
  cd ffe-0.1.9
  svn update

On créé une branche de publication (release branch) pour finaliser le code
(Note: M= Majeur, m= mineur)
  cd
  svn copy file:///home/svn/repos/tronc file:///home/svn/repos/branches/BP-0.2.0

On fait un retrait (check-out) d'une copie de la branche de publication
  cd
  svn checkout file:///home/svn/repos/branches/BP-0.2.0 BP-0.2.0

On paufine et finalise le code

On publie le code
  cd
  svn copy file:///home/svn/repos/branches/BP-0.2.0 file:///home/svn/repos/etiquettes/ffe-0.2.0

On exporte le code
  cd
  svn export file:///home/svn/repos/etiquettes/ffe-0.2.0 ~/Desktop/ffe-0.2.0

On crée un paquetage et on le publie
  cd Desktop
  tar cvzf ffe-0.2.0.tar.gz ffe-0.2.0

Bonnes pratiques

La raison principale pour utiliser svn:
  Rendre la vie facile à un développeur
  Améliorer la communication entre développeurs

Cycle de travail

  Mise-à-jour
    svn checkout
    svn update
  Faire des changements
    svn add
    svn delete
    svn copy
    svn move
  Examiner les changements
    svn status
    svn diff
  Ajouter les changements des autres
    svn update
    svn merge
  Publier les changements
    svn commit

Bonnes Pratiques

  Politique appliquée au garde-source
    Tronc stable
      Tout le développement est fait sur les branches
      Les branches sont incorporées au tronc une fois qu'ils ont été démontrées stables.
    Tronc instable
      Tout le développement se fait sur le tronc

  Faire la sauvegarde (commit) au garde-source des changements
    Ça peut paraître une évidence mais si les changements que l'on a fait reste dans notre copie de travail,
      on ne partage pas son travail avec les autres (pas de collaboration)
      on risque d'avoir des conflits en sauvegardant

  Sauvegarder au garde-source régulièrement et souvent
    Le garde-source est plus sûr que la copie locale (backup)
    Moins de chance qu'un autre développeur fasse un changement qui entre en conflit avec votre code
    Moins de perte de temps à fusionner
    Plus c'est rapide, plus les autres développeurs verront vos changements

  Faire de petits changements
    Évite de créer un gros bogue qui monopolise tout le monde
    Plus facile de voir les différences (svn diff) si bogue il y a
    Une fusion de code (merge) est plus facile si le changement est petit
    Un petit changement est plus facile à comprendre

  Messages de log en disent assez
    Changements: Subversion s'occupe du "quoi", il faut le pourquoi
    Message incomplet --> On ne peut revenir en arrière pour savoir ce qui a été changé
    Si possible inclure la référence au tracker (bogue ou nouvelle fonctionnalité)

  Éviter de briser l'arbre
    Éviter les changements (Modifications) qui défont la structure de l'arbre (Amène une perte de confiance des développeurs)
    Éviter un changement qui empêcherait la compilation journalière ou rendrait le code inutilisable
    Soultion: Faire le développement critique sur une branche, fusionner (merge) plus tard.

  Créer une branche
    C'est facile avec svn (Difficile avec cvs)
    Ça permet de travailler sur quelque chose de spécial sans bloquer les autres
    Problème:
      Ça divise les resources
      Fusion peut-être difficile
    Autre utilité: Stabiliser le code avant de le publier (release-branch)
    Faire en sorte que l'on puisse fusionner facilement
      Faire de petits changements sur les branches
      Faire des changement sensés: Changer la présentation du code (indenting) va créer des conflits en fusionnant
      Faire des fusions plus petites (Faire les fusions rapidement pour éviter que ça soit trop compliqués)
      Stratégie:
        Fusionner du tronc à la branche, ensuite fusionner de la branche au tronc
    Question: Est-ce que le trouble que je me donne en vaut la chandelle?

Démonstration

Outils Graphiques (rapidsvn, kdesvn, turtoisesvn, viewvc)

  MANQUE LA DEMONSTRATION DE L'INSTALLATION DE rapidsvn, de viewvc

*Installation d'un serveur avec accès réseau "svn://"
 
  Pour l'installation d'un serveur avec accès svn, il faut utiliser svnserve. svnserve fait partie du paquetage subversion.

  Options de svnserve
   Valid options:
   -d [--daemon]            : daemon mode
   --listen-port arg        : listen port (for daemon mode)
   --listen-host arg        : listen hostname or IP address (for daemon mode)
   --foreground             : run in foreground (useful for debugging)
   -h [--help]              : display this help
   --version                : show version information
   -i [--inetd]             : inetd mode
   -r [--root] arg          : root of directory to serve
   -R [--read-only]         : deprecated; use repository config file
   -t [--tunnel]            : tunnel mode
   --tunnel-user arg        : tunnel username (default is current uid's name)
   -T [--threads]           : use threads instead of fork
   -X [--listen-once]       : listen once (useful for debugging)

  Contenu de /home/svn/repos/
    ll /home/svn/repos

  On configure la sécurité (Contenu de /home/svn/repos/conf/svnserve.conf)
    [general]
    anon-access = read
    auth-access = write
    password-db = passwd

  Le fichier passwd  (Contenu de /home/svn/repos/conf/passwd)
    [users]
    deryj=motdepasse

  On lance svnserve en démon
    svnserve -d -r /home/svn/repos

  Vérification
    ps-ef | grep svnserve
    netstat -tap
    netstat -tan
    exit
    svn co svn://localhost/branches test

  On peut inclure ceci dans uns script de départ ou utiliser /etc/init.d/rc.local
    La script de démarrage sera publié sur le site de clo

*Installation d'un serveur avec accès réseau "http://"
  NOTE: On assume que Apache 2 est déjà installé

  Installer le paquetage manquant
    yum install mod_dav_svn
    apt-get install libapache2-svn
 

   1. Aller en root: su -[Enter]
   2. Aller au répertoire /var/www/svn: cd /var/www/svn[Enter]
   3. Créer le garde-source repos: svnadmin create repos[Enter]
   4. Ajuster correctement les permissions: chown -R apache.apache repos[Enter]
   5. Modifier /etc/httpd/conf/httpd.conf et ajouter ceci:
      <Location /svn>
        DAV svn
        SVNParentPath /var/www/svn
        # On limite l'accès aux utilisateurs authentifiés.
        <LimitExcept GET PROPFIND OPTIONS REPORT>
          # Enlever le # suivant pour forcer l'accès SSL (https)
          # SSLRequireSSL

          AuthType Basic
          AuthName "Autorisation d'Accès"
          AuthUserFile /etc/httpd/svnpasswd
          Require valid-user
        </LimitExcept>
      </Location>
   6. Créer le fichier d'accès: htpasswd -c /etc/httpd/svnpasswd deryj[Enter]
   7. Ajouter l'utilisateur "pierre": htpasswd /etc/httpd/svnpasswd pierre[Enter]
   8. Redémarrer Apache: service httpd restart[Enter]
   9. Lancer un fureteur et essayer...

*Installation à partir de code source (configure, make, make install)

NOTE: J'ai utilisé un paquetage simple qui ne nécessitait pas de bibliothèque spéciale pour le compiler. Sinon ça peut se compliquer...

   1. Aller chercher le paquetage "ffe" sur sourceforge
   2. Décompresser l'archive: tar -xvzf ffe.0.1.9.tar.gz[Enter]
   3. Aller dans le projet ffe: cd ffe.0.1.9[Enter]
   4. Lire les fichiers README et/ou INSTALL
   5. Avec l'utilisateur deryj lancer: ./configure[Enter]
   6. Lancer make: make[Enter]
   7. Aller en root: su[Enter]
   8. Lancer make: make install[Enter]