Tout se passe en 3 étapes:

Créer le .diff

Pour créer le fichier de patch, ou .diff, il vous suffit d'un peu d'organisation et de méthodologie. Il vous faut, pour l'essentiel, connaitre la révision de départ (donc celle qui est actuellement installée sur votre serveur final) et la révision de fin (celle à laquelle vous voulez arriver). C'est là qu'intervient votre organisation du SVN.

Il y a 3 cas qui se présentent habituellement, les exemples qui suivent tentent de les illustrer. A vous bien entendu de les adapter ensuite. Dans tous les cas, nous prenons comme postulats que:

  • votre projet sur svn est accessible à http://votre.serveur.svn/projet/
  • votre répertoire personnel est /home/vous/

Différence entre un tag et une branche

C'est le cas le plus habituel, le tag représente la dernière version livrée officiellement et la branche[1] est votre branche de développement. C'est pour moi un patch de test, à faire en cours de développement.

svn diff --old http://votre.serveur.svn/projet/tags/ancienne_version --new http://votre.serveur.svn/projet/branche > /home/vous/monpatch.diff

Différence entre deux tags

Ceci est, du moins selon mon organisation personnelle, la création d'un patch entre deux versions finales, donc le patch qui sera diffusé à vos utilisateurs, ou qui sera utilisé pour une mise à jour véritable. Il fonctionne exactement comme le précédent, car en fait tag ou branche ne sont que des séparations symboliques:

svn diff --old http://votre.serveur.svn/projet/tags/ancienne_version --new http://votre.serveur.svn/projet/tags/nouvelle_version > /home/vous/monpatch.diff

Différence entre deux versions de la même branche

Ceci est assez peu propre, mais reste bien utilisé, souvent dans le cas d'un svn mono-projet et mono-utilisateur. Il y a différentes possibilités syntaxiques, je n'indique que celle que je préfère:

svn diff http://votre.serveur.svn/projet/branche@rev1 http://votre.serveur.svn/projet/branche@rev2 > /home/vous/monpatch.diff

rev1 et rev2 sont les numéros de révision de départ et de fin. Pour ne pas chercher le dernier numéro de révision (le numéro actuel), vous pouvez utiliser HEAD pour rev2.

Diffuser le .diff

Vous avez désormais dans votre répertoire un fichier monpatch.diff au format texte, qui ressemble à:

Index: language/core.french.lang
===================================================================
--- language/core.french.lang     (révision 1)
+++ language/core.french.lang     (révision 3)
@@ -6,109 +6,109 @@
 
 # General stuff
 0x001,Utilisation
-0x002,A echoue.\n
+0x002,A échoué.\n
 
 # MODES_
-0x130,Cree
-0x131,utilise dernierement
+0x130,Créé
+0x131,utilisé dernièrement
 0x132,inactif
-0x133,place par
+0x133,placé par
 0x135,non actif sur
 0x137,non actif

Ce fichier contient donc l'ensemble des modifications faites dans le répertoire du svn. Il vous suffit de copier ce fichier sur votre serveur de destination, ou de le diffuser à vos utilisateurs.

Application du patch

L'application en elle-même est très simple, il suffit de se placer dans le répertoire principal de l'application et de taper la commande suivante:

patch -p0 </chemin/vers/monpatch.diff

Le point intéressant est l'option -p0 qui permet en fait de signaler à patch le nombre de sous-répertoires à omettre. Dans notre cas, nous ne voulons rien omettre, le répertoire language/ existe dans notre projet.

Si nous avions été dans le répertoire language/ du projet (imaginons que nous n'avions fait qu'un diff des fichiers de langue et ne voulions mettre à jour que celà, nous aurions supprimé le premier répertoire:

patch -p1 </chemin/vers/monpatch.diff

Notes

[1] Branche ou trunk, encore une fois cela dépend de votre organisation