Diff & Patch

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.

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.

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

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

//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 -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 -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.

APPLICATION D'UN PATCH

Pour appliquer le patch du premier exemple, nous utiliserons :

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 -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.
 

 


Copyright 2000 Diamond Editions/Linux magazine France - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".