Mercurial 2.3 版での内部 API 変更による 3rd party エクステンションのトラブル
Mercurial 2.3 では、幾つかの内部 API の仕様が変更されたことで、3rd party エクステンションの中には、正常に動作しないものがあります。
現状、私が情報を把握しているものは以下のものです。
- hggit (※ 修正済み)
- hgsubversion (※ 修正済み)
- projrc (※ 修正済み)
- collapse
- (rdiff も ?)
『※ 修正済み』表記のあるものは、既に 2.3 API に対応した版が公開されているものです。これらを併用されている方は、速やかに最新版に更新してください。
また、上記で列挙したエクステンション以外で、同様の、あるいは現象は違うけれども、2.3 での API 仕様変更の影響が疑われる現象を見かけた際には、以下のような手段で連絡頂けると助かります。
- 本ブログエントリへのトラックバック/コメント
- 私宛のツイート
- #mercurialjp ハッシュタグ付きのツイート
- 日本語 ML への投函
エラー発生例
以下に、API 仕様変更に起因するエラーにおけるエラー出力例を示します。
なお、実装上発生が想定されているエラーに関しては、簡単なエラーメッセージが出力されて終了してしまいますが、--traceback オプション付きで実行することで、エラー発生時の呼び出しスタックが表示されます。
2.3 版に追従してない hggit や hgsubversion でのエラーでは、以下のような呼び出しスタックでエラーが発生します。
File "xxxx/mercurial/demandimport.py", line 86, in __getattribute__ File "xxxx/mercurial/demandimport.py", line 58, in _load ImportError: No module named repo
2.3 版に追従していない collapse におけるエラー時呼び出しスタックは以下のようになります。
File "xxxxx/mercurial/revlog.py", line 370, in descendants first = min(revs) TypeError: 'int' object is not iterable
mercurial/revlog.py で定義される ancestors() の API も 2.3 契機で変更されているので、ancestors() 絡みでエラーが発生する可能性もあります (エラーの種別等は異なりますが…)。
# "descendant" は『子孫』、"ancestor" は『祖先』の意味
また、私自身はエラー情報を入手できていませんが、以下のようなエラーが発生するケースもあると思われます。
AttributeError: 'xxxx' object has no attribute 'yyyyy'
簡易修正
"ImportError: No module named repo" エラーが発生しているケースでは:
などがあります。
単純な "import repo" 除外で済むだけなら簡単なのですが、それ以外のケースに関しては、『これこれこうやればOK』的なクイックハックの提示はできないので、これらのケースに遭遇した場合は、個別にお知らせください。
descendants() ないし ancestors() 呼び出しでエラーが発生しているケースでは:
# 旧 changelog.descendants(*revs) # 新 changelog.descendants(revs)
あるいは:
# 旧 changelog.descendants(rev) # 新 changelog.descendants([rev])
で対処可能な筈です。
"AttributeError: 'xxxx' object has no attribute 'yyyyy'" が発生しているケースでは、内部オブジェクト取得操作を追加する必要があります。