Subversion : export des fichiers depuis une révision en bash Comme un svn diff mais avec les fichiers complets

, par Julien Falconnet

Lorsqu’on travaille avec Subversion (SVN) la mise en production demande de passer par la commande svn export. Mais qu’en est il des mises à jour ? La procédure recommandée est de passer par diff et patch. Mais que faire lorsqu’il est impossible de passer par patch parce que l’on est limité à l’utilisation d’un FTP, par exemple ?

Et bien, on est bien embêté. En tout cas, c’était mon cas. Après quelques recherches sur Internet, difficile de trouver une solution satisfaisante. Aucun utilitaire ne semblant faire référence, et les scripts maison ne correspondant pas à mes besoin, j’ai décidé de mettre au point un petit utilitaire bash que je vous livre ici en GPL.

Comment exporter tous les fichiers qui ont changé depuis ma dernière livraison ? Voici une question qui a du tarauder un certain nombre de développeur au moins une fois. C’est vrai, après tout, on investit du temps sur l’utilisation d’un système de suivi de version (ici svn), si c’est pour en perdre encore lorsqu’il faut livrer, où est l’intérêt ? Pourquoi livrer la bibliothèque monstrueuse qu’on a du ajouter en révision 132 alors qu’on est révision 683 et qu’on fait une livraison en r650. Et je passe sur la question du client qui se demande pourquoi on lui renvoie une archive de 60 Mo alors qu’il n’a demandé que quelques corrections d’orthographe et de typographie ( si ! si ! ça pèse super lourd une virgule !).

En effet, svn export exporte toute le projet à une révision donnée. Et svn diff qui affiche bien les différences entre deux révisions ne produit que des sorties au format patch (il n’indique que les lignes qui ont été modifiées).

Après un certain nombre de recherches, j’ai été bien désespéré de voir que non seulement je n’étais pas le seul à buter sur ce problème, mais qu’en plus aucune solution ne semblait faire consensus. J’ai trouvé quelques solutions maisons et même des scripts entiers, mais aucuns ne correspondait à ce que je voulais faire, c’est-à-dire un simple export différentiel qui ressemblerait à un svn export (donc en bash).

J’ai donc décidé de me lancer et de créer cette perle rare. Comme j’en étais content et que je me suis dit que ça pourrait resservir, je vous la sert donc ci-dessous (en gpl). Vous noterez que je suis tellement persuadé de la dimension universelle de ce problème que j’ai décidé de le coder (et de le commenter en anglais).

Voici le code bash desvnxport.sh.

Pour ceux que ça intéressent, deux points ont été compliqués. D’abord, le fait qu’en bash le for découpe sur les espaces (et non pas sur les retours à la ligne) : Un coup sur deux j’avais le statut, ce qui était pénible puisque je ne voulais traiter que les A et les M et pas les D. J’ai faillit passé par un marqueur et finalement j’ai trouvé plus élégant de passer par un grep (qui s’intercale avant le découpage du for).

L’autre soucis a été la création de l’arborescence. En effet j’ai été déçu de voir que ni touch, ni mkdir, ni svn export n’étaient capables de créer des sous répertoires en même temps que le répertoire père. Du coup j’ai été obligé de rajouter cette boucle toute laide de mkdir. [edit ; grâce au post de Rodney Amato j’ai put trouver le paramètre -p de mkdir qui remplace avantageusement la boucle en question]

Par contre, du coup, les espaces dans les noms de fichiers sont découpés par le for et les fichiers correspondants ne sont pas exportés par le script. Il faudrait remplacer les espaces dans les fichier à la volée avant le for et les re-remplacer après mais c’était tellement inélégant que je m’y suis refusé. D’autant que cela ne me sert pas puisque je ne mets jamais d’espace dans mes noms de fichiers (c’est trop laid). Par contre si quelqu’un à une solution élégante pour contourner ce problème je suis preneur.

A bientôt...