如果反转补丁程序成功,这是否总是意味着补丁程序已完全应用?


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

所以bar存在,但是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)

我认为有可能构想一个可以在正反两个方向完全成功的起点和补丁。
杰森

Answers:


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模式不会设置错误。例如,如果我运行该反向命令,--posix并且bar文件包含一些数据,那么在POSIX模式下,该文件将不会被删除,并且不会发生任何错误。因此,无论有没有posix模式,我的修复程序都可以运行它,如果两者都可以,那么我认为补丁已成功应用。我将更新我的问题以反映这一点。
杰伊(Jay)

看来这--posix可能不是我所认为的所有治愈方法。如果某个文件被补丁删除并运行,--posix --reverse那么它会错误指出该文件不存在。明天我将对此进行更多研究。
杰伊”(Jay)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.