Patchs : Création et applications de patchs

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

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 :

Configuration File 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 :

Configuration File 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 :

Command 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 :

Command 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 :

Command 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 :

Command 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 :

Command 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 :

Command 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 :

Command patch
patch -p1 < monfichier.patch