使用Python钩子自动化ReviewBoard和Mercurial的审查请求
这是我的问题:
我有一个远程的Mercurial代码库,我需要在这个代码库里设置一个钩子(hook),可以是incoming或者changegroup。同时,我在另一台服务器上设置了ReviewBoard。我的想法是,当开发者把代码推送到远程代码库时,自动生成代码审查请求的票据。
当然,我需要一个钩子来调用post-review,并且这个钩子需要使用一个叫做submit-as的用户,这个用户是通过Mercurial的API提取出来的(ctx.user()),否则所有的审查请求票据都会以连接远程代码库的用户的名义出现。
我主要的困扰是如何获取开始的版本和结束的版本。如果我使用incoming,我会得到所有的变更集节点,但钩子每次都会被调用,所以每次调用之间没有状态保持。另一方面,如果我使用changegroup,我只能得到第一个变更集,无法进行比较。为了比较,我还需要一种方法来保持之前的版本,以便发送给post-review,基本上是这样的:
post-review --revision-range=previoustip:newtip --submit-as=ctx.user()
如果你有任何解决这个问题的想法,我会很高兴。我显然是在用Python写这个钩子。
1 个回答
7
我不太确定这是否正是你需要的,但这是我在类似情况下用来检查提交信息的方法。它需要检查每一个更改,并根据用户的信息进行验证。就像我需要检查这个更改列表是针对哪个用户的,而不是“推送”的用户。
其实,构建某个特定用户的更改集合,以及在处理更改组时的开始和结束版本,这个过程应该相对简单。
返回值是因为它被用作一个预处理的钩子。
def checkAllCommitMessage(ui, repo, node, **kwargs):
"""
Checks all inbound changeset messages from a push for adherence to the commit message rules.
"""
# for each change being submitted
# get all the details, and call the trigger
fail = False
for rev in xrange(repo[node].rev(), len(repo)):
# get context (change)
ctx = repo[rev]
# user who commited the change (NOT necessarily the one who is doing push)
user = ctx.user()
# do the hook stuff here...
# set fail to True if something goes wrong
return fail