GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Comment créer un patch en ignorant les différences d'indentation dans le code ?

J'essaie de créer un correctif pour un fichier à l'aide de l'outil diff.Mais je suis confronté à un problème.La façon dont je procède est ci-dessous.

J'ai créé un répertoire nommé a et j'y ai placé le fichier d'origine.

a/original_file.c

Maintenant, j'ai créé un autre répertoire nommé b et j'y ai mis le même fichier avec le contenu modifié.

b/original_file.c

Maintenant contenu de b/original_file.c fichier que j'ai copié depuis Internet et que j'ai mis dans un éditeur de texte.

Après avoir donné la commande :diff -Naur a b > patch_file.patch , le fichier patch_file.patch est généré et il a des changements indésirables (c'est lié à l'indentation).

Par exemple :

return mg_nw (MG_READY_NOY, &rmsg, seqnr,
-                 sizeof (struct mg_rdy_notify));
+                  sizeof (struct mg_rdy_notify)); 

Vous pouvez maintenant voir qu'il y a des changements liés à l'indentation où sizeof (struct mg_rdy_notify)) est remplacé par le même sizeof (struct mg_rdy_notify)) mais une base d'indentation qui est ce que nous ne voulons pas.

Réponse acceptée :

diff a plus d'une option liée aux espaces blancs. Cependant, on est moins utile pour les patchs. La page de manuel donne un indice obscur, se référant à la fois à GNU :

   -B, --ignore-blank-lines
          ignore changes where lines are all blank
   -b, --ignore-space-change
          ignore changes in the amount of white space
   -w, --ignore-all-space
          ignore all white space

et FreeBSD

   -b     Ignore changes in amount of white space.
   -B     Ignore changes that just insert or delete blank lines.
   -w     Ignore white space when comparing lines.

Généralement on utilise -b , car cela est moins susceptible de négliger des changements importants. Si vous n'avez changé que l'indentation, alors -b et -w donner le même résultat. D'un autre côté, si vous avez inséré des espaces là où il n'y en avait pas, ou supprimé des espaces existants (en n'en laissant aucun), cela pourrait être un changement dans votre programme. Voici un exemple :

$ diff foo.c foo2.c
4c4
<     setlocale(LC_ALL, "");
---
>     setlocale(LC_ALL, " ");
6,7c6,7
<     printw("U0001F0A1");
<     getch();
---
>     printw ("U0001F0A1");
>     getch();  /* comment */
$ diff -b foo.c foo2.c
4c4
<     setlocale(LC_ALL, "");
---
>     setlocale(LC_ALL, " ");
6,7c6,7
<     printw("U0001F0A1");
<     getch();
---
>     printw ("U0001F0A1");
>     getch();  /* comment */
$ diff -w foo.c foo2.c
7c7
<     getch();
---
>     getch();  /* comment */

Dans ce cas, le -w L'option vous permet d'ignorer le changement de setlocale paramètre (peut-être pas ce qui était prévu).

POSIX diff, soit dit en passant, n'a que le -b option.

Pour patch , POSIX documente le -l choix :

-l
(La lettre ell .) Cause toute séquence de <blank> caractères dans le script de différence pour correspondre à n'importe quelle séquence de <blank> caractères dans le fichier d'entrée. Les autres caractères doivent correspondre exactement.


Linux
  1. Comment utiliser la commande Linux grep

  2. Comment Linux est arrivé sur le mainframe

  3. Comment créer un package RPM Linux

  4. Comment créer un fichier d'échange sous Linux

  5. Comment coder un module du noyau Linux ?

Comment créer des partitions sous Linux

Comment créer des liens symboliques sous Linux

Comment créer un fichier sous Linux

Comment créer des raccourcis sur le bureau Linux

Comment créer un alias SSH sous Linux

Comment créer un alias sous Linux