[Linux-bruxelles] question sur diff

Gildas Cotomale gildas.cotomale at gmail.com
Ven 28 Déc 13:03:23 CET 2007


2007.12.28, Aldo :
> On Thu, Dec 27, 2007 at 11:32:22PM +0100, Benjamin Poulain wrote:
> > Pour appliquer le résultat de diff tu as la commande patch:
> > http://www.linuxcertif.com/man/1/patch/ &&
> > http://www.linuxcertif.com/doc/keyword/patch/
>
> J'ai jeté un coup d'oeil rapide mais suis pas sûr que ça soit ça, enfin
> ça ressemble ... (je pensais qu'à partir de diff himself on arriverait à le
> faire);

si, c'est tout à fait ça (en tout cas c'est ce que je fais depuis des années)

d'abord n'oublions pas que les vrais utilitaires *nix ne font qu'une
chose et le font bien.
donc "diff" <http://www.linuxcertif.com/man/1/diff/> ne sait afficher
que les différences entre deux fichiers (ou deux répertoires) : diff
ancienFichier nouveauFichier (on compare ancienFicher -source donc-
par rapport à nouveauFichier -cible de comparaison-) plusieurs options
permettent de configurer
* la finesse de la comparaison (faut-il tenir compte de la casse ou
pas ? des blancs ou pas ? etc.)
* l'affichage du résultat (script pour ed ? deux colonnes justaposées
-comme dans les outils graphiques- ? script exploitable par patch
-comportement par défaut, mais affiner avec l'option -u est
souhaitable- ? format à la RCS ? format if-then-else pour
preprocesseur ? alignement pour sortie directe sur imprimante texte
-via pr ? etc)
* la verbosité du résultat (n'indiquer que les fonctions qui ont
changées ou les lignes différentes ? rappeler le contexte ? -cas avec
l'option -u mais on peut augmenter ou diminuer le nombre de ligne de
contexte avec -U nombre- n'afficher que les ajouts -dans la cible donc
? n'afficher que les retraits -dans la source donc ?)
mais en aucun cas diff lui-même ne patch (vocabulaire d'informaticien
pour dire "appliquer la différence" puisque c'est ainsi que l'on
"patche" un code source)

patch est le corrolaire de diff puisqu'il reconnait pratiquement
toutes ses sorties : -c (--context), -e (--ed), -n (--normal) ou -u
(--unified). Il s'agit de l'ancien format, du nouveau format, et du
format unifié (version GNU héhé) ; pour ed, patch se charge de
l'appeler..
il peut aussi travailler sur un répertoire, et créer une sauvegarde
(option -b) avant de modifier les fichiers.

ces deux outils s'intègrent de façon transparente à RCS et ses
succésseurs (CVS, SVN, et ?) ainsi que dans ViM et Emacs...

Dans le premier message, tu demandais :
> mais comment appliquer la différence de mm (en supposant que
> son contenu est plus récent) sur nn dont le contenu est dépassé ?
> Je veux pour être concret remplacere les urls obsolètes de nn par ceux
> contenus dans mm qui sont récentes et mises à jour.

ça se fait donc en deux temps (pipes et redirections pour le faire en
une fois pour les plus chevronnés) :
console> diff -u nn mm >difference.patch
on sauvegarde la sortie dans un fichier car diff l'envoie sur la
sortie standard (écran en général) par défaut...
console> patch -ub nn difference.patch
on applique cette sortie sauvegardée sur l'ancien fichier...
en cas de problèmes, un fichier "nn.rej" ou nn# est créé en plus ; il
faut l'envoyer à la personne qui a généré le diff (et lui demander
quelles options il a utilisé...) après (bien entendu) avoir vérifié
qu'on a utilisé la commande sur les bons fichiers...

> je vais revoir ça demain à tête reposée, et j'espère comprendre d'ici la
> fin de w-e (ça manque tj d'exemples comme d'hab / au risque de se répéter,
> on fera avec!)
>
ces deux commandes (ainsi que "diff3"
<http://www.linuxcertif.com/man/1/diff3/> -pour 3 fichiers au lieu de
deux - et "sdiff" <http://www.linuxcertif.com/man/1/sdiff/> -un
pendant du couple diff/patch-) font parti du paquetage GNU
"diffutils"... s'ils sont bien installé et que tu as "info"
d'installé, tu peux lire leur manuel complet (avec exemples) en
faisant
console> info diff
sinon, c'est disponible en ligne sur le site du gnou (mais je ne sais
pas si c'est traduit)
<http://www.gnu.org/software/diffutils/manual/html_node/>


-- 
http://iihm.imag.fr/blanch/howtos/DiffPatch.html




Plus d'informations sur la liste de diffusion Linux-bruxelles