Bisect エクステンション (hbisect)
Contents
1. エクステンションについて
Mercurial 1.0 で bisect はビルトインコマンドになりました。 (UpgradeNotes と hg bisect を参照)
作者: Benoit Benissot
2. 概要
このエクステンション(hbisect)は、二分探索(O(log(n)))を用いてバグ探しの手間を軽減します。エクステンションは bisect コマンドを追加します。
このコマンドは Git に由来します。動作は至って単純です: bisect は、正しいと分かっている(つまりバグの無い)最初のリビジョンと、ダメなことが分かっている(つまりバグっている)最後のリビジョンを受け取ります。 bisect エクステンションは正常なものとダメなものの中間のリビジョンを出力しますので、あなたはそれをテストします。 そのリビジョンが正常であれば、 hg bisect good コマンドで good と記録し、そうでなければ hg bisect bad で bad と記録します。いずれの場合も bisect は次テストする(good と bad の中間)リビジョンを出力します。この手順をリビジョンが 1 つになるまで、つまり、問題の原因に行き着くまで繰り返します。
3. 設定
まず、 $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" で表示されます
4. 使い方
バグ探しを始める前に、まず 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 ...