我有一个运行patch命令的构建工具,如果patch命令返回非零,则会导致构建失败。我正在应用可能已应用或可能尚未应用的修补程序,因此我使用-N
选项patch
,它会跳过它应该的状态。但是,当它跳过时,patch
返回非零值。有没有办法强制它返回0,即使它跳过应用补丁?我无法从手册页中找到任何此类功能。
答案 0 :(得分:1)
我相信以下配方应该可以解决问题,这就是我在相同情况下使用的方法;
patches: $(wildcard $(SOMEWHERE)/patches/*.patch)
for patch_file in $^; do \
patch --strip=2 --unified --backup --forward --directory=<somewhere> --input=$$patch_file; \
retCode=$$?; \
[[ $$retCode -gt 1 ]] && exit $$retCode; \
done; \
exit 0
这个配方循环遍历依赖项(在我的例子中是补丁文件)并为每个依赖项调用补丁。 &#34;技巧&#34;我依赖的是,如果已经应用了补丁,则补丁返回1;对于其他错误(例如不存在的补丁文件),补丁返回其他更高的数字。补丁手册条目的DIAGNOSTICS部分描述了返回码的情况。 YMMV
答案 1 :(得分:1)
下面是一个脚本,该脚本从@fsw迭代上述想法,并根据需要处理.rej文件的删除。
#! /bin/sh
set +x
set -euo pipefail
bn=$(basename "$0")
patch="$1"; shift
r=$(mktemp /tmp/"$bn".XXXX)
if ! out=$(patch -p1 -N -r "$r" < "$patch")
then
echo "$out" | grep -q "Reversed (or previously applied) patch detected! Skipping patch."
test -s "$r" # Make sure we have rejects.
else
test -f "$r" && ! test -s "$r" # Make sure we have no rejects.
fi
rm -f "$r"
答案 2 :(得分:0)
You can also do that as a one line only
patch -p0 --forward < patches/patch-babylonjs.diff || true
So if you want to apply the patch and make sure that's it's working:
(patch -p0 --forward < patches/patch-babylonjs.diff || true) && echo OK
No matter whether the patch has already been applied or not, you'll always get "OK" displayed here.
答案 3 :(得分:0)
接受的答案对我不起作用,因为补丁也针对其他类型的错误(可能是不同的版本或其他)也返回1。 因此,如果发生错误,我将检查“跳过补丁”消息的输出以忽略此类消息,但在其他问题上返回错误。
OUT="$(patch -p0 --forward < FILENAME)" || echo "${OUT}" | grep "Skipping patch" -q || (echo "$OUT" && false);