Travaux Dirigés de aci
8. Un client Subversion utilisant WebDAV

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.


subversif.c
subversif.h


1 L’entrée qui dessert

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.


Obtenir un formulaire de soumission de comptes rendus

2 La desserte des entrées

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.


Obtenir un formulaire de soumission de comptes rendus

3 Le buffet

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é.


Obtenir un formulaire de soumission de comptes rendus

4 La fraîcheur de l’entrée

La commande la plus utilisée par un client subversion est update, qui récupère les dernières versions des fichiers du dépot et les recopie dans le 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, cette requête se simule par une requête GET. Définir la fonction SvnUpdate effectuant une telle requête, en trouvant les informations nécessaires dans la structure own précédemment garnie. L’entête Last-Modified sera utilisée pour modifier l’attribut committed-date associé à ce fichier dans la structure own qui sera immédiatement recopiée dans le fichier .svn/entries (on ne s’occupera pas des autres attributs). Le corps de la réponse http sera copié dans le fichier demandé sans vérification (en réalité le client doit signaler et tenter de résoudre des modifications effectués en parallèle).


Obtenir un formulaire de soumission de comptes rendus

5 La matière de l’entrée

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 subversion à qui l’on donne comme argument propget suivi du nom du fichier ou répertoire concerné. Un serveur subversion accessible par http peut utiliser son extension WebDAV pour répondre à cette requête. Cette extension dispose en effet de la requête PROPFIND, qui retourne les informations attachées à une entrée sur le serveur, sous la forme d’un Content-Type : text/xml (on peut voir cette requête comme une généralisation de la requête HEAD qui ne sait retourner que la date de dernière modification, sous la forme peu extensible de l’en-tête http Last-modified).

La grammaire XML utilisée par WebDAV se réduit à peu près ici à quatre balises sans attributs :

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 SvnPropget récupérant sur la ligne de commande le nom de l’entrée concernée et envoyant une requête PROPFIND au serveur subversion. Elle extrait du flux de la réponse les 3 informations ci-dessus et les place dans son tampon de sortie. Dans le cas où ces informations diffèrent de celles du répertoire local (donc s’il y a eu une modification sur le dépot) elle fait précéder ces informations par M et sinon par une espace. On se donnera évidemment un nouveau phraseur XML en utilisant la fonction phraser_xml.


Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 23 janvier 2021 à 01h06min