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

7

Estou tentando criar um patch para um arquivo usando a ferramenta diff.Mas estou enfrentando problemas. O jeito que estou fazendo está abaixo.

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

a/original_file.c

Agora criei outro Diretório chamado b e coloquei o mesmo arquivo com conteúdo modificado nele.

b/original_file.c

Agora, conteúdo do arquivo b/original_file.c que copiei da internet e coloquei em algum editor de texto.

Depois de dar o comando: diff -Naur a b > patch_file.patch , o arquivo patch_file.patch é gerado e tem 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, em que 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.

    
por Ram 17.10.2013 / 16:25

2 respostas

7

diff tem mais de uma opção relacionada ao espaço em branco. No entanto, um é menos útil para patches. A página de manual dá uma dica obscura, referindo-se ao 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

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

Normalmente, um usa -b , porque é menos provável que ignore mudanças significativas. Se você alterou apenas o recuo, os dois -b e -w fornecerão o 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 pode ser uma alteração 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 */

Nesse caso, a opção -w permite ignorar a alteração no parâmetro setlocale (talvez não seja o que se pretendia).

diff do POSIX , a propósito, tem apenas a opção -b .

Para patch , POSIX documenta a opção -l :

-l
(The letter ell.) Cause any sequence of <blank> characters in the difference script to match any sequence of <blank> characters in the input file. Other characters shall be matched exactly.

    
por 16.04.2016 / 01:51
8

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

    
por 17.10.2013 / 16:41