藤原です。
先日、Mercurial の障害管理宛に『"hg annotate" の結果が期待するリビ
ジョンと異なる』という以下の障害が報告されました。
http://bz.selenic.com/show_bug.cgi?id=4060原因を調査したところ、以下のような問題であることが判明しました。
- "hg annotate" の内部処理は、"hg diff" と共通の差分算出処理を使用
- 問題の原因と思しきリビジョン(マージを実施)では、親リビジョン
(第2親側)との "hg diff" の結果が期待と異なる
- 想定外の行が、当該リビジョンで変更されたものとみなされる
根本的には、"hg diff" で使用している差分算出アルゴリズム (Python
標準の difflib と同等) に由来する問題ということになるのですが、仮
にアルゴリズムを変更したとしても:
- 差分算出処理に『絶対』の解は無い
差分量/読み易さ等の間でのトレードオフになる
- 差分ベースで annotate している限りは、問題発生ケースが変わるだけ
ということから、この障害報告自体は『対処しない』ことになりました。
多くの場合で "hg annotate" 結果は期待通りになるとは思いますが、稀
に期待と異なる可能性がありますので、変更の由来リビジョンを『確実に』
特定したい場合は、"hg grep --all" 等と併用するようにしてください。
なお、"hg grep" も Python 標準の difflib 機能を使っているの
で、--all 無しだと期待するリビジョンを表示する前に終了してしまう可
能性がありますので、ご注意ください。
ちなみに、差分ベースで annotate を算出している限りは、Mercurial に
限らず同様の問題が発生する筈なのですが、他の SCM ツールの
annotate 実装はどうなっているのかな?