Pourquoi un serveur pour Bazaar ?

Contrairement à subversion, Bazaar est un gestionnaire de version décentralisé, ce qui signifie qu'il n'existe pas a priori de dépôt de référence auquel se réfèrent tous les développeurs. Au contraire, chaque développeur possède son propre dépôt (sa propre branche) et l'échange de code entre développeurs se fait par des merge des branches des deux développeurs.

J'ai toutefois fait le choix de proposer aux étudiants de pouvoir héberger leur branche sur un serveur. Ces derniers sont en effet baladés entre les différentes salles de travaux pratiques et entre leurs machines personnelles. Il aurait été possible de leur faire placer leur dépôt sur une clef usb, mais le choix du serveur me semble plus pertinent pour plusieurs raisons :

  • Je garde une trace de toutes leurs activités, ce qui m'aide dans la notation du projet ;
  • Ils ne peuvent pas égarer le serveur, contrairement à la clé usb ;
  • Pédagogiquement ceci leur permet de se confronter aux notions de branches parentes et ainsi distinguer le push du commit.

Pourquoi Web DAV ?

Il existe plusieurs possibilités pour faire tourner un serveur bazaar, la plus simple étant très certainement d'encapsuler les commandes du protocole bazaar dans une connexion ssh. Toutefois cette solution n'était pas souhaitable pour deux raisons :

  • Les connexions ssh ne passent pas depuis les salles de TP ;
  • Je ne voulais pas offrir un accès ssh à mon serveur aux étudiants ;

Je me suis donc tourné vers l'encapsulation dans HTTP qui reste tout de même le protocole passe partout.

Mise en place

Activation de l'accès DAV

Tout d'abord, il faut activer l'accès DAV au répertoire qui contiendra les différentes branches bazaar. Ceci se fait dans Apache 2 en plusieurs temps.

Tout d'abord, il faut activer le module dav_fs qui est normalement installé par défaut (si ce n'est pas le cas, installez-le) :

$ sudo a2enmod dav_fs
 Considering dependency dav for dav_fs:
 Module dav already enabled
 Enabling module dav_fs.
$ sudo /etc/init.d/apache2 restart
...

Il faut ensuite déclarer le répertoire à exporter par DAV, en éditant le fichier de configuration de votre virtual host :

  #########
  #         Depots Bazaar
  Alias /bzr /home/www-data/bzr_repositories
  <Location /bzr>
    Dav On
    # Bzr specific
    DirectorySlash Off
    DavDepthInfinity on
    # Auth
    AuthName DAV
    AuthBasicProvider file
    AuthzGroupFileAuthoritative On
    AuthUserFile /vers/le/fichier/htpasswds
    AuthGroupFile /vers/le/fichier/htgroups
    # Only for authenticated users
    Require valid-user
   </Location>

et recharger la configuration d'Apache :

$ sudo /etc/init.d/apache2 reload

Attention pour que cette configuration fonctionne, il faut que l'URI /bzr soit accessible. Par exemple, si vous utilisez Trac et que ce dernier surveille l'URI racine /, vous ne pourrez jamais accéder à /bzr.

Dépôt partagé

Étant donné que les étudiants vont partager entre leurs branches une grosse partie du code, il semble pertinent de tirer parti d'un dépôt partagé. Ce dernier se crée directement sur le serveur :

$ cd racine/du/depot/
$ bzr init-repo --trees .

Personnellement bzr me retourne une erreur No handlers could be found for logger "bzr", mais elle semble sans incidence. Une fois le dépôt partagé créé, il faut créer les "véritables" dépôts :

$ cd racine/du/depot/
$ bzr init dev

Utilisation

Par défaut, bzr ne gère pas l'accès par WebDAV, il est nécessaire d'installer le plugin bzr.webdav :

$ sudo aptitude install bzr-webdav

ou si le paquet n'existe pas pour votre distribution :

$ bzr co lp:bzr.webdav
$ cd bzr.webdav
$ python setup.py build
...
$ cp -R cp -R build/lib/bzrlib/plugins/webdav/ ~/.bazaar/plugins/

Pour s'assurer que le plugin est bien détecté :

$ bzr plugins
...
webdav 1.12.1
    An http transport, using webdav to allow pushing.
...

À noter que ce dernier ne fonctionne que pour bzr >= 1.12.

Une fois le plugin installé, il devrait être possible d'utiliser le dépôt de manière assez transparente :

$ bzr checkout https+webdav://<username>:<password>@dev.fabienpoulard.info/bzr/miage2010/dev/
...
$ cd  dev/
$ touch README
$ bzr status
unknown:
  README
$ bzr add
adding README
$ bzr commit -m "Test"
HTTPS poulard-f@dev.fabienpoulard.info, Realm: 'Authentification BZR pour les miagistes 2010' password: ...
Committing to: https+webdav://poulard-f@dev.fabienpoulard.info/bzr/miage2010/dev/
added README
Committed revision 1.