
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.c
copiei 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
diff
tem 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
-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 -b
fornecerão -w
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 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 -w
opção permite ignorar a alteração do setlocale
parâmetro (talvez não o pretendido).
Diferença POSIX, aliás, só tem a -b
opção.
Para patch
,POSIXdocumenta a -l
opçã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
diff
tem 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...