juin 04 2008

Gestion des mime-types dans Subversion

Par défaut sous Subversion, l’heuristique utilisée pour détecter les mime-types est très basique ce qui est gênant lorsque l’on veut utiliser des fichiers (ex : des images) du dépôt via mod_dav_svn pour les intégrer dans un site.

Logiciels utilisés :

  • Subversion 1.4.6 (r28521)
  • GNU Bash 3.1.17
  • GNU Find 4.4.0
  • File 4.24

Voici une petite commande permettant de définir les mime-types des fichiers de l’arborescence dans laquelle nous nous trouvons (vous pouvez retirez la partie « | bash > /dev/null » pour afficher ce qui sera exécuté) :

user@gnusquad:~/projet$ find . -type f ! -regex “.*/\.svn/.*” -exec echo svn propset svn:mime-type \”\$\(file -bi ‘{}’\)\” {} \; | bash > /dev/null

Il se peut que des messages d’erreurs apparaissent dûs à un non conformisme de Subversion vis à vis de la RFC 1521.

svn: Le type MIME ‘text/x-c++ charset=utf-8′ ne se termine pas par des caractères alphanumériques

Ce bug a été corrigé dans la révision 30795 de Subversion (tapez svn –version | head -1 pour voir votre révision).

Sources :


mai 01 2008

Modifier le contenu d’une révision dans un référentiel Subversion

Il peut parfois être utile de devoir modifier le contenu d’une révision dans un référentiel Subversion pour supprimer une information qui n’aurait jamais dû s’y trouver comme, par exemple, un mot de passe.

Logiciels utilisés :

  • Subversion 1.4.2
  • GNU Bash 3.1.17
  • GNU Sed 4.1.5

Commençons par créer un référentiel de test nommé « modification_revision » :

root@gnusquad:~# REPOS=/var/local/lib/svn/modification_revision
root@gnusquad:~# svnadmin create $REPOS

Effectuons une copie locale (checkout) de ce référentiel :

root@gnusquad:~# svn co file://$REPOS
Révision 0 extraite.

Ajoutons-y un fichier « exemple » et commitons le dans le référentiel :

root@gnusquad:~# cd modification_revision/
root@gnusquad:~/modification_revision# echo mon_password : gruikgruik > exemple
root@gnusquad:~/modification_revision# svn add exemple
A         exemple
root@gnusquad:~/modification_revision# svn ci -m “ajout d’un fichier”
Ajout          exemple
Transmission des données .
Révision 1 propagée.

Le but, maintenant, est de faire disparaître le mot de passe « gruikgruik » du référentiel afin que personne ne puisse le récupérer.

Commençons par effectuer un dump du référentiel dans le fichier ~/dump_svn :

root@gnusquad:~/modification_revision# cd
root@gnusquad:~# svnadmin dump $REPOS > dump_svn
* Révision 0 déchargée.
* Révision 1 déchargée.

Modifions le mot de passe dans le dump avec sed par exemple en veillant à mettre le même nombre de caractères sinon vous obtiendrez l’erreur suivante par la suite : « svnadmin: Fin prématurée des données dans le flux de sauvegarde » à cause du Content-length de la révision :

root@gnusquad:~# sed -i s/gruikgruik/xxxxxxxxxx/g dump_svn

Supprimons le référentiel et recréons en un vide :

root@gnusquad:~# rm -r $REPOS
root@gnusquad:~# svnadmin create $REPOS

Importons le dump :

root@gnusquad:~# svnadmin load $REPOS < dump_svn
<<< Début d'une nouvelle transaction basée sur la révision 1
     * ajout de : exemple ...
svnadmin: Sommes de contrôle différentes, fichier '/exemple' :
   attendu :  6fe4a181ffeec4b6da1b63d377f14fb4
   obtenu :  def10992a3cb890493d37440f3538fd8

Subversion nous informe que les sommes de contrôle sont différentes ce qui est tout à fait normal vu que l’on a modifié le mot de passe, mettons donc à jour celles-ci :

root@gnusquad:~# sed -i s/6fe4a181ffeec4b6da1b63d377f14fb4/def10992a3cb890493d37440f3538fd8/ dump_svn

Puis pour en finir, réimportons proprement le dump :

root@gnusquad:~# rm -rf $REPOS
root@gnusquad:~# svnadmin create $REPOS
root@gnusquad:~# svnadmin load $REPOS < dump_svn
<<< Début d’une nouvelle transaction basée sur la révision 1
     * ajout de : exemple … fait.

——- Révision 1 propagée (commit) >>>

Et voilà, notre référentiel ne contient plus de traces du mot de passe « gruikgruik ».