[ index ]

Subversionで管理されたHikiをWindowsで動かす

目標

IISでHikiを動かして、Subversionで履歴の管理が出来るようにする。

今回の対象となった環境

Windows XP SP2
IIS 5.1
Hiki 0.6.5
ActiveScriptRuby 1.8.1.2
Subversion 1.0.6

インストールとか

HikiFarmやSubversionを使わない、一般的なインストールならば、Windowsでも特に問題にはならない(Windows 2000のIIS 5.0にはバグがあるので、cgiの先頭でカレントパスを変更するコードを入れる必要があるかもしれない。IIS 5.1ならば問題なし)。しかしSubversionを使うためには、HikiFarmを使わなければならないようなので、HikiFarmの設定をした。うまく設定すれば、HikiFarmの必要は無いかもしれない。この辺の設定は後日挑戦してみようと思う。今回は、HikiFarmを構築した上で、Subversionで管理をさせる。

関係ないけど、HikiFarmで作成したHikiごとにリポジトリを作成するようにした方が良いかもしれない。関係ないHikiのページが更新されてもリビジョンが増えてしまうからだ。この辺はHikiFarmのindex.cgiを修正すればそんなに難しくなさそう。

問題が起こる箇所

HikiFarmのindex.cgi

repos_rootの値をチェックして、リモートのリポジトリははじくようなコードが入っているのだが、そのチェック方法に問題がある。

Windowsで、repos_rootにフルパスを記入すると、ドライブレターが入ることになるのだが、そうすると以下のコードに引っかかることになる。

if repos_root =~ /:/ and repos_root.split(/:/)[1] != "local" then

設定は確実にすることを条件に、この部分をコメントアウトするか、条件分岐などで実行されないように修正する。

Subversion実行時のオプション

cgiのRubyのsystemメソッドでSubversionを実行すると、"svn: Can't determine the user's config path"というエラーが出て実行できない。

Windows版のSubversionでは、"C:\Documents and Settings\user_name\Application Data\Subversion"にconfigが格納されている。cgiから実行すると、IUSR_machine_nameがrubyを実行することになる。IUSR_machine_nameにはそのディレクトリが存在しないので、エラーになってしまうらしい。IUSR_machine_nameの%APPDATA%にSubversionのconfigを置くか、svnコマンドの実行時に、--config-dirオプションで指定をする。IUSR_machine_nameの%APPDATA%を調べる方法(もしくは指定する方法)がよくわからなかったので、今回は一々--config- dirを指定する方法を取っている。

具体的には、hikifarm.confに、以下のような設定を追加して、svnコマンドの引数に挿入している。Subversionディレクトリは、自分の所からコピーした。

$svn_config = '--config-dir "C:\Documents and Settings\LocalService\Application Data\Subversion"'

また、import時に-mオプションでメッセージを指定しているのだが、「'」ではなくて、「"」を使うように修正する。$svn_configもあわせて修正すると、以下のようになる。

修正前

system( "svn import -m 'Starting #{wiki}' . file://#{@root}/#{wiki}/trunk > /dev/null 2>&1" )

修正後

system( "svn import -m \"Starting #{wiki}\" #{$svn_config} . file://#{@root}/#{wiki}/trunk" )

Subversion実行時のリダイレクト

svnコマンドの出力を/dev/nullなどに出力しているが、リダイレクトを一切指定しない用に変更する。最初はnulにリダイレクトしていたのだが、これではうまく動かなかった。

これらsvnコマンドに関する変更は、index.cgiおよびsvn.rbに適用する。

svn lsの出力をopenではなくて、IO.popenで開く

ReposSvn#imported? で、以下のようなコードがある。

open("|svn ls file://#{@root}/#{wiki}") do |f|

これはうまく動かないので、以下のように修正する。

IO.popen("svn ls #{$svn_config} file://#{@root}/#{wiki}") do |f|

repos_rootの書き方

hikifarm.confの、repos_rootにはリポジトリのパスを書く。通常はc:/svnのように書くのだが、ここだけは/c:/svnのように、先頭に'/'を入れる必要がある。これは、リポジトリのパスを利用するコードが'file://'にrepos_rootを連結しているため、先頭に'/'がないと、正しいパスにならないためである。

hiki.confにrepos_typeを追加

hiki.confに、以下の設定を追加する。これはプラグインのhistory.rbに記述されている。

$repos_type      = (defined? repos_type) ? "#{repos_type}" : nil

cgi_nameに、index.cgiを記述する

ディレクトリインデックスにindex.cgiを指定しているのだが、新しく作成したHikiのサイトに関しては何故かうまく動かなかったので、hiki.confのcgi_nameを以下のようにする。

$cgi_name        = './index.cgi'

今後の課題

[ index ]

むらまさ(muramasa64 at gmail.com)