PythonベースインストールしたBazaarでTortoiseBzrを動かす。

Windowsの場合、スタンドアロンexeとして動作するBazaarか、Python.exeスクリプトとして動作するBazaarかのどちらを選択できます。
手軽なのはスタンドアロンexeの方で、インストーラを実行するだけで基本的な機能と主要なプラグインGUIクライアントなど一通り使えるようになります。
それとくらべるとPythonスクリプト版の方は色々と面倒はありますが、別のプログラムからBazaarのPython APIを利用できたり、Apache上でBazaarのサーバをホストできるようになるなど、色々とメリットもあります。

Pythonスクリプト版のBazaarを動作させるための手順は、 WindowsでBazaarをビルドするためのメモ - wonderful_pandaの日記 にまとめてあります。

ただ、Pythonスクリプト版の場合、TortoiseBzrがそのままでは動作しません。これを動くようにするためにいくつかのステップがあるので、それを説明します。

事前準備

WindowsでBazaarをビルドするためのメモ - wonderful_pandaの日記を参考にして、Bazaar本体と、qbzr、bzr-explorerのセットアップをしておきます。
また、TortoiseOverlaysというコンポーネントもインストールする必要があるので、以下のURLからインストーラをダウンロードして、インストールします。(かわりに、TortoiseSVNかTortoiseHgがインストールするという手もあります。このどちらかがインストールされていれば、TortoiseOverlaysも一緒にインストールされているはずです。)
http://tortoisesvn.tigris.org/source/browse/tortoisesvn/TortoiseOverlays/

ソースの取得

Launchpadから、TortoiseBzrのソースを取得します。

$ bzr branch lp:tortoisebzr tortoisebzr

Pythonモジュールのビルド

取得したtortoisebzrフォルダで、以下のコマンドを実行します。

$ python setup.py build_mo build_res build_ui

実行環境の準備

TortoiseBzrが動作する環境を作るためには、環境変数PYTHONPATHにダウンロードしたtortoisebzrフォルダのパスを設定する必要があります。
システムの環境変数に設定したくない場合は、以下のようにvirtualenvを使う方法などもあります。(Bazaar自体をSandBoxにインストールすることも可能です)

  1. virtualenvがインストールされていなければ、インストールする
    $ easy_install virtualenv
  2. TortoiseBzr実行用のPython環境(SandBox)を作る
    $ virtualenv path\to\sandbox --system-site-packages
  3. path\to\sandbox\Lib\site-packages フォルダに、sitecustomize.pyというファイルを作成し、以下の内容を記述する。
import os, sys
# PYTHONPATHにtortoisebzrのフォルダを追加
sys.path[1:1] = [r'path\to\tortoisebzr']
# その他、環境変数を設定したければ以下の要領で追記
os.environ["BZR_PLUGIN_PATH"] = r'path\to\bazaar\plugin\dir'
os.environ["HTTP_PROXY"] = r'http://proxy.exsample.com:8080'
os.environ["HTTPS_PROXY"] = r'https://proxy.exsample.com:8080'

Bazaarの本体(bzrlib)と同じ階層に、(通常は、$PYTHONHOME\Lib\site-packages)Bazaarのアイコンを"bzr.ico"という名前で置きます。アイコンは、ここからダウンロードしてください。
http://wiki.bazaar.canonical.com/LogoOptions?action=AttachFile&do=view&target=bazaar.ico
bazaar.confと同じフォルダに、tbzr.confというファイルを作成し、以下の内容を記述します。
※bazaar.confのありかは、bzr versionコマンドで確認することができます。

# virtualenvを使った場合は、SandBox内のpython.exeのパスを指定してください。
[tbzrcache]
command_prefix = path\to\python\exe path\to\tortoisebzr\scripts\tbzrcache.py

Shell Extensionのビルド

TortoiseBzrのShellエクステンションをビルドするためには、Visual Studio 2008が必要です(フリーのExpress Editionで構いません)。ここからダウンロードして、インストールしてください。
http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

shellext\tbzrshellext.slnをオープンして、Releaseでビルドします。
shellext\build\tbzrshellext_x86.dllというファイルが作成されるので、このファイルをレジストリに登録します。
Vista、7の場合は「管理者として実行」で実行する必要があるので注意してください。

$ regedit path\to\tbzrshellext_x86.dll
これで、ログオフしてログインしなおせば、TortoiseBzrが動くようになっているはずです。

既知の問題とその回避策

エクスプローラコンテキストメニューからBazaar Explorerを起動することができますが、Pythonスクリプト版でTortoiseBzrを動かす場合には、Bazaar Explorerの一部機能が正しく動きません。(Bazaar Explorerから、コミットや差分表示などを行うと、処理終了後に「Bad file descriptor」というエラーが発生してしまいます。)
(真面目に修正しようと思うとBazaar Explorer側で修正が必要になりそうなのですが、Pythonスクリプト版でTortoiseBzrを動かす人がそもそもほとんどいないので、とりあえず放置しています ^^;)

以下のような内容のスクリプトプラグインとして配置することで、このエラーを解消することができるので、参考にしてください。

import sys
if getattr(sys.stdout, "fileno", lambda: -1)() < 0:
    sys.stdout = open('nul', 'wb')
if getattr(sys.stderr, "fileno", lambda: -1)() < 0:
    sys.stderr = open('nul', 'wb')

プラグインフォルダに適当な名前のサブフォルダ(avoid_bad_file_descriptorとか)を追加して、このスクリプトを__init__.pyとして保存してください。

まとめ

これで、Pythonスクリプト版のBazaar上でTortoiseBzrを動かせるようになりました。この場合はTortoiseBzr自体もPythonスクリプトなので、好きに機能を追加したりすることもできます。
ちなみに、TortoiseBzrただいまコントリビュータ絶賛募集中ですよ。