GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿cómo crear un parche ignorando las diferencias de sangría en el código?

Estoy tratando de crear un parche para un archivo usando la herramienta diff. Pero me enfrento a un problema. La forma en que lo hago es la siguiente.

Creé un Directorio llamado a y puse el archivo original en él.

a/original_file.c

Ahora he creado otro Directorio llamado b y le puse el mismo archivo con contenido modificado.

b/original_file.c

Ahora el contenido de b/original_file.c archivo que he copiado de Internet y lo puse en algún editor de texto.

Después de dar el comando:diff -Naur a b > patch_file.patch , el archivo patch_file.patch se genera y tiene algunos cambios no deseados (está relacionado con la sangría).

Por ejemplo:

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

Ahora puede ver que hay cambios relacionados con la sangría donde sizeof (struct mg_rdy_notify)) se reemplaza por el mismo sizeof (struct mg_rdy_notify)) pero una base de sangría que es lo que no queremos.

Respuesta aceptada:

diff tiene más de una opción relacionada con los espacios en blanco. Sin embargo, uno es menos útil para los parches. La página del manual da una pista oscura, refiriéndose tanto a 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

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

Usualmente uno usa -b , porque es menos probable que pase por alto cambios significativos. Si ha cambiado solo la sangría, entonces ambos -b y -w dar el mismo resultado. Por otro lado, si insertó espacios donde no los había, o eliminó espacios existentes (sin dejar ninguno), eso podría ser un cambio en su programa. Aquí hay un ejemplo:

$ 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 */

En este caso, el -w La opción le permite ignorar el cambio en el setlocale parámetro (quizás no sea lo que se pretendía).

POSIX diff, por cierto, solo tiene el -b opción.

Para patch , POSIX documenta el -l opción:

-l
(La letra ell .) Provocar cualquier secuencia de <blank> caracteres en el script de diferencia para que coincida con cualquier secuencia de <blank> caracteres en el archivo de entrada. Los demás caracteres deben coincidir exactamente.


Linux
  1. Cómo usar el comando de historial en Linux

  2. Cómo crear un alias y usar el comando Alias ​​en Linux

  3. Cómo crear un script de un comando de Linux

  4. ¿Cómo desensamblar un ejecutable binario en Linux para obtener el código de ensamblaje?

  5. ¿Cómo crear un parche ignorando las diferencias de sangría en el código?

Cómo crear particiones en Linux

Cómo crear enlaces simbólicos en Linux

Cómo crear un archivo en Linux

Cómo crear accesos directos en el escritorio de Linux

Cómo crear un alias SSH en Linux

Cómo crear un alias en Linux