Này được đề cập đến trong hai câu hỏi, ' Kiểm tra xem một tập tin hoặc thư mục đã được vá đã ' và ' Make patch
return 0 khi bỏ qua một bản vá đã áp dụng ' tuy nhiên không có một câu trả lời thỏa mãn.
Tôi đang viết một kịch bản và muốn kiểm tra các bản vá sau:
Áp dụng đầy đủ: tiếp tục
Áp dụng một phần: lối ra
Không áp dụng: nếu có thể áp dụng thành công, hãy tiếp tục, nếu không thì thoát
Vấn đề là xử lý trường hợp được áp dụng một phần:
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
Vì vậy, thanh tồn tại nhưng foo không bởi vì tại một số điểm nó đã bị xóa. Bây giờ nếu tôi áp dụng bản vá chuyển tiếp trong mã khô, mã thoát là 1 vì nó không được áp dụng thành công.
$ 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
Điều đó không cho tôi biết liệu bản vá có được áp dụng đầy đủ hay không, chỉ là nó không chạy được. Tôi không biết tại sao điều đó được đánh dấu là câu trả lời stackoverflow. Tôi đã thử đảo ngược nhưng vì nó là một kịch bản không tương tác nên nó chỉ hoạt động với lực lượng:
$ 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
Vì vậy, có phải tôi luôn chắc chắn rằng nếu tôi cố gắng đảo ngược một bản vá trong thời gian khô và thành công là bản vá đó được áp dụng đầy đủ hay không, và nếu nó không được áp dụng hoàn toàn (hoặc áp dụng hoàn toàn)? Bởi vì nếu vậy thì tôi có thể làm một cái gì đó như
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1