最近真面目に bzr(bazaar) を使いだしたので、じゃあ Web インターフェースも用意したいなぁ、とか思い立って loggerhead を使うことにしました。 loggerhead を選んだのは Launchpad で使われてるからってだけの理由ですが。
晴れて何も気にせず pip を使える環境になったのでインストールは楽チンです。
sudo pip install bzr sudo pip install Paste PasteDeploy simplejson sudo pip install http://www.owlfish.com/software/simpleTAL/downloads/SimpleTAL-4.3.tar.gz sudo pip install loggerhead sudo pip install flup
しかし、これだと設定方法がわからんので PyPI からアーカイブを拾ってくるというあたりがちょっと間抜け…
で、まずは serve-branches というコマンドで動かしてみるのが基本、ということみたいなので例に従って手元にあった emacs のソースで試してみると
goro@flora:~/work$ serve-branches ~/work/emacs/trunk serving on 0.0.0.0:8080 view at http://127.0.0.1:8080
動いたようなので w3m でアクセスしたら 404 File Not Found とか言われて哀しい気分に…。
仕方ないので
goro@flora:~/work$ serve-branches --log-level=10 ~/work/emacs/trunk
とかデバッグモードで動かして同じようにアクセスしたところコンソールには
INFO:loggerhead:127.0.0.1 - - [13/Nov/2012:16:43:23 +0900] "GET / HTTP/1.0" 404 - "-" "w3m/0.5.3"
とかなんの参考にもならない情報が…。
困ったときは Google 様に聞いてみるのが基本なのでお伺いを立ててみたところ似たような感じで苦戦してる人をハッケソ。これによると以下のようにした場合
This is functional: serve-branches --trunk-dir=/var/tmp/bzr-test/project1 --user-dirs serve-branches --trunk-dir=/var/tmp/bzr-test/project2 --user-dirs bzr serve --http --directory /var/tmp/bzr-test/project1/
なら動くということらしいので
serve-branches --trunk-dir=/Users/goro/work/emacs/trunk --user-dirs
で試してみたところ…動いた!
しかし正規の手順がよくわかんないのは怖いので、どうしたもんかと悩んでいたのですが、ふと /Library/Python/2.7/site-packages/loggerhead-1.18.2-py2.7.egg-info/installed-files.txt を眺めたら
../../../../../usr/local/bin/loggerhead.wsgi
といういかにも WSGI 経由で使えそうなファイルをハッケソ。 OS X Server の apache は WSGI 対応した(といっても「 Python Web アプリケーションを使用」が WSGI を指すと一発で分かる人は超能力者だろう…)ので、これを使えば幸せなんじゃねーの?、と試してみました。
/Library/Server/Web/Config/apache2/sites/0000_any_443_.conf に
WSGIScriptAlias /bzr /usr/local/bin/loggerhead.wsgi
を追加して
sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/serveradmin stop web sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/serveradmin start web
とするだけですが、いざ https://localhost/bzr にアクセスすると Internal Server Error 。 apache のエラーログを確認すると
NotConfiguredError: You must have a ~/.bazaar/bazaar.conf file for _www with http_root_dir set to the base directory you want to serve bazaar repositories from
ということらしいです。
apache の実行ユーザー(_www)に存在するホームディレクトリなんか設定したくないし、なんとかしてシステム全体の設定ファイルみたいの置けないかなぁ、とか思ったのだけど、どうもダメっぽい。しかしホームディレクトリはなぁ…と思いながら念のため
dscl . -read /Users/_www
と叩いてみたら
NFSHomeDirectory: /Library/WebServer UserShell: /usr/bin/false
ということで OS X Server の実行ユーザー(_www)には流石にシェルは設定されてはいないものの、ホームディレクトリは設定されていたのでした…。それはいいんだろうか、とも思うのだけど今回はあってラッキーなので早速 ~_www/.bazaar/bazaar.conf を作ることにします。
bazaar.conf のサンプルは何故か /System/Library/Frameworks/Python.framework/Versions/2.7/share/doc/loggerhead/bazaar.conf に置かれているのでこれをコピーして chown -R _www:_www ~_www/.bazaar とかしてあげれば OK 。中身はほとんどデフォルトのままだけど
# directory to serve bzr branches from # Non-bzr directories under this path will also be visible in loggerhead #http_root_dir = '/var/www/bzr' http_root_dir = '/User/goro/work/emacs/trunk' # The url prefix for the bzr branches. http_user_prefix = '/bzr' # Directory to put cache files in http_sql_dir = '/var/cache/loggerhead'
という具合。
あとは http_sql_dir で設定したディレクトリを掘って(でも /var/cache よりも ~_www/loggerhead のがいいかもなぁ?)、_www が読み書きできるように設定すれば一通り完了という感じ。
で、 https://localhost/bzr/ でならちゃんと動くんだけど https://localhost/bzr だとパスがおかしくなっちゃうのが悩ましいところ。って WSGI 関係なく apache 側の設定の問題で、こんな感じに落ち着いたようです?
RewriteEngine On RewriteCond %{REQUEST_URI} ^/bzr$ RewriteRule ^(.*)?$ /bzr/ [L,R] WSGIScriptAlias /bzr /usr/local/bin/loggerhead.wsgi <Location /bzr/> AuthName "Loggerhead" AuthType Digest Require valid-user </Location>
ちなみになんだかよくわかりませんが OS X Server の apache は Require valid-user で OpenDirectory のユーザーを使っての認証を行ってくれます。いつ動かなくなるかわからないのが恐ろしいトコロですが…