Bir düzeltme ekini tersine çevirmek başarılı olursa, bu her zaman düzeltme ekinin tam olarak uygulandığı anlamına mı gelir?


9

Bu iki soru üzerinde dokunulduğunda, ' Bir dosya veya klasör zaten yamalı olup olmadığını kontrol edin ' ve ' Yap patchreturn 0 zaten uygulanmış yama atlama ' Ancak ne bir tatmin cevap vardı.

Bir senaryo yazıyorum ve bir yama için aşağıdakileri test etmek istiyorum:

Tamamen uygulandı: devam

Kısmen uygulandı: çıkış

Uygulanmadı: başarıyla uygulanabiliyorsa ve devam edin, aksi takdirde çıkın

Sorun kısmen uygulanan vakayı ele almaktır:

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 var ama foo yok çünkü bir noktada kaldırıldı. Şimdi yamayı kuru çalıştırmada ileri doğru uygularsam çıkış kodu başarılı bir şekilde uygulanmadığı için 1 olur.

$ 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

Bu bana yamanın tamamen uygulanıp uygulanmadığını söylemiyor, sadece kuru çalışmayı başaramadı. Bunun neden stackoverflow yanıtı olarak işaretlendiğini bilmiyorum. Tersine çevirmeyi denedim, ancak etkileşimli olmayan bir komut dosyası olduğundan sadece zorla çalıştı:

$ 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

Öyleyse, kuru bir çalışmada bir yamayı zorla tersine çevirmeye çalışırsam ve yamanın tamamen uygulandığını ve tamamen uygulanmadığını (veya hiç uygulanmadığını) başarırsa her zaman tutar mı? Çünkü eğer öyleyse böyle bir şey yapabilirim

patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
 patch --forward --force -i foobar.patch) ||
exit 1

Kaynak kodu kontrolünüz altında mı, yani tüm yamaların her zaman tam olarak bir kez uygulanacağını garanti edebilir misiniz?
roaima

1
@ roamia iyi yama ve senaryo benim kontrolüm altında. sadece betiğim yamayı uygular.
Jay

Hem ileri hem de geri yönde tamamen başarılı olacak bir başlangıç ​​noktası ve bir yama elde etmenin mümkün olduğunu düşünüyorum.
Jasen

Yanıtlar:


3

Bu farkla:

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

bu olur:

$ 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

Yani sorunuzun cevabı hayır.


Bunu işaret ettiğiniz için teşekkür ederim. Ben --posixyama için hiçbir dosya olduğunda bir hata ayarlayacaktır beri kullanarak bu dava için düzeltebilirim buldum . Ancak, silinecek bir dosya düzeltme ekinden farklı içerik içeriyorsa POSIX modunu kullanmak hata vermeyecektir. Örneğin, bu ters komutu çalıştırırsam --posixve çubuk dosya bazı veriler içeriyorsa, POSIX modunda dosya silinmez ve hata oluşmaz. Bu yüzden benim düzeltme hem posix modu ile hem de posix modu olmadan çalıştırın ve her ikisi de tamamsa o zaman yama başarılı bir şekilde uygulandığını varsayalım. Sorumu bunu yansıtacak şekilde güncelleyeceğim.
Jay

Göründüğüm --posixher şey tedavi olmayabilir. Bir dosya bir yama tarafından silinirse ve çalıştırırsam --posix --reverse, dosyanın mevcut olmadığı hataları. Bunu yarın daha yakından inceleyeceğim.
Jay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.