Ini disentuh dalam dua pertanyaan, ' Periksa apakah file atau folder sudah ditambal ' dan ' Buat patch
kembali 0 ketika melewatkan tambalan yang sudah diterapkan ' namun tidak ada jawaban yang memuaskan.
Saya sedang menulis skrip dan ingin menguji yang berikut untuk tambalan:
Sepenuhnya diterapkan: lanjutkan
Sebagian diterapkan: keluar
Tidak diterapkan: jika berhasil diterapkan, lakukan dan lanjutkan, jika tidak keluar
Masalahnya adalah menangani kasus yang diterapkan sebagian:
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
Jadi bilah ada tetapi foo tidak karena pada beberapa titik bilah itu dihapus. Sekarang jika saya menerapkan tambalan maju dalam menjalankan-kering kode keluar adalah 1 karena tidak berhasil diterapkan.
$ 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
Itu tidak memberi tahu saya apakah tambalan sepenuhnya diterapkan, hanya saja gagal menjalankan-kering. Saya tidak tahu mengapa itu ditandai sebagai jawaban stackoverflow. Saya mencoba membalikkan tetapi karena ini skrip non-interaktif, ia hanya bekerja dengan paksa:
$ 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
Jadi apakah itu selalu berlaku bahwa jika saya mencoba untuk membalikkan tambalan secara paksa dalam waktu kering dan berhasil bahwa tambalan sepenuhnya diterapkan, dan jika gagal tambalan itu tidak sepenuhnya diterapkan (atau diterapkan sama sekali)? Karena jika demikian maka saya dapat melakukan sesuatu seperti
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1