現在の変更セット内のすべてのファイルのリストを取得するための次のコードがあります。
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 はこれら 2 種類のファイルの違いを実際に認識しているのでmercurial/cmdutil.py
、mercurial リポジトリからコードをチェックアウトしたところ、次のコードが見つかりました。
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])
しかし問題は、pre-commit フックでは、すべてのファイルが変更済みとしてマークされていることです。これが意図的なものなのかバグなのかはわかりません。
OK、次に試したのは の代わりにpretxncommit
orcommit
フックを使用することでしprecommit
たが、この場合、ctx にはmodified
, added
andremoved
メソッドがまったくありません。
問題は、変更されたファイルと precommit フックでコミットされるファイルをどのように区別するかということです。