このページは BisectExtension の日本語訳です。

Bisect エクステンション (hbisect)

Mercurial 1.0 で bisect はビルトインコマンドになりました。 (UpgradeNotes 参照)

作者: Benoit Benissot

1. 概要

このエクステンション(hbisect)は、二分探索(O(log(n)))を用いてバグ探しの手間を軽減します。エクステンションは bisect コマンドを追加します。

このコマンドは GIT に由来します。動作は至って単純です: bisect は、正しいと分かっている(つまりバグの無い)最初のリビジョンと、ダメなことが分かっている(つまりバグっている)最後のリビジョンを受け取ります。 bisect エクステンションは正常なものとダメなものの中間のリビジョンを出力しますので、あなたはそれをテストします。 そのリビジョンが正常であれば、 hg bisect good コマンドで good と記録し、そうでなければ hg bisect bad で bad と記録します。いずれの場合も bisect は次テストする(good と bad の中間)リビジョンを出力します。この手順をリビジョンが 1 つになるまで、つまり、問題の原因に行き着くまで繰り返します。

2. 設定

まず、 $HOME/.hgrc に以下の行を追加し、エクステンションを有効にします (この手順は Mercurial 1.0 で 不要 になりました):

[extensions]
hgext.hbisect=

以上で bisect コマンドが利用可能になります:

$ hg bisect help
list of subcommands for the bisect extension

 bad     mark revision as bad and update to the next revision to test
 good    mark revision as good and update to the next revision to test
 help    show help for a given bisect subcommand or all subcommands
 init    start a new bisection
 next    find and update to the next revision to test
 reset   finish a bisection

Mercurial 1.0 で bisect はビルトインコマンドになりました:

$ hg help bisect
hg bisect [-gbsr] [-c CMD] [REV]

リビジョンの分割探索

    問題発生契機となるリビジョンの特定を補助します。使用開始の際には、
    問題が発生する既知のリビジョンのうち、最古のものを bad とマークし、
    問題が発生しない既知のリビジョンのうち、最新のものを good とマーク
    します。本コマンドは、検証対象リビジョンで作業領域を更新します(-U/
    --noupdate 指定時除く)。当該リビジョンを検証したなら、bad あるいは
    good でマークしてください。本コマンドは、次の検証候補リビジョンで
    作業領域を更新するか、問題契機リビジョンを特定できた旨を出力します。

    てみじかな手順としては、作業領域を更新せずに、リビジョン指定を使用
    してリビジョンを good ないし bad にマークすることもできます。

    コマンドが指定された場合、自動的なリビジョン検証に使用されます。
    コマンドの終了コードはリビジョンに対する bad ないし good のマーク付け
    に使用されます。終了コード 0 は good、125 はスキップ、127(コマンドが
    見つからない場合)は分割探索中断、それ以外の 0 より大きい終了コードは
    bad のマーク付けとみなされます。

オプション:

 -r --reset     探索状態のリセット
 -g --good      対象リビジョンの探索状態を good 化
 -b --bad       対象リビジョンの探索状態を bad 化
 -s --skip      対象リビジョンの判定作業を省略
 -c --command   good/bad 判定用コマンド
 -U --noupdate  対象リビジョンによる作業領域内容の更新を抑止

グローバルオプションは "hg -v help bisect" で表示されます

3. 使い方

バグ探しを始める前に、まず bisect を初期化します:

$ hg bisect init

(訳注: Mercurial 1.0 以降は hg bisect --reset)

大抵 tip はバグっているので、そのリビジョンを bad と記録します:

$ hg bisect bad

(訳注: Mercurial 1.0 以降は hg bisect --bad)

次に正常と分かっているリビジョンを good と記録します:

$ hg bisect good ID-OF-KNOWN-GOOD
リビジョン 122:6df5bc5a4e5f を検証中(検証残 60、検証済み 6)

(訳注: Mercurial 1.0 以降は hg bisect --good ID-OF-KNOWN-GOOD)

上記コマンドは次テストするリビジョンを出力します。テストを行うごとにリビジョンを good と記録:

$ hg bisect good
リビジョン 150:81d1c36e3205 を検証中(検証残 15、検証済み 4)

(訳注: Mercurial 1.0 以降は hg bisect --good)

または bad と記録します:

$ hg bisect bad
リビジョン 143:f2a1d841d57e を検証中(検証残 3、検証済み 2)

(訳注: Mercurial 1.0 以降は hg bisect --bad)

原因が見つかるまで:

$ hg bisect bad
最初の bad なリビジョンは:
changeset:   142:f2a1d841d57e
user:        Sam Body <sam@example.org>
date:        Mon Oct 12 11:46:36 2009 +0900
summary:     blah blah ...


CategoryJapanese