これは2つの質問で扱われます。」ファイルまたはフォルダがパッチされていることを確認する「そして」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
したがって、barは存在しますが、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
答え1
この違いは次のとおりです。
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
したがって、あなたの質問に対する答えは「いいえ」です。