我有以下代码用于获取当前变更集中所有文件的列表:
def changesets(repo, node):
if node == None:
yield repo[None]
else:
for rev in xrange(repo[node].rev(), len(repo)):
yield repo[rev]
def files(repo, node):
for ctx in changesets(repo, node):
for filename in ctx.files():
...
但事实证明,在changeset.files()中会返回所有已更改的文件,而不仅仅是那些标记为已提交的文件。
当然,Mercurial实际上知道这两种文件之间的区别,所以我从mercurial repo检查了mercurial/cmdutil.py
中的代码,并找到了这段代码:
modified, added, removed = ctx.modified(), ctx.added(), ctx.removed()
...
edittext.extend([_("HG: added %s") % f for f in added])
edittext.extend([_("HG: changed %s") % f for f in modified])
edittext.extend([_("HG: removed %s") % f for f in removed])
但事实是,在预提交挂钩中,所有文件都被标记为已修改,不确定这是故意还是错误。
好的,接下来我尝试的是使用pretxncommit
或commit
挂钩代替precommit
,但在这种情况下,ctx没有modified
,{ {1}}和added
方法。
所以,问题是:如何区分已更改的文件和将在预提交钩子中提交的文件?