跳过已应用的补丁时使“补丁”返回 0

Posted

技术标签:

【中文标题】跳过已应用的补丁时使“补丁”返回 0【英文标题】:Make `patch` return 0 when skipping an already applied patch 【发布时间】:2014-04-30 18:23:36 【问题描述】:

我有一个运行补丁命令的构建工具,如果补丁命令返回非零,它将导致构建失败。我正在应用一个可能已经应用也可能尚未应用的补丁,所以我使用-N 选项到patch,它应该跳过。但是,当它跳过时,patch 返回非零值。有没有办法强制它返回 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

这个配方循环依赖(在我的例子中是补丁文件)并为每个调用补丁。我所依赖的“技巧”是,如果补丁已经应用,则补丁返回 1,而其他错误(例如不存在的补丁文件)则返回其他更高的数字。补丁手册条目的 DIAGNOSTICS 部分描述了返回码情况。 YMMV

【讨论】:

这让我觉得 patch 的 CLI 中存在令人头疼的缺陷。我遇到这个的原因是因为我有另一个工具,而不是运行补丁并使用它的返回码(0 与非零)来确定它是成功还是失败。感谢您的回答,我将使用此脚本而不是 patch 作为补丁命令。不过,奇怪的是他们没有为此提供开关。【参考方案2】:

已接受的答案对我不起作用,因为补丁在其他类型的错误(可能是不同的版本或某事)上也返回 1。 因此,如果出现错误,我会检查“跳过补丁”消息的输出以忽略此类但在其他问题上返回错误。

OUT="$(patch -p0 --forward < FILENAME)" || echo "$OUT" | grep "Skipping patch" -q || (echo "$OUT" && false);

【讨论】:

【参考方案3】:

你也可以只用一行来做

patch -p0 --forward < patches/patch-babylonjs.diff || true

所以如果你想应用补丁并确保它正在工作:

(patch -p0 --forward < patches/patch-babylonjs.diff || true) && echo OK

无论补丁是否已经应用,这里总是显示“OK”。

【讨论】:

如果补丁尚未应用并且也无法应用,这仍会说OK 但是第一个例子效果很好。退出代码为 0,如果已应用补丁,则显示“检测到反向(或以前应用)的补丁!正在跳过补丁。”【参考方案4】:

下面是一个脚本,它从@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"

【讨论】:

以上是关于跳过已应用的补丁时使“补丁”返回 0的主要内容,如果未能解决你的问题,请参考以下文章

如何将补丁应用于 Richfaces 4.0.0.Final

是连续应用 oracle OBIEE 捆绑补丁还是只应用最新的

Weblogic12.1.3.0补丁安装(win server与linux安装步骤介绍)

关于Oracle 10.2.0.5 版本应用SCN补丁14121009相关问题

突出重围:Oracle 10.2.0.5应用SCN补丁解决DB Link预警实践

如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?