【问题标题】:Using hooks vs. wrapping commands in mercurial在 mercurial 中使用钩子与包装命令
【发布时间】:2010-10-05 03:03:24
【问题描述】:

使用钩子与使用为特定任务包装命令的扩展有哪些相对优缺点?

换句话说,决定是使用钩子还是包装命令的标准是什么?

还请列出一种方法是唯一选择的情况。我能想到的一种情况是为现有命令添加新参数。您还可以更改/删除参数,例如我默认 loglog -ggraphlog 在存在一些“不兼容”参数时中止(请参阅 graphlog.check_unsupported_flags),所以我添加了一个 log 包装器来删除-g 在这些情况下,因为强制堕胎是危害人类罪。

感觉钩子更干净利落。 Python 挂钩在 hg 进程中运行,因此不存在性能问题。虽然使用extensions.wrapcommand 创建命令包装器很容易,但创建/禁用钩子并调整它们的应用顺序(它们首先应该是独立的)是微不足道的。

这是来自hgrc doc 的引述,它建议使用标准挂钩而不是命令前/后挂钩,但它也适用于包装器上的挂钩:

...像“commit”这样的钩子将在所有生成提交(例如标签)的上下文中被调用,而不仅仅是提交命令。

另外我猜钩子不受 GPL 约束(或者它们是?),而 extensions are 中的命令包装器。

(我希望 1.5k+ 的用户可以创建一个 mercurialhooks 标签。Git 粉丝已经用 githooks 击败了我们。)

【问题讨论】:

  • 重新标记,但稍微更改了名称以符合惯例。
  • @Niall:谢谢!我猜 git 男孩不太关心约定 :)

标签: mercurial mercurial-hook


【解决方案1】:

我不能谈论许可问题,但钩子和扩展之间的最大区别是钩子可以用任何语言编写,而扩展始终是 python。

如果一个人用 python 编写,那么钩子和扩展之间几乎没有区别:

  • 两者都可以深入研究反复无常的内部结构
  • 两者都需要用户修改其.hgrc 才能启用它们
  • 两者都可以包装/拦截命令

我认为除了作为扩展完成之外,您还可以使用pre-log 挂钩来修改日志命令参数。

TL;DR:如果您使用 python 编写,则几乎没有区别,如果您不是钩子,则是您唯一的选择。

【讨论】:

  • 感谢重要但明显的(对我而言)差异。但是如何删除钩子中的命令参数?我尝试了这样的日志前挂钩:def prelogHook(ui, repo, **kwargs): print kwargs,当我默认loglog -g 时,它只显示{'args': 'log', 'hooktype': 'pre-log'}
  • 我不确定在哪里,但我怀疑有一个通过 ui 对象指向它们的引用路径。在 shell 钩子中,您可以检查 $HG_OPTS 是否有不兼容的选项,如果找到它们,请删除 -g,然后使用新的 arg-set 重新运行 hg log 命令,然后返回 -1。不是完全优雅,而是从完全外部的钩子中实现目标。
猜你喜欢
  • 2012-02-16
  • 2012-06-11
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多