Como criar um patch ignorando diferenças de indentação no código?

Como criar um patch ignorando diferenças de indentação no código?

Estou tentando criar um patch de arquivo usando a ferramenta diff. Mas estou enfrentando problemas.

Criei um diretório chamado a e coloquei o arquivo original nele.

a/original_file.c

Agora criei outro diretório chamado be coloquei nele o mesmo arquivo com conteúdo modificado.

b/original_file.c

Agora b/original_file.ccopiei o conteúdo do arquivo da internet e coloquei em algum editor de texto.

Após dar o comando: diff -Naur a b > patch_file.patch, o arquivo patch_file.patché gerado e apresenta algumas alterações indesejadas (relacionadas ao recuo).

Por exemplo:

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

Agora você pode ver que há alterações relacionadas ao recuo onde sizeof (struct mg_rdy_notify))é substituído pelo mesmo, sizeof (struct mg_rdy_notify))mas uma base de recuo que é o que não queremos.

Responder1

difftem mais de uma opção relacionada ao espaço em branco. No entanto, um é menos útil para patches. A página do manual dá uma dica obscura, referindo-se a ambosGNU:

   -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

eFreeBSD

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

Normalmente usa-se -b, porque é menos provável que ignore mudanças significativas. Se você alterou apenas o recuo, ambos -bfornecerão -wo mesmo resultado. Por outro lado, se você inseriu espaços onde não havia nenhum, ou excluiu espaços existentes (não deixando nenhum), isso poderia ser uma mudança no seu programa. Aqui está um exemplo:

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

Neste caso, a -wopção permite ignorar a alteração do setlocaleparâmetro (talvez não o pretendido).

Diferença POSIX, aliás, só tem a -bopção.

Para patch,POSIXdocumenta a -lopção:

-l
(A cartaei.) Faça com que qualquer sequência de <blank>caracteres no script de diferença corresponda a qualquer sequência de <blank>caracteres no arquivo de entrada. Outros caracteres devem ser correspondidos exatamente.

Responder2

difftem a opção de ignorar alterações de espaços em branco ( -w), o mesmo para patch( -l). Em geral, é uma má idéia ignorar os espaços em branco, então você deve reservar seu uso para casos especiais, quando o editor de alguém fez algo horrível...

informação relacionada