如何在Mercurial进程内钩子中访问提交消息?

dav*_*avr 6 api mercurial commit-message pre-commit-hook

我一直在努力

def debug_hook(ui, repo, **kwargs):
    changectx = repo[None]
    ui.status('change.desc: %s\n' % changectx.description())
    return True
Run Code Online (Sandbox Code Playgroud)

但它总是打印一个空字符串.这是因为它是一个precommit钩子,而且消息还没有?或者我只是遗漏了一些明显的东西?

dav*_*avr 8

事实证明,我的初始方法存在两个问题:

  1. 正如jk所指出的,precommit事件发生在提交之前,因此正在处理的提交的元数据尚不存在.pretxncommit相反,通过使用元数据存在,但事务尚未提交到数据库.
  2. 使用changectx = repo[None]为您提供工作目录的更改上下文.但我们想要当前提交的信息,所以使用changectx = repo['tip']而不是给我们最新的元数据.

请注意,如果您使用changectx = repo['tip']precommit事件,您实际上将处理最后一次提交,而不是您正在处理的当前提交.

  • 这就是为什么在Stack Overflow上鼓励询问和回答您自己的问题.一年后,这个答案真的帮助了我,因为我正在浏览可用于HG API的[非常稀疏的文档](http://mercurial.selenic.com/wiki/MercurialApi). (2认同)

jk.*_*jk. 2

我认为你是对的,在预提交中该消息还不存在。如果您使用 pretxncommit ,它会,但我不能 100% 确定它允许您在此时执行什么操作,因为事务即将完成。