Le gestionnaire de versions nommé Subversion utilise, au choix, un protocole spécifique ou l’extension WebDAV (Distribution, Auteur, Version) de HTTP. Le but de cette séance est d’écrire un petit client Subversion exécutant quelques commandes de base et analysant les réponses WebDAV, qui sont au format XML.
La fonction main du canevas s’attend à trouver un argument sur la ligne de commande. Un hachage rapide sur la première lettre permet d’interpréter aussitôt l’action demandée, qui en général consiste à envoyer une requête au serveur et lire sa réponse dans un buffet dont l’adresse est retournée en valeur à main ; celle-ci retransmet la réponse sur le flux de sortie et termine aussitôt le processus.
Un répertoire utilisé par subversion possède un fichier nommé .svn/entries au format XML. Sa grammaire se réduit à deux balises qui n’encadrent aucun texte, toutes les informations étant stockées dans les attributs. La première balise, wc-entries, n’a qu’un attribut et une seule occurrence, en début de fichier. La deuxième, entry, est répétable à volonté. Sa liste d’attributs intéressants ici se retrouve dans la structure entries fourni dans le canevas. Il existe une et une seule entrée dont l’attribut kind indique un répertoire ( dir) et dont l’attribut name est vide ; une telle entrée indique, par son attribut url, le dépot commun aux développeurs, sous la forme svn : // serveur / répertoire.
Voici un exemple d’un tel fichier :
<?xml version="1.0" encoding="utf-8"?>
<wc-entries
xmlns="svn:">
<entry
committed-rev="275"
name=""
committed-date="2005-05-31 10:54:54"
url="zone.spip.org"
last-author="Emmanuel.Saint-James@lip6.fr"
kind="dir"
revision="275"/>
<entry
committed-rev="260"
name="examen.tex"
committed-date="2005-06-13 10:24:54"
last-author="lieu@ccr.jussieu.fr"
kind="file"
prop-time="2005-06-13T18:36:24.000000Z"/>
<entry
name="test"
kind="dir"/>
<entry
name="Makefile"
kind="file"
schedule="add"
revision="0"/>
<entry
name="solutions"
kind="dir"
schedule="delete"/>
</wc-entries>
Ecrire les fonctions startElement et endElement appelée par le canevas, afin de garnir la variable own déclarée dans main. Cette variable aura ses champs garnis par l’entrée de nom vide évoquée ci-dessus, et pointera par son champ contenu sur la liste chainée des autres entrées trouvées dans ce fichier.
Les échanges entre le client et le serveur conduisent le plus souvent à mettre à jour le fichier .svn/entries. Ecrire une fonction update_entries prenant en argument une structure de type svn, et écrivant son contenu en format xml dans le fichier .svn/entries.
La commande la plus simple pour un client subversion est commit, qui envoie sur le dépot les fichiers du répertoire d’où est appelé le client. Elle admet en argument un nom de fichier, restreignant l’envoi à ce seul fichier. Seule cette variante sera considérée ici. Dans le cadre d’un serveur subversion disponible à travers http, et si l’on suppose que ce fichier est nouveau, cette requête se simule par la requête http nommée PUT d’argument l’URL où déposer le contenu, avec ce contenu comme flux d’entrée. Le serveur renvoie le code 200 ou 400 selon que la requête s’est bien passée ou non (son rôle ici est d’arbitrer les éventuels conflits, mais cela ne concerne pas le client).
Ecrire la fonction SvnCommit réalisant cette fonctionnalité.
La commande la plus utilisée par un client
Dans le cadre d’un serveur
Un service de versions à auteurs distribués attache à chaque fichier ou répertoire une liste de propriétés décrivant principalement leur date de dernière modification et l’auteur de celle-ci.
Ces informations sont fournies par un client
La grammaire
Par exemple, une réponse pourrait-être :
HTTP/1.1 200 ok
Content-Type: text/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<propstat>
<author>esj</author>
<name>TD9</name>
<committed-date>2006-06-06 06:06:06</committed-date>
</propstat>
Ecrire la fonction