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
Jawaban:
Dengan perbedaan ini:
ini terjadi:
Jadi jawaban untuk pertanyaan Anda adalah tidak.
sumber
--posix
karena ini akan mengatur kesalahan ketika tidak ada file untuk ditambal. Namun menggunakan mode POSIX tidak akan mengatur kesalahan jika file yang akan dihapus berisi konten yang berbeda dari tambalan. Sebagai contoh jika saya menjalankan perintah kebalikan dengan--posix
dan file bar berisi beberapa data maka dalam mode POSIX file tidak akan dihapus dan tidak ada kesalahan terjadi. Oleh karena itu perbaikan saya adalah menjalankannya baik dengan dan tanpa mode posix dan jika keduanya ok maka saya menganggap patch berhasil diterapkan. Saya akan memperbarui pertanyaan saya untuk mencerminkan hal ini.--posix
mungkin bukan obatnya - semua yang saya pikirkan. Jika file dihapus oleh tambalan dan saya jalankan--posix --reverse
maka itu kesalahan bahwa file tersebut tidak ada. Saya harus melihat ini lebih banyak besok.