Dies wird in zwei Fragen angesprochen: " Überprüfen Sie, ob eine Datei oder ein Ordner bereits gepatcht wurde " und " Geben Sie patch
0 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