使用Python钩子自动化ReviewBoard和Mercurial的审查请求

2 投票
1 回答
1495 浏览
提问于 2025-04-17 03:48

这是我的问题:

我有一个远程的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

撰写回答