Этот вопрос затрагивается в двух вопросах: « Проверьте, был ли файл или папка уже исправлены » и « Сделать patch
возврат 0 при пропуске уже примененного исправления », однако ни один из них не дал удовлетворительного ответа.
Я пишу скрипт и хочу проверить следующее:
Полностью применено: продолжить
Частично применен: выход
Не применено: если оно может быть успешно применено, сделайте это и продолжите, иначе выйдите
Проблема заключается в обработке частично примененного случая:
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
Так что bar существует, но foo нет, потому что в какой-то момент он был удален. Теперь, если я применяю патч вперёд при пробном запуске, код выхода равен 1, так как он не был успешно применён.
$ 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
Это не говорит мне, был ли патч полностью применен, просто он провалил пробный запуск. Я не знаю, почему это помечено как ответ на стекопоток. Я попытался повернуть вспять, но так как это неинтерактивный скрипт, он работал только с силой:
$ 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
Так всегда ли считается, что, если я пытаюсь принудительно отменить патч в пробном режиме, и это успешно, что патч полностью применен, и если он терпит неудачу, он не применяется полностью (или применяется вообще)? Потому что если так, то я могу сделать что-то вроде
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1