Wenn das Umkehren eines Patches erfolgreich ist, bedeutet dies immer, dass der Patch vollständig angewendet wurde?

9

Dies wird in zwei Fragen angesprochen: " Überprüfen Sie, ob eine Datei oder ein Ordner bereits gepatcht wurde " und " Geben Sie patch0 zurück, wenn Sie einen bereits angewendeten Patch überspringen ". Beide hatten jedoch keine zufriedenstellende Antwort.

Ich schreibe ein Skript und möchte Folgendes für einen Patch testen:

Vollständig angewendet: weiter

Teilweise angewendet: Beenden

Nicht angewendet: Wenn es erfolgreich angewendet werden kann, führen Sie es aus und fahren Sie fort, andernfalls beenden Sie es

Das Problem ist die Behandlung des teilweise angewendeten Falls:

mkdir test && cd test

cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF

patch --forward -i foobar.patch
rm foo

Es gibt also eine Leiste, aber foo nicht, weil sie irgendwann entfernt wurde. Wenn ich den Patch jetzt in einem Trockenlauf vorwärts anwende, ist der Exit-Code 1, da er nicht erfolgreich angewendet wird.

$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists!  Skipping patch.
1 out of 1 hunk ignored
$ echo $?
1

Das sagt mir jedoch nicht, ob der Patch vollständig angewendet wurde, nur dass der Trockenlauf fehlgeschlagen ist. Ich weiß nicht, warum das als Stackoverflow-Antwort richtig markiert ist. Ich habe versucht, umzukehren, aber da es sich um ein nicht interaktives Skript handelt, hat es nur mit Gewalt funktioniert:

$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file foo,
which does not exist!  Applying it anyway.
checking file foo
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED
checking file bar
$ echo $?
1

Gilt es also immer, wenn ich versuche, ein Patch in einem Trockenlauf zwangsweise umzukehren, und es gelingt, dass das Patch vollständig angewendet wird, und wenn es fehlschlägt, dass es nicht vollständig angewendet wird (oder überhaupt angewendet wird)? Denn wenn ja, dann kann ich so etwas tun

patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
 patch --forward --force -i foobar.patch) ||
exit 1
Jay
quelle
Ist der Quellcode unter Ihrer Kontrolle, dh können Sie garantieren, dass alle Patches immer genau einmal angewendet werden?
Roaima
1
@roamia Nun, der Patch und das Skript sind unter meiner Kontrolle. Nur mein Skript würde den Patch anwenden.
Jay
Ich denke, es ist möglich, einen Ausgangspunkt und einen Patch zu erfinden, die sowohl in Vorwärts- als auch in Rückwärtsrichtung vollständig erfolgreich sind.
Jasen

Antworten:

3

Mit diesem Unterschied:

diff --git a/bar b/bar
new file mode 100644
index 0000000..e69de29
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

das passiert:

$ cd /tmp/test
$ patch --forward -i foobar.patch
patching file bar
patching file foo
$ echo $?
0
$ rm bar
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file bar,
which does not exist!  Applying it anyway.
checking file bar
checking file foo
$ echo $?
0

Die Antwort auf Ihre Frage lautet also nein.

aferber
quelle
Vielen Dank für den Hinweis. Ich habe festgestellt, dass ich diesen Fall mithilfe von beheben kann, --posixda dadurch ein Fehler ausgelöst wird, wenn keine zu patchende Datei vorhanden ist. Die Verwendung des POSIX-Modus setzt jedoch keinen Fehler, wenn eine zu löschende Datei Inhalte enthält, die vom Patch abweichen. Wenn ich beispielsweise diesen umgekehrten Befehl mit ausführe --posixund die Balkendatei einige Daten enthält, wird die Datei im POSIX-Modus nicht gelöscht und es tritt kein Fehler auf. Daher wird mein Fix sowohl mit als auch ohne Posix-Modus ausgeführt. Wenn beide in Ordnung sind, gehe ich davon aus, dass der Patch erfolgreich angewendet wurde. Ich werde meine Frage aktualisieren, um dies widerzuspiegeln.
Jay
Es scheint --posixvielleicht nicht das Allheilmittel zu sein, von dem ich dachte, dass es es ist. Wenn eine Datei durch einen Patch gelöscht wird und ich sie ausführe --posix --reverse, tritt der Fehler auf, dass die Datei nicht vorhanden ist. Ich muss mich morgen mehr darum kümmern.
Jay