彷徨えるフジワラ

年がら年中さまよってます

Mercurial 2.3 版での内部 API 変更による 3rd party エクステンションのトラブル

Mercurial 2.3 では、幾つかの内部 API の仕様が変更されたことで、3rd party エクステンションの中には、正常に動作しないものがあります

現状、私が情報を把握しているものは以下のものです。

  • hggit (※ 修正済み)
  • hgsubversion (※ 修正済み)
  • projrc (※ 修正済み)
  • collapse
  • (rdiff も ?)

『※ 修正済み』表記のあるものは、既に 2.3 API に対応した版が公開されているものです。これらを併用されている方は、速やかに最新版に更新してください。

また、上記で列挙したエクステンション以外で、同様の、あるいは現象は違うけれども、2.3 での API 仕様変更の影響が疑われる現象を見かけた際には、以下のような手段で連絡頂けると助かります。

エラー発生例

以下に、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" エラーが発生しているケースでは:

  • 単純に repo を import している処理を除外すれば動作するケース、
  • repo で定義されているクラスをベースに派生クラス定義やインスタンス生成が必要なケース (修正例1修正例2)

などがあります。

単純な "import repo" 除外で済むだけなら簡単なのですが、それ以外のケースに関しては、『これこれこうやればOK』的なクイックハックの提示はできないので、これらのケースに遭遇した場合は、個別にお知らせください。

descendants() ないし ancestors() 呼び出しでエラーが発生しているケースでは:

    # 旧
    changelog.descendants(*revs)

    # 新
    changelog.descendants(revs)

あるいは:

    # 旧
    changelog.descendants(rev)

    # 新
    changelog.descendants([rev])

で対処可能な筈です。

"AttributeError: 'xxxx' object has no attribute 'yyyyy'" が発生しているケースでは、内部オブジェクト取得操作を追加する必要があります。