Créer un patch et l'utiliser
Par CrazyCat le 10/10/2011, 15:25 - Shell - Lien permanent
Lorsqu'on développe une (ou des) application(s), il y a fréquemment des mises à jour à faire.
Très souvent, et moi le premier, la méthode la plus simple consiste à purement et simplement écraser ce que l'on a mis en place par les nouveaux fichiers, ce qui peut parfois être lourd (en quantité transférée) alors que les modifications sont mineures, et comporte des risques dûs au transfert FTP.
Heureusement, si votre application est gérée par SVN (je le conseille fortement) et si vous avez accès à l'hébergement de votre application par SSH (ce qui est malheureusement rarement le cas dans le cadre des applications web), diff et patch vont vous simplifier grandement le travail.
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