Zostało to poruszone w dwóch pytaniach: „ Sprawdź, czy plik lub folder został już załatany ” i „ Zwróć patch
0, pomijając już zastosowaną łatkę ”, jednak żadne nie miało satysfakcjonującej odpowiedzi.
Piszę skrypt i chcę przetestować następujące poprawki:
W pełni zastosowane: kontynuuj
Częściowo zastosowane: wyjście
Nie zastosowano: jeśli można go pomyślnie zastosować, zrób to i kontynuuj, w przeciwnym razie zakończ
Problemem jest obsługa częściowo zastosowanego przypadku:
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
Więc pasek istnieje, ale foo nie, ponieważ w pewnym momencie został usunięty. Teraz, jeśli zastosuję łatkę do przodu w suchym biegu, kod wyjścia to 1, ponieważ nie został pomyślnie zastosowany.
$ 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
Nie mówi mi to jednak, czy łatka została w pełni zastosowana, tylko to, że nie powiodła się sucha próba. Nie wiem, dlaczego oznaczono to poprawnie jako odpowiedź na przepełnienie stosu. Próbowałem cofnąć, ale ponieważ jest to skrypt nieinteraktywny, działał tylko z siłą:
$ 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
Czy zatem zawsze utrzymuje się, że jeśli spróbuję siłą odwrócić łatkę w trybie próbnym i uda się, że łatka zostanie w pełni zastosowana, a jeśli zawiedzie, to nie zostanie w pełni zastosowana (lub w ogóle zastosowana)? Bo jeśli tak, to mogę zrobić coś takiego
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1