ファイルまたはフォルダーに既にパッチが適用されているかどうかを確認します


22

パッチを適用する前に、ファイルにすでにパッチが適用されているかどうかを知ることはできますか?

スクリプトでこれを行う必要があります、何か考えはありますか?


1
それらをパッチするためにどのプログラムを使用していますか?どのようなパッチですか?
-Omnifarious

回答:


20

はい、オプションで実行patchするだけで、--dry-run失敗または成功し、終了ステータスで確認できます。

しかし、より一般的な(およびエラーが発生しやすい)方法では、おそらく-R「適用済み」と見なすことができるパッチ全体を元に戻すことができた場合にのみ、「リバース」を意味するオプションで実行する必要があります。そうでない場合( '-R'なし)、元のファイルの一部が変更されただけで失敗する可能性があります。以下に簡単な例を示します。

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

(さらに、上記のスニペットでは、patchそのstdoutとstderrを完全にリダイレクトするように黙らせることを好むかもしれません/dev/null


1
これは私には機能しません。そのコマンドを実行すると、パッチが適用されていない場合、対話モードでパッチを「元に戻す」かどうかを確認し、バッチモードを使用する場合は、リバース操作を無視してパッチを適用し、0を返します。
シナック

1
ねえ、追加してみてください-sfpatch(のように記述することができますpatch -Rsfp0 --dry-run
poige

1
@synackは大丈夫ですか?
poige

16

それが誰かを助ける場合に備えて、bashスクリプトを使用している場合、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代わりに0if [ $? -eq 1 ]
Crisson

2
いいえ、0は正しいです。ドライランが何らかの理由で失敗した場合、パッチはゼロ以外で終了します。その場合、パッチは適用されません。
Fls'Zen

私のスクリプトはbashで正しかった。bashは、0の終了コードtrueがifの目的であると見なします。これは、ほとんどのコマンドが成功を示すために終了コード0を使用しているためです。
Omnifarious

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-なぜそうしたのか思い出せない。そして、(編集の承認要求のために)そこにあることに気づいた時には、それはずっと前に理由を回復するチャンスはありませんでした。今見ていると、まったく無意味に思えます。
Omnifarious

0

私の場合、パッチコマンドを実行しても何をすべきかを尋ねる対話型の端末(特にCIの場合)が実行されないように、このチェックを行いたいと思いました。

それだけが必要な場合は、--forward引数も使用でき、既に適用されている場合はパッチをスキップします!


0

これはうまくいきました。

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.