如果您使用的是 Python 2,则希望使用hglib
.
如果您使用的是 Python 3,我不知道该使用什么,抱歉。大概hgapi
。
本回答内容
- Mercurial 的 API
- 如何使用 hglib
- 为什么 hglib 是 Python 2 用户的最佳选择
- 如果您正在编写一个钩子,那么不鼓励使用的内部接口非常方便
Mercurial 的 API
Mercurial 有两个官方 API。
- Mercurial 命令服务器。您可以使用由 Mercurial 团队维护的
hglib
( wiki , PyPI ) 包从 Python 2 与它对话。
- Mercurial 的命令行界面。您可以通过
subprocess
、 或或类似的方式与它hgapi
交谈。
如何使用 hglib
安装:
pip install python-hglib
用法:
import hglib
client = hglib.open("/path/to/repo")
commit = client.log("tip")
print commit.author
有关hglib wiki 页面的更多使用信息。
为什么 hglib 是 Python 2 用户的最佳选择
因为它是由 Mercurial 团队维护的,并且是 Mercurial 团队推荐的与 Mercurial 交互的方法。
来自 Mercurial 的 wiki,关于与 Mercurial 接口的以下声明:
对于绝大多数第三方代码,最好的方法是使用 Mercurial 已发布、文档化且稳定的 API:命令行界面。或者,使用CommandServer或基于它的库来获得快速、稳定、语言中立的界面。
从命令服务器页面:
[命令服务器允许] 第三方应用程序和库通过管道与 Mercurial 通信,从而消除了每个命令的启动开销。然后,库可以封装命令生成和解析,为这些命令提供适合语言的 API。
如前所述,Mercurial 命令服务器的 Python 接口是hglib
.
顺便说一句,命令行界面的每条命令开销可不是开玩笑的。我曾经构建了一个非常小的测试套件(只有大约 5 个测试),它使用hg
viasubprocess
来创建、逐个提交、少数 repos,例如合并情况。在整个项目中,套件的运行时间保持在 5 到 30 秒之间,几乎所有时间都花在了hg
调用上。
如果您正在编写一个钩子,那么不鼓励使用的内部接口非常方便
Python 钩子函数的签名是这样的:
# In the hgrc:
# [hooks]
# preupdate.my_hook = python:/path/to/file.py:my_hook
def my_hook(
ui, repo, hooktype,
... hook-specific args, find them in `hg help config` ...,
**kwargs)
ui
并且repo
是上述不鼓励的非官方内部 API的一部分。它们就在您的函数 args 中,这一事实使它们使用起来非常方便,例如在这个preupdate
不允许某些分支之间合并的钩子示例中。
def check_if_merge_is_allowed(ui, repo, hooktype, parent1, parent2, **kwargs):
from_ = repo[parent2].branch()
to_ = repo[parent1].branch()
...
# return True if the hook fails and the merge should not proceed.
If your hook code is not so important, and you're not publishing it, you might choose to use the discouraged unofficial internal API. If your hook is part of an extension that you're publishing, better use hglib
.