Це стосується двох питань: " Перевірте, чи файл чи папку вже виправлено " та " Зробити 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
Отже, смужка існує, але 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
Це не говорить про те, чи повністю застосовано патч, лише те, що він не вдався до запуску. Я не знаю, чому це позначено правильно як відповідь stackoverflow. Я спробував змінити реверс, але оскільки це неінтерактивний сценарій, він працював лише з силою:
$ 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