对于脚本提交,应该如何处理 Mercurial 的 "nothing changed" 错误 ($? = 1)?

How should one deal with Mercurial's "nothing changed" error ($? = 1) for scripted commits?

我正在清理使用 Mercurial(版本 2.0.2)捕获状态并每小时自动提交所有更改的客户跟踪系统。我将它从 cron 迁移到 Rundeck,因此他们将获得状态 if/when 事情失败,这立即导致作业开始填充 Rundeck 因 "nothing changed" 错误而失败的作业。我立即去了Google,我很惊讶有人提出这个问题,但我没有找到答案。*

似乎三个应该是一个基本的、干净的 sh 或 bash 选项(但他们的命令行环境支持 Python 和必要时的 pip 模块)。

我对这类事情的回应是:

  1. 在发出正常情况下可能会失败的命令之前发出'correct'命令,然后命令失败实际上表示错误
  2. 阅读文档并使用错误代码来区分正在发生的事情,适当地实施响应**
  3. 执行 #1 或 #2 的一些变体,我在其中发出命令并 grep 输出***

* 我承认我很难搜索 hg material,部分原因是信息丰富,与 git 相似,以及我在 [=40= 中思考的坏习惯] 条款。话虽如此,我看到了问题所在,包括“[issue2341] hg commit returns error when nothing changed”。我没有找到对此的任何回复,也没有在 Whosebug 上找到相关讨论。

** 我在 https://www.selenic.com/mercurial/hg.1.html 看到 hg commit "Returns 0 on success, 1 if nothing changed." 不幸的是,我知道还有其他方法可以使提交失败。刚才,我创建了一个虚拟的 Mercurial (mq) 补丁并尝试提交,得到“abort: cannot commit over an applied mq patch”。在那种情况下,return 代码是 255。

*** 我想我可以发出初始提交并捕获错误代码、stdout 和 stderr;如果 return 为 1 且错误或继续,则处理文本。

我最初的解决方法(我提到的选项中我最不喜欢的)是添加一个 Rundeck 'error handler',一个响应错误而执行的命令。我的命令是:

hg commit -m "Automatic commit..." files 2>&1 | grep "nothing changed"  && echo "Ignoring 'nothing changed' error"

这与 'nothing changed' 重复,但仅当它是 'nothing changed' 错误时才抑制错误。丑陋,但如果没有更好的建议,还可以忍受...

提交前可以hg status | wc -l(或grep输出),只有工作目录有变化才提交

如果您想要一个仅在发生更改时提交的命令,请编写一个检查是否发生更改的命令。你可以做得更多 "elegantly" 把它写成一个简单的 bash 条件:

if [ -n "$(hg status -q)" ]
then
    hg commit -m "Automatic commit $(date)"
fi