Patchs : Création et applications de patchs
1 Introduction
Lorsqu'on se lance dans la traduction ou la modification d'un logiciel libre, il faut trouver une manière simple et efficace de redistribuer son travail. Pour cela, il faut pouvoir le diffuser le plus légèrement possible. La solution consiste donc à ne distribuer que la différence entre la version originale et la vôtre. En un mot, il faut créer un patch.
2 Patcher
Ce terme désigne l'action d'appliquer un patch sur un ou plusieurs fichiers. En patchant un fichier, vous apportez de manière automatique les modifications nécessaires pour le mettre à jour. Le patch contient la liste des différences qui existent entre l'ancienne et la nouvelle version du ou des fichiers. Résultat : ce fichier de différences est beaucoup plus léger et s'applique en une seule manipulation.
La commande utilisée pour appliquer un patch sous Linux s'appelle tout naturellement patch. Cet utilitaire, créé par Larry Wall (créateur de Perl), ne se limite pas à "regarder" et changer les fichiers. En effet, patch peut réagir en fonction du contexte et permettre d'appliquer un patch sur des fichiers déjà modifiés.
3 Création d'un Patch
Pour créer un fichier de différences, il faut utiliser la commande diff qui analyse et détermine les "différences contextuelles" entre deux fichiers. Celle-ci peut être utilisée de manière récursive pour analyser les fichiers entre deux répertoires distincts. Voici un exemple concret pour bien comprendre le fonctionnement de la commande diff :
Soit un fichier source en C hello.c.old contenant le texte suivant :
hello.c.old |
//Demonstration file for diff //Creator :Diamonds Edition 1998 #include<stdio.h> void main(void) { printf("Hello World !"); } |
Nous le modifions pour en faire une version française sous le nom hello.c. Ce qui nous donne :
hello.c |
//Fichier de démonstration pour diff //Créateur :Copyright 2000 Diamond Editions/Linux magazine France 1998 #include<stdio.h> void main(void) { printf("Bonjour le Monde !"); } |
Ensuite, pour créer un fichier de différences, nous utilisons la commande :
diff |
diff -c hello.c.old hello.c > hello.diff |
Le -c indiquant une comparaison contextuelle, il en résulte un fichier hello.diff qui peut alors être distribué à toutes personnes possédant la version anglaise de hello.c.
Bien souvent, les sources d'un logiciel ne se limitent pas à un seul fichier. Le programme est réparti sur plusieurs fichiers sources qui seront compilés, puis liés (linker) pour former le programme exécutable. La traduction (donc la modification), porte sur plusieurs fichiers et parfois plusieurs sous-répertoires.
La méthode pour créer le patch consiste à modifier les sources dans son répertoire original, puis à installer les sources d'origine dans un répertoire différent. Soit le répertoire /h.old contenant la version anglaise de hello.c et le répertoire /h qui contiendra la version française. Placez-vous à la racine du disque puis tapez :
diff |
diff -cr h.old h >hello.diff |
Le fichier hello.diff résultant contiendra les différences contextuelles entre les fichiers du répertoire /h.old (l'original en anglais) et /h (la version française). Le paramètre r passé en complément de -c indique un fonctionnement récursif.
Pour avoir un diff propre et le plus lisible possible :
diff |
diff -b -Nur h.old h >hello.diff |
Si vous souhaitez voir un diff en couleur, utilisez colordiff à la place.
3.1 Statistiques
Pour obtenir des statistiques sur un diff, vous pouvez utiliser la commande diffstat :
diff |
$ diff test1 test2 | diffstat unknown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) |
4 Application d'un Patch
Pour appliquer le patch du premier exemple, nous utiliserons :
patch |
patch < hello.diff |
dans le répertoire où figure le fichier hello.c anglais. Le patch s'appliquera et le fichier hello.c sera modifié pour devenir notre version française.
Dans le cas d'un patch s'appliquant sur plusieurs fichiers d'un répertoire, il faut copier le fichier .diff à la racine du disque , puis taper :
patch |
patch -p0 <hello.diff |
Le paramètre -p0 permet à patch de travailler de manière récursive. Le fichier présent dans le répertoire /h se verra modifié pour devenir notre version française.
Si il vous demande de spécifier les fichiers, c'est qu'il doit essayer de comparer des dossiers qui n'existent pas. Pour ma part, lorsque je souhaites upgrader MediaWiki et que je prends le patch, il est indiqué en dur dans les paths du patch :
- mediawiki-1.15.1/blabla
- mediawiki-1.15.2/blabla
Si je veux faire abstraction du dossier mediawiki-1.15... il suffit d'incrémenter l'argument -p. Ca donnera :
patch |
patch -p1 < monfichier.patch |