如何用Python编写Mercurial钩子防止未指定文件提交
解决Mercurial全局提交确认钩子的问题
核心方案:用Mercurial内置的ui.cmdargs获取提交参数
不用折腾sys.argv或者环境变量,Mercurial的钩子函数里可以直接通过ui对象的cmdargs属性拿到用户在hg commit之后输入的所有参数——也就是指定的文件/路径列表。如果这个列表为空,就说明用户执行的是全局提交。
完整钩子实现示例
- 在仓库的
.hg/hgrc中添加钩子配置:
[hooks] pre-commit = python:hooks.check_global_commit
- 在仓库的
.hg/hooks.py中编写钩子函数(没有这个文件就新建):
def check_global_commit(ui, repo, **kwargs): # 检查是否有指定提交文件 if not ui.cmdargs: # 询问用户确认 confirm = ui.prompt("你正在执行全局提交,是否继续?(y/N)", default='N') if confirm.strip().lower() != 'y': ui.warn("提交已取消\n") # 返回非0值阻止提交 return 1 # 允许提交 return 0
关键细节说明
ui.cmdargs:直接返回hg commit命令后的所有参数,已经过滤掉了hg、commit本身,仅保留用户指定的文件/路径,比sys.argv更精准。ui.prompt():Mercurial内置的交互方法,能在命令行和其他Mercurial支持的环境中正常工作,比自己用input()更兼容。- 返回值:钩子函数返回0表示允许提交,非0值会直接阻止提交。
关于Mercurial API文档
Mercurial的内置API可以通过命令行查看:hg help api,里面会列出ui、repo等核心对象的可用方法和属性。另外也可以直接查看Mercurial源码中的对应模块(比如mercurial/ui.py),源码里的注释会更详细。
内容的提问来源于stack exchange,提问作者Le Laboureur
相关产品推荐
相关产品推荐

