パッチの逆転が成功した場合、それは常にパッチが完全に適用されたことを意味しますか?


9

これは、「ファイルまたはフォルダにすでにパッチが適用されているかどうかを確認する」および「すでに適用されているパッチをスキップするときに0 patch返すという 2つの質問で触れられますがどちらも満足のいく答えはありませんでした。

スクリプトを作成していて、パッチについて次のことをテストしたいと思います。

完全に適用:続行

一部適用:終了

適用されない:正常に適用できる場合はそれを実行して続行し、それ以外の場合は終了します

問題は部分的に適用されたケースを処理することです:

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

パッチが完全に適用されたかどうかはわかりませんが、予行演習に失敗しただけです。それがスタックオーバーフローの回答として正しいとマークされている理由はわかりません。私は逆転を試みましたが、それは非インタラクティブスクリプトであるため、強制的にのみ機能しました。

$ 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

ソースコードはあなたの管理下にありますか?つまり、すべてのパッチが常に正確に一度だけ適用されることを保証できますか?
roaima

1
@roamiaパッチとスクリプトは私の管理下にあります。私のスクリプトだけがパッチを適用します。
ジェイ

順方向と逆方向の両方で完全に成功する開始点とパッチを考案することは可能だと思います。
Jasen

回答:


3

この差分で:

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

だからあなたの質問への答えはノーです。


指摘いただきありがとうございます。--posixパッチを適用するファイルがない場合にエラーが発生するため、を使用してこのケースを修正できることがわかりました。ただし、削除するファイルにパッチとは異なる内容が含まれている場合でも、POSIXモードを使用してもエラーは発生しません。たとえば、リバースコマンドを実行し--posix、barファイルにデータが含まれている場合、POSIXモードではファイルは削除されず、エラーは発生しません。したがって、私の修正はposixモードありとなしの両方で実行され、両方に問題がなければ、パッチが正常に適用されたと思います。これを反映するように質問を更新します。
ジェイ・

それは--posix私が思ったすべての治療法ではないようです。ファイルがパッチによって削除されて実行された場合、ファイルが--posix --reverse存在しないというエラーが発生します。これについては明日詳しく調べなければならない。
ジェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.