跳过已经应用的补丁时,使`patch`返回0

时间:2014-04-30 18:23:37

标签: patch

我有一个运行patch命令的构建工具,如果patch命令返回非零,则会导致构建失败。我正在应用可能已应用或可能尚未应用的修补程序,因此我使用-N选项patch,它会跳过它应该的状态。但是,当它跳过时,patch返回非零值。有没有办法强制它返回0,即使它跳过应用补丁?我无法从手册页中找到任何此类功能。

4 个答案:

答案 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);
相关问题