パッチを元に戻すことに成功すると、常にパッチが完全に適用されたことを意味しますか?

パッチを元に戻すことに成功すると、常にパッチが完全に適用されたことを意味しますか?

これは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

したがって、あなたの質問に対する答えは「いいえ」です。

関連情報