TortoiseBazaarのステータスキャッシュについて
何だかんだで10日目です。だいぶネタ切れぎみですが、行けるところまで行きましょう。
TortoiseBazaarでは、tbzrcache.exeという常駐プロセスが作業ツリー内の各ファイルの状態をキャッシュしていて、Explorerなどからの問い合わせに対して応答しています。
このステータスキャッシュの今の仕組みとその問題点、次のバージョンでどのように変わる(予定)かを、簡単に説明します。
別に技術的に高度なことをしてるわけではないので、そっち方面での期待はナシの方向で。
今の仕組み
- 最初に作業ツリー内のファイルに対してステータスの問い合わせがあった時に、作業ツリー全体のステータスのチェックを(非同期で)実行します。ステータスのチェックが完了するまでは、"PROGRESS"(?アイコンに対応)というステータスを返します。
- ステータスのチェックと一緒に、作業コピー内のファイルの更新監視も開始します。
- ファイルの更新を検出したら、そのファイルのステータスを再チェックします。変更されたファイルの数がある閾値を超えたら、個々のファイルのステータスをチェックするのはやめてツリー全体を再チェックします。
- HEADのリビジョンが変わったことを検出したら、ツリー全体を再チェックします。
- コンテキストメニューからBazaarの更新系コマンドが呼び出された場合は、コマンド終了後にツリー全体を再チェックします。
この仕組みは、作業ツリー内のファイル数が多い場合に、少しでもステータスチェックの負荷を下げるためのものですが、
以下のような問題点があります。
コマンドラインやBazaar Explorerからコマンドが実行された時に、変更が検出されない場合がある。
たいていの更新系のコマンドは、ファイルの更新かHEADの移動かのどちらかを伴うので検出できるのですが、そのどちらも伴わないコマンドについては、検出できません。例えば、以下のようなものです。
- bzr add (ファイルの追加)
- bzr remove --keep (ファイルをバージョン管理から外すが、作業ツリー上のファイルはそのまま残す)
- bzr move --after (ファイルを手で移動した後で、bzr管理上も移動したことにする)
- bzr revert (作業ツリーを元に戻す。変更内容が「追加」とかだったらファイルの更新は発生しない)
これが、「TortoiseBazaarのアイコンが嘘をつく」原因になります。
コンテキストメニューから更新系のコマンドを起動した場合、なにもせずにキャンセルしても作業ツリー全体の再チェックが実行されてしまう。
ステータスが更新されたかどうかをコマンドの戻り値などで確認できない(例えば、コミットダイアログの場合、同じ画面でadd、revert、moveなどの操作もできるため、コミット自体がキャンセルされたとしてもステータスが更新されていないとは限りません。)
そこで、次のバージョンでは、以下のような仕組みに変える予定です。
新しい仕組み
- 最初に作業ツリー内のファイルに対してステータスの問い合わせがあった時に、作業ツリー全体のステータスのチェックを(非同期で)実行します。ステータスのチェックが完了するまでは、"PROGRESS"(?アイコンに対応)というステータスを返します。
- ステータスのチェックと一緒に、作業コピー内のファイルの更新監視も開始します。同時に、.bzr/checkout/dirstate というファイルの更新も監視します。
- ファイルの更新を検出したら、そのファイルのステータスを再チェックします。変更されたファイルの数がある閾値を超えたら、個々のファイルのステータスをチェックするのはやめてツリー全体を再チェックします。
- .bzr/checkout/dirstate が変更されたことを検出したら、ツリー全体を再チェックします。
コンテキストメニューからBazaarの更新系コマンドが呼び出された場合は、コマンド終了後にツリー全体を再チェックします。コマンド終了時のステータスチェックは廃止します。
.bzr/checkout/dirstate というのは作業ツリーの状態を記録しているファイルで、このファイルの更新を監視すればBazaar側の状態変化はキャッチできるはずで、今までよりも高い精度でステータスの取得ができるようになります。
あまりBazaar本体の内部実装に依存した処理にはしたくなかったので、今までは避けてたんですが、今回思い立って実装してみました。次のバージョンでは、アイコンのオーバーレイが今よりも快適になるはずです。
※のんびりしてる間にbzr2.5 beta4が出てしまったので、もし間に合わなかったらごめんなさい m(_ _)m