在mercurial中使用钩子与包装命令
使用钩子与使用为特定任务包装命令的扩展相比,有哪些相对的优点和缺点 换句话说,决定是使用钩子还是包装命令的标准是什么 还请列出一种方法是唯一选择的情况。我能想到的一种情况是为现有命令添加新参数。您还可以更改/删除参数,例如,我将默认的在mercurial中使用钩子与包装命令,mercurial,mercurial-hook,Mercurial,Mercurial Hook,使用钩子与使用为特定任务包装命令的扩展相比,有哪些相对的优点和缺点 换句话说,决定是使用钩子还是包装命令的标准是什么 还请列出一种方法是唯一选择的情况。我能想到的一种情况是为现有命令添加新参数。您还可以更改/删除参数,例如,我将默认的log更改为log-g,但是graphlog会在存在一些“不兼容”参数时中止(请参见graphlog.check\u unsupported\u标志),因此在这些情况下,我添加了log包装来删除-g,因为强迫堕胎是危害人类的罪行 感觉钩子更干净。Python钩子在h
log
更改为log-g
,但是graphlog
会在存在一些“不兼容”参数时中止(请参见graphlog.check\u unsupported\u标志
),因此在这些情况下,我添加了log
包装来删除-g
,因为强迫堕胎是危害人类的罪行
感觉钩子更干净。Python钩子在hg进程中运行,因此没有性能问题。虽然使用extensions.wrapcommand
创建命令包装器很容易,但创建/禁用挂钩以及调整应用它们的顺序(它们首先应该是自包含的)却很简单
这里有一段引用,推荐标准钩子优于前/后命令钩子,但它也适用于包装器上的钩子:
。。。像“commit”这样的钩子将在生成commit(例如标记)的所有上下文中被调用,而不仅仅是commit命令
另外,我猜钩子不受GPL的约束(或者它们是否受GPL约束?),而命令包装器则受GPL约束
(我希望1.5k+用户可以创建一个
mercurialhooks
标签。Git粉丝们用githooks
击败了我们)我不能谈论许可问题,但钩子和扩展之间最大的区别是钩子可以用任何语言编写,而扩展总是python
如果是用python编写的,那么钩子和扩展之间没有什么区别:
- 两者都可以深入研究反复无常的内部结构
- 两者都要求用户修改其
以启用它们.hgrc
- 两者都可以换行/截取命令
pre-log
hook来完成
TL;DR:如果您是用python编写的,则没有什么区别,如果您不是,则挂钩是您唯一的选择。重新标记,但稍微更改了名称以符合约定。@Niall:谢谢!我猜git男孩不太关心惯例:)谢谢(对我来说)重要的区别。但是如何删除钩子中的命令参数呢?我尝试了这样一个日志前钩子:
def-prelogHook(ui,repo,**kwargs):print-kwargs
,当我将log
默认为log-g
时,它只显示{args':'log',hooktype':'pre-log'}
。我不确定它们在哪里,但我怀疑有一个通过ui对象指向它们的引用路径。在shell钩子中,您只需检查$HG\u OPTS
中是否存在不兼容的选项,如果找到了-g
,然后使用新的参数集重新运行HG log
命令,然后返回-1。不完全优雅,但完全从外部挂钩实现目标。