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

Estoy tratando de crear un parche de un file usando la herramienta diff. Pero estoy enfrentando un problema. La forma en que lo estoy haciendo es a continuación.

Creé un directory llamado a y le puse el file original.

a/original_file.c 

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

 b/original_file.c 

Ahora el contenido del file b/original_file.c lo he copydo de Internet y lo he puesto en algún editor de text.

Después de dar el command: diff -Naur ab > patch_file.patch , se genera el file patch_file.patch 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.

diff tiene más de una opción relacionada con el espacio en blanco. Sin embargo, uno es less útil para los parches. La página del manual da una pista oscura, refiriéndose a ambos 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 less probable que pase por alto cambios significativos. Si ha cambiado solo la sangría, tanto -b como -w dan 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 progtwig. 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 opción -w permite ignorar el cambio en el parámetro setlocale (quizás no lo que se pretendía).

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

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

-l
(La letra ell .) Provoca que cualquier secuencia de caracteres <blank> en el script de diferencia coincida con cualquier secuencia de caracteres <blank> en el file de input. Otros personajes se emparejarán exactamente.

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