Jika membalikkan tambalan berhasil, apakah itu selalu berarti tambalan telah sepenuhnya diterapkan?

9

Ini disentuh dalam dua pertanyaan, ' Periksa apakah file atau folder sudah ditambal ' dan ' Buat patchkembali 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
Jay
sumber
Apakah kode sumber di bawah kendali Anda, yaitu dapatkah Anda menjamin bahwa semua tambalan akan selalu berlaku tepat satu kali?
roaima
1
@roamia juga tambalan dan skrip berada di bawah kendali saya. hanya skrip saya yang akan menerapkan tambalan.
Jay
Saya pikir mungkin untuk membuat titik awal dan tambalan yang akan berhasil sepenuhnya dalam arah maju dan mundur.
Jasen

Jawaban:

3

Dengan perbedaan ini:

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

ini terjadi:

$ 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

Jadi jawaban untuk pertanyaan Anda adalah tidak.

Aferber
sumber
Terima kasih telah menunjukkannya. Saya menemukan bahwa saya dapat memperbaiki kasus itu dengan menggunakan --posixkarena 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 --posixdan 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.
Jay
Tampaknya --posixmungkin bukan obatnya - semua yang saya pikirkan. Jika file dihapus oleh tambalan dan saya jalankan --posix --reversemaka itu kesalahan bahwa file tersebut tidak ada. Saya harus melihat ini lebih banyak besok.
Jay