これは、「ファイルまたはフォルダにすでにパッチが適用されているかどうかを確認する」および「すでに適用されているパッチをスキップするときに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
@roamiaパッチとスクリプトは私の管理下にあります。私のスクリプトだけがパッチを適用します。
—
ジェイ
順方向と逆方向の両方で完全に成功する開始点とパッチを考案することは可能だと思います。
—
Jasen