Wie erstelle ich einen Patch, bei dem Einrückungsunterschiede im Code ignoriert werden?

7

Ich versuche, eine Datei mit dem Diff-Tool zu patchen. Es treten jedoch Probleme auf. Die Vorgehensweise ist unten aufgeführt.

Ich habe ein Verzeichnis mit dem Namen a erstellt und die Originaldatei darin abgelegt.

a/original_file.c

Jetzt habe ich ein anderes Verzeichnis mit dem Namen b erstellt und dieselbe Datei mit geändertem Inhalt darin abgelegt.

b/original_file.c

Jetzt habe b/original_file.cich den Inhalt der Datei aus dem Internet kopiert und in einen Texteditor gestellt.

Nach dem Befehl: diff -Naur a b > patch_file.patchwird die Datei patch_file.patchgeneriert und weist einige unerwünschte Änderungen auf (im Zusammenhang mit dem Einzug).

Zum Beispiel:

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

Jetzt können Sie sehen, dass es Änderungen in Bezug auf die Einrückung gibt, bei denen sizeof (struct mg_rdy_notify))dieselbe ersetzt wird, sizeof (struct mg_rdy_notify))aber eine Einrückungsgrundlage, die wir nicht wollen.

RAM
quelle

Antworten:

7

diffhat mehr als eine Option in Bezug auf Leerzeichen. Für Patches ist man jedoch weniger nützlich. Die Handbuchseite gibt einen obskuren Hinweis, der sich auf beide GNU bezieht :

   -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

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

Normalerweise verwendet man -b, weil das weniger wahrscheinlich ist, signifikante Änderungen zu übersehen. Wenn Sie nur Einrückungen geändert haben, dann beide -bund -wgeben das gleiche Ergebnis. Wenn Sie dagegen Leerzeichen einfügen, in denen keine vorhanden sind, oder vorhandene Leerzeichen löschen (keine lassen), kann dies eine Änderung in Ihrem Programm sein. Hier ist ein Beispiel:

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

In diesem Fall -wkönnen Sie mit der Option die Änderung des setlocaleParameters ignorieren (möglicherweise nicht das, was beabsichtigt war).

POSIX diff hat übrigens nur die -bOption.

Für patch, POSIX dokumentiert die -lOption:

-l
(Der Buchstabe ell .) Bewirkt, dass eine beliebige <blank>Zeichenfolge im Differenzskript mit einer beliebigen <blank>Zeichenfolge in der Eingabedatei übereinstimmt . Andere Zeichen müssen genau übereinstimmen.

Thomas Dickey
quelle
Ich war erstaunt, dass dies weniger positive Stimmen hatte, bis ich die Zeitstempel bemerkte. Vielen Dank, dass Sie sich die Zeit genommen haben. das war sehr hilfreich. :)
Wildcard
Kein Problem - Ich habe den Rückstand an Fragen durchgearbeitet, die ich interessant finde ...
Thomas Dickey
8

diffhat die Option, Whitespace-Änderungen ( -w) zu ignorieren , ebenso wie patch( -l). Im Allgemeinen ist es jedoch eine schlechte Idee, Leerzeichen zu ignorieren. Daher sollten Sie die Verwendung für Sonderfälle reservieren, in denen jemandes Redakteur etwas Schreckliches getan hat ...

Frostschutz
quelle
Danke @frontschutz, also mein Kommade wäre jetzt diff -Naur -wab ??
Ram