Перевірте, чи файл або папку вже виправлено


22

Чи можна дізнатися, чи файл вже був виправлений, перш ніж застосувати патч?

Мені потрібно це робити за сценарієм, будь-якими думками?


1
Яку програму ви використовуєте, щоб виправити їх? Які патчі?
всезнайко

Відповіді:


20

Так, просто запустіть patchз --dry-runваріантом, він або не вдасться, або досягне успіху, що можна дізнатися зі статусом виходу.

Але в більш поширеному (і схильному до помилок) способі , ймовірно, вам доведеться запустити його з -Rопцією, що означає "зворотний", оскільки лише в тому випадку, якщо він зміг відновити весь патч, його можна вважати "застосованим". В іншому випадку (без '-R') він може вийти з ладу лише через те, що деякі частини оригінального файлу були змінені. Нижче наведено простий приклад:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(Evenmore, в фрагменті вище ви могли б навіть вважав за краще , щоб змусити замовкнути patchповністю перенаправляє його стандартний висновок і стандартний потік помилок в /dev/null)


1
Це не працює для мене. Коли я запускаю цю команду, якщо патч не застосований, він запитує, чи не "відміняти" патч в інтерактивному режимі, і якщо я використовую пакетний режим, він ігнорує зворотну операцію і застосує патч, повертаючи 0.
синак

1
Гей, спробуйте додати -sfдо patch(можна записати як patch -Rsfp0 --dry-run)
poige

1
@synack все в порядку?
poige

16

На всякий випадок, коли це комусь допомагає, якщо ви використовуєте bash script, то приклад, поданий Omnifarious, не працював. У bash статус виходу успішної команди дорівнює 0

Отже, працює так:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

Перевірка повинна бути проти 1замість 0:if [ $? -eq 1 ]
Crisson

2
Ні, 0 правильно. Патч вийде з ненульовим значенням, якщо пробіг із якоїсь причини не вдався з якоїсь причини, і в цьому випадку виправлення не слід застосовувати.
Fls'Zen

Мій сценарій був правильним в баш. bash вважає вихідний код 0 trueдля цілей if. Саме тому, що більшість команд використовують вихідний код 0 для позначення успіху.
всезнайко

2

Ось здогадка, припускаючи, що ви використовуєте patchутиліту і кожен файл, який потрібно виправити, має свій власний патч:

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

Або якщо ви виправили файли раніше і хочете дізнатися, чи торкнувся він якийсь конкретний файл, ви можете запустити перший раунд виправлення з -Bможливістю, що призведе до створення резервної копії. Потім ви перевіряєте наявність резервної копії.
петерф

8
Чи можете ви трохи розширити, чому ви вирішили використовувати nohupв такому ifвипадку?
zrajm

@zrajm - не можу пригадати, чому я це зробив. І до того моменту, коли я помітив (через запит на затвердження редакції), що він був там, це було так давно, немає жодного шансу я коли-небудь відновити причину. Мені здається, це зовсім безглуздо, дивлячись на це зараз.
всезнайко

0

У моєму випадку я хотів зробити цю перевірку, щоб виконання команди патча не закінчилось інтерактивним терміналом із запитом, що робити (особливо для CI).

Виявляється, що якщо вам лише потрібно, ви можете також використовувати --forwardаргумент, і він пропустить патч, якщо він уже застосований!


0

Це працювало на мене.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.