หากการย้อนแพตช์สำเร็จหมายความว่าแพทช์ถูกนำไปใช้อย่างสมบูรณ์หรือไม่?


9

นี้จะสัมผัสกับในสองคำถาม ' ตรวจสอบว่าไฟล์หรือโฟลเดอร์ได้รับการติดตั้งแล้ว ' และ ' ทำให้patchผลตอบแทน 0 เมื่อข้ามแพทช์ใช้แล้ว ' แต่ไม่ได้คำตอบที่น่าพอใจ

ฉันกำลังเขียนสคริปต์และต้องการทดสอบโปรแกรมปรับปรุงต่อไปนี้:

ใช้อย่างเต็มที่: ดำเนินการต่อ

นำไปใช้บางส่วน: ออก

ไม่ได้ใช้: ถ้ามันสามารถนำไปใช้ประสบความสำเร็จทำมันและดำเนินการต่อมิฉะนั้นออกจาก

ปัญหาคือการจัดการกรณีที่นำไปใช้บางส่วน:

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

มีแถบอยู่ แต่ 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

ที่ไม่ได้บอกฉันว่าแพทช์ถูกนำไปใช้อย่างเต็มที่ แต่เพียงว่ามันล้มเหลวในการเรียกใช้แห้ง ฉันไม่ทราบสาเหตุที่ทำเครื่องหมายว่าถูกต้องเป็นคำตอบ stackoverflow ฉันพยายามย้อนกลับ แต่เนื่องจากเป็นสคริปต์ที่ไม่โต้ตอบจึงทำงานได้กับ:

$ 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

1
@roamia แพทช์และสคริปต์อยู่ภายใต้การควบคุมของฉัน สคริปต์ของฉันเท่านั้นที่จะใช้โปรแกรมแก้ไข
Jay

ฉันคิดว่ามันเป็นไปได้ที่จะประดิษฐ์จุดเริ่มต้นและแพทช์ที่จะประสบความสำเร็จอย่างสมบูรณ์ทั้งในทิศทางไปข้างหน้าและถอยหลัง
Jasen

คำตอบ:


3

ด้วยความแตกต่างนี้:

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

สิ่งนี้เกิดขึ้น:

$ 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

ดังนั้นคำตอบสำหรับคำถามของคุณคือไม่


ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันพบว่าฉันสามารถแก้ไขกรณีดังกล่าวได้โดยใช้--posixเนื่องจากจะตั้งข้อผิดพลาดเมื่อไม่มีไฟล์ที่จะแก้ไข อย่างไรก็ตามการใช้โหมด POSIX จะไม่ตั้งข้อผิดพลาดหากไฟล์ที่จะลบมีเนื้อหาที่แตกต่างจากโปรแกรมแก้ไข ตัวอย่างเช่นถ้าฉันรันคำสั่ง reverse นั้นด้วย--posixและไฟล์บาร์มีข้อมูลบางส่วนจากนั้นในโหมด POSIX ไฟล์จะไม่ถูกลบและไม่มีข้อผิดพลาดเกิดขึ้น ดังนั้นการแก้ไขของฉันจะรันทั้งที่มีและไม่มีโหมด posix และหากทั้งคู่ใช้ได้แล้วฉันถือว่าแพทช์ถูกนำไปใช้อย่างประสบความสำเร็จ ฉันจะอัปเดตคำถามของฉันเพื่อสะท้อนสิ่งนี้
Jay

ดูเหมือนว่ามัน--posixอาจจะไม่ใช่การรักษาทั้งหมดที่ฉันคิดว่ามันเป็น หากไฟล์ถูกลบโดยแพทช์และฉันเรียกใช้--posix --reverseแล้วมันเกิดข้อผิดพลาดว่าไฟล์ไม่มีอยู่ พรุ่งนี้ฉันจะต้องพิจารณาเรื่องนี้ให้มากขึ้น
Jay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.