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
Antworten:
Mit diesem Unterschied:
das passiert:
Die Antwort auf Ihre Frage lautet also nein.
quelle
--posix
da 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--posix
und 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.--posix
vielleicht 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.