Nếu đảo ngược một bản vá thành công, điều đó luôn có nghĩa là bản vá đã được áp dụng đầy đủ?


9

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 patchreturn 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

Là mã nguồn dưới sự kiểm soát của bạn, tức là bạn có thể đảm bảo rằng tất cả các bản vá sẽ luôn áp dụng chính xác một lần không?
roaima

1
@roamia cũng là bản vá và kịch bản nằm dưới sự kiểm soát của tôi. chỉ kịch bản của tôi sẽ được áp dụng các bản vá.
Jay

Tôi nghĩ rằng nó có thể đạt được một điểm khởi đầu và một bản vá sẽ thành công hoàn toàn theo cả hai hướng thuận và ngược.
Jasen

Câu trả lời:


3

Với khác này:

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

điều này xảy ra:

$ 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

Vì vậy, câu trả lời cho câu hỏi của bạn là không.


Cảm ơn bạn đã chỉ ra rằng. Tôi đã tìm thấy tôi có thể khắc phục cho trường hợp đó bằng cách sử dụng --posixvì nó sẽ đặt lỗi khi không có tệp nào để vá. Tuy nhiên, sử dụng chế độ POSIX sẽ không đặt lỗi nếu một tệp bị xóa chứa nội dung khác với bản vá. Ví dụ: nếu tôi chạy lệnh đảo ngược đó --posixvà tệp thanh chứa một số dữ liệu thì trong chế độ POSIX, tệp sẽ không bị xóa và không xảy ra lỗi. Do đó, bản sửa lỗi của tôi là chạy cả có và không có chế độ posix và nếu cả hai đều ổn thì tôi giả sử bản vá đã được áp dụng thành công. Tôi sẽ cập nhật câu hỏi của tôi để phản ánh điều này.
Jay

Nó xuất hiện --posixcó thể không phải là thuốc chữa bệnh - tôi nghĩ đó là tất cả. Nếu một tệp bị xóa bởi một bản vá và tôi chạy --posix --reversethì đó là lỗi mà tệp không tồn tại. Tôi sẽ phải xem xét điều này nhiều hơn vào ngày mai.
Jay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.