パッチを適用する前にファイルがパッチされているかどうかはわかりますか?
スクリプトでこれを行う必要があります。どんなアイデアがありますか?
答え1
はい、オプションをpatch
使用して実行する--dry-run
と失敗または成功し、終了状態で確認できます。
しかし、より一般的な(そしてエラーが少ない)方法で-R
、パッチ全体を復元できる場合にのみ「適用」と見なされる可能性があるため、「逆」を意味するオプションを使用して実行する必要があるかもしれません。そうしないと(「-R」なし)、元のファイルの一部が変更され、失敗する可能性があります。簡単な例は次のとおりです。
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
patch
(stdoutとstderrを上記のコードスニペットにリダイレクトして完全に沈黙することを好むかもしれません/dev/null
)
答え2
誰かに役立つ場合に備えて、Omnifariousが提供する例は、bashスクリプトを使用しても機能しません。 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
答え3
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
答え4
これは私にとって効果的です。
"scripts": {
"symfony-scripts": [
"patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",