如何管理'.hg /'状态目录中的钩子特定文件?

时间:2011-10-04 16:03:43

标签: python mercurial mercurial-hook mercurial-api

我正在使用Mercurial API的本机Python实现编写一系列changegroup和commit hooks。部分原因是我需要保存特定于我的钩子的某些信息,例如我的钩子实际看到的最后一个修订版ID。

我想以一种方式执行此操作,其中所有外部元数据都保存在存储库中,但实际上未跟踪或忽略。我想确保这些数据永远不会成为历史的一部分。

我的第一个想法是使用现有的.hg/hgrc配置,因为我只需要存储简单的字符串和整数,这就是我的钩子当前使用的少数配置行。 API提供了一种通过ui.config*读取此配置的简便方法,但似乎没有提供实际更改或写入的方法。

我很容易获得配置列表,添加或修改它然后使用配置模块编写它,但我真的觉得我可能会忽略API提供的东西。我一直在想“如果在成熟的API中没有明显的方法可以做到这一点,我可能会以错误的方式解决这个问题。

是否有'正确'的方法来执行此操作,可能使用API​​?或者,也许我在API中没有找到的东西来管理这类数据而不使用hgrc?我主要担心的是多人同时推动的比赛。

1 个答案:

答案 0 :(得分:5)

hgrc配置文件是有意的只读文件,没有内部API可以写入这些文件。此规则的唯一例外是clone会创建包含克隆源URL的默认.hg / hgrc。所以,不,不要试图使用它。

执行此类操作的常用方法是只读取和编写自己的私有文件。 Mercurial本身拥有此命名空间并以有机,向后兼容的方式增加其内容,因此您最好的选择是选择一个不太可能与其他任何人碰撞的子目录名称或任何未来的Mercurial功能并将您的文件存储在那里。建议使用基于文本的方式。

为方便起见,repo对象包含工作状态空间(.hg /,repo.wopener())中受repo.wlock()保护的文件和存储库存储中文件的开启方法(.hg / store /,repo.sopener())受repo.lock()保护。

也可以进行原子文件写入:

f = self.wopener("mydata", "w", atomictemp=True)
f.write(somedata)
f.close()

请务必阅读此内容:

https://www.mercurial-scm.org/wiki/LockingDesign