Якщо виправлення патчу вдається, чи означає це, що патч було повністю застосовано?


9

Це стосується двох питань: " Перевірте, чи файл чи папку вже виправлено " та " Зробити 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

Чи є вихідний код під вашим контролем, тобто ви можете гарантувати, що всі патчі завжди застосовуватимуться точно один раз?
roaima

1
@roamia добре, патч і сценарій під моїм контролем. тільки мій сценарій буде застосовувати патч.
Джей

Я думаю, що можна створити вихідну точку та виправлення, які б досягли повного успіху як вперед, так і в зворотному напрямку.
Ясен

Відповіді:


3

З цією різницею:

diff --git a/bar b/bar
new file mode 100644
index 0000000..e69de29
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

це відбувається:

$ cd /tmp/test
$ patch --forward -i foobar.patch
patching file bar
patching file foo
$ echo $?
0
$ rm bar
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file bar,
which does not exist!  Applying it anyway.
checking file bar
checking file foo
$ echo $?
0

Тож відповідь на ваше запитання - ні.


Дякую, що вказали на це. Я виявив, що можу виправити цей випадок, використовуючи, --posixоскільки він встановить помилку, коли немає файлу для виправлення. Однак використання режиму POSIX не встановить помилку, якщо файл, який потрібно видалити, містить вміст, який відрізняється від виправлення. Наприклад, якщо я запускаю цю зворотну команду, --posixа барний файл містить деякі дані, то в режимі POSIX файл не буде видалений і помилка не відбудеться. Тому моє виправлення запускається як в режимі posix, так і без нього, і якщо обоє в порядку, то я припускаю, що патч було успішно застосовано. Я оновлю своє запитання, щоб це відобразити.
Jay

Можливо, --posixце не є лікуванням - все, що я думав, це було. Якщо файл видалено патчем, і я запускаю, --posix --reverseто він помиляється, що файл не існує. Мені доведеться розглянути це ще завтра.
Джей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.