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

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

Estoy intentando crear un parche para un archivo usando la herramienta de diferenciación, pero tengo problemas. La forma en que lo hago se muestra a continuación.

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

a/original_file.c

Ahora he creado otro directorio llamado by le puse el mismo archivo con contenido modificado.

b/original_file.c

Ahora el contenido del b/original_file.carchivo lo copié de Internet y lo puse en algún editor de texto.

Después de dar el comando:, diff -Naur a b > patch_file.patchel archivo patch_file.patchse 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 la misma sizeof (struct mg_rdy_notify))base de sangría, pero una, que es lo que no queremos.

Respuesta1

difftiene 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 a ambos.ÑU:

   -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

yFreeBSD

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

Generalmente se usa -b, porque es menos probable que se pasen por alto cambios significativos. Si solo ha cambiado la sangría, ambos -by -wdarán el mismo resultado. Por otro lado, si insertó espacios donde no había ninguno, 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, la -wopción le permite ignorar el cambio del setlocaleparámetro (quizás no sea lo previsto).

diferencia POSIX, por cierto, sólo tiene la -bopción.

Para patch,POSIXdocumenta la -lopción:

-l
(La cartaana.) Hacer que cualquier secuencia de <blank>caracteres en el script de diferencia coincida con cualquier secuencia de <blank>caracteres en el archivo de entrada. Los demás caracteres deberán coincidir exactamente.

Respuesta2

difftiene una opción para ignorar los cambios de espacios en blanco ( -w), lo mismo para patch( -l). En general, es una mala idea ignorar los espacios en blanco, por lo que debes reservar su uso para casos especiales, cuando el editor de alguien hizo algo horrible...

información relacionada