如何使用预提交和hg传入阻止提交?

时间:2014-08-07 15:47:10

标签: mercurial mercurial-hook

有时,我的团队中的开发人员在投入自己之前忘记了其他开发人员的变更集(不可否认,我也这样做)。对于为期一周的项目,新提交会跳过树中可能会有数十个更改。当尝试推送时,hg使用新的远程头消息中止,然后他们拉动并合并所有这些新提交。我正在寻找的是一种简单的方法来测试在某人提交之前是否有任何新的更改,以及是否有必要阻止提交发生。理想情况下,会有一条明确的消息说明提交失败的原因。

这似乎对钩子来说应该很容易实现,但是预提交钩子将继续在状态代码0上,而hg传入将在没有更改时返回1。我需要做的只是反转hg传入命令的状态,但我找不到执行它的语法。我发现的大多数搜索结果都直接用于编写python钩子,但这对于这样一个简单的问题来说似乎有些过分。

我正在寻找类似的东西:

[hooks]
pre-commit != hg incoming
or
pre-commit = hg incoming == 0

我也不确定消息的去向。

3 个答案:

答案 0 :(得分:2)

Windows 上,您可以使用此命令检查传入的更改:

from scrapy import Selector

sel = Selector(text=html)
print sel.xpath('(//ul/li)').xpath('a/@href').extract()[-1]


'''
html
'''

</ul>
<li>
    <a href="/info/page/" rel="follow">
       <span class="page-numbers">
       35
       </span>
    </a>
</li>
<li>
    <a href="/info/page/" rel="follow">
        <span class="next">
        next page.
        </span>
   </a>
</li>
</ul>

如果发现新的更改,它将取消提交,您将需要拉(并可能合并)新的更改。

答案 1 :(得分:1)

你大概是对的,但是你错了:

[hooks]
precommit = ! hg incoming

钩子中没有可以取消提交的破折号。

但是,如果您将DVCS系统转变为人们无法在未连接到互联网的情况下提交的内容,您的同事就会将您串起来。 :)

答案 2 :(得分:0)

我通过重新阅读文档找到了解决方案:control if hook can proceed。我在哪里找到了grep命令。

[hooks]
precommit.comment = REM Don't forget to pull first!
precommit.test = hg incoming | grep -q "no changes found"

当开发人员提交失败时,他们可以检查输出日志并查看注释。不太漂亮,但大多数时候应该足够了。 -q阻止“找不到更改”出现在日志中,这在提交失败后会引起混淆。我添加了自己的扩展名.comment和.test,因此钩子以正确的顺序运行(c之前的c)。