Python 在Hg扩展中重载pull命令

Python 在Hg扩展中重载pull命令,python,mercurial,mercurial-extension,Python,Mercurial,Mercurial Extension,我正在调试Mercurial扩展。此扩展添加了一些在执行pull时应该执行的代码。原始作者通过更改存储库对象的类来设置此钩子 以下是相关代码(实际上是一个有效的Mercurial扩展): 当我在启用此扩展的情况下执行hg pull时,输出如下: # hg pull reposetup called repo is local pulling from ssh://hgbox/myrepo reposetup called searching for changes no changes foun

我正在调试Mercurial扩展。此扩展添加了一些在执行
pull
时应该执行的代码。原始作者通过更改存储库对象的类来设置此钩子

以下是相关代码(实际上是一个有效的Mercurial扩展):

当我在启用此扩展的情况下执行
hg pull
时,输出如下:

# hg pull
reposetup called
repo is local
pulling from ssh://hgbox/myrepo
reposetup called
searching for changes
no changes found
这是在
pull
命令中插入扩展代码的合理方法吗?为什么“pull called”语句从未达到

我将Windows 7上的Mercurial 3.4.1与python 2.7.5一起使用。

根据代码(
Mercurial/extensions.py
),这是扩展存储库对象()的唯一合理方法

但是,我查看了代码,
localrepo
对象此时似乎没有
pull
方法,因此我怀疑这就是为什么“pull called”print语句从未出现的原因——没有调用它,因为它不应该存在

有更好的方法将代码注入pull,这取决于您试图完成的任务。例如,如果您只是想在发出拉取时运行某个操作,则更愿意包装exchange.pull函数:

extensions.wrapfunction(exchange, 'pull', my_pull_function)
对于您的特定用例,我建议使用以下代码创建一个方法:

def expull(orig, repo, remote, *args, **kwargs):
    transferprojrc(repo.ui, repo, remote)
    return orig(repo, remote, *args, **kwargs)
在extsetup方法中,添加如下行:

extensions.wrapfunction(exchange, 'pull', expull)

最后,在reposetup方法中,您可以完全删除projrcrepo类内容。希望这能让你得到你想要的行为

谢谢你的回答。我正试图使用您的建议修改代码,但到目前为止没有成功(我不是python开发人员,有时会有点不知所措)。事实上,我试图完成的是使
projrc
扩展工作。我提交了关于我的问题的描述,但由于没有得到反馈,我正试图自己修复它(显然是在SO的帮助下!)。我查看了mercurial的代码,在localrepo类中没有看到任何pull方法,这可能比我第一次猜测更好地解释了为什么代码没有运行。现在我知道你想要完成什么,我会用一些更具体的想法更新我的答案。谢谢你的跟进。我能够按照您的建议使用
exchange::pull
,从而使其正常工作。我为Projrc项目创建了一个。你介意看一下我的差异,告诉我你觉得可以吗?我看了一下,我觉得很好。
extensions.wrapfunction(exchange, 'pull', expull)