Как создать патч, игнорирующий различия в отступах в коде?

Как создать патч, игнорирующий различия в отступах в коде?

Я пытаюсь создать патч для файла с помощью инструмента сравнения. Но столкнулся с проблемой. Ниже приведен способ, которым я это делаю.

Я создал один каталог с именем a и поместил в него исходный файл.

a/original_file.c

Теперь я создал другой каталог с именем b и поместил в него тот же файл с измененным содержимым.

b/original_file.c

Теперь содержимое b/original_file.cфайла я скопировал из интернета и вставил в какой-то текстовый редактор.

После ввода команды: diff -Naur a b > patch_file.patchфайл patch_file.patchгенерируется и в нем есть некоторые нежелательные изменения (связанные с отступами).

Например:

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

Теперь вы можете видеть, что произошли изменения, связанные с отступом, где sizeof (struct mg_rdy_notify))вместо него используется тот же самый элемент sizeof (struct mg_rdy_notify)), но с одной основой отступа, что нам не нужно.

решение1

diffимеет более одной опции, связанной с пробелами. Однако одна из них менее полезна для патчей. Страница руководства дает неясную подсказку, ссылаясь на обеГНУ:

   -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

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

Обычно используют -b, потому что так меньше вероятность пропустить существенные изменения. Если вы изменили только отступы, то оба -bи -wдают одинаковый результат. С другой стороны, если вы вставили пробелы там, где их не было, или удалили существующие пробелы (не оставив ничего), это может быть изменением в вашей программе. Вот пример:

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

В этом случае -wопция позволяет игнорировать изменение параметра setlocale(возможно, не то, что предполагалось).

POSIX-разница, кстати, имеет только такую -b​​возможность.

Для patch,POSIXдокументирует -lвозможность:

-l
(Письмоэлл.) Заставить любую последовательность <blank>символов в сценарии отличия совпадать с любой последовательностью <blank>символов во входном файле. Другие символы должны совпадать точно.

решение2

diffесть возможность игнорировать изменения пробелов ( -w), то же самое для patch( -l). В общем, игнорировать пробелы — плохая идея, поэтому вам следует приберечь ее использование для особых случаев, когда чей-то редактор сделал что-то ужасное...

Связанный контент