Windows上の JRuby で Redmine を実行した時の Subversion 連携に注意

Redmine を Windows 上の JRuby で実行した際に Subversion との連携が正しく動作しない点について簡単に調査してみた。

環境は以下の通り。

原因

原因は、svn コマンドの実行に失敗していることで、失敗の原因は svn コマンドの実行時にパスをシングルクォート「'」で囲んで実行してしまっている点。

ソースコードの該当箇所は AbstractAdapter クラス(lib/redmine/scm/adapters/abstract_adapter.rb) の shell_quote メソッドです。

AbstractAdapter クラスの shell_quote メソッド
def shell_quote(str)
  if RUBY_PLATFORM =~ /mswin/
    '"' + str.gsub(/"/, '\\"') + '"'
  else
    "'" + str.gsub(/'/, "'\"'\"'") + "'"
  end
end

Windows 上での実行ではダブルクォート「"」で囲む事が意図されているが、以下のように JRubyRUBY_PLATFORM 定数値は "java" になるため、Windows上の JRuby で実行した場合は意図したように動作しない。

>jruby -e "puts RUBY_PLATFORM"
java

暫定的な回避策

つまりは、RUBY_PLATFORM を上書きして mswin を含めるようにすれば、Subversion 連携が正常に動作するようになるはず。
というわけで、とりあえずの回避策として config/environment.rb 内で RUBY_PLATFORM を上書きしてみたところ、一応 Subversion 連携機能が動作するようになった。(ただし、定数を上書きすることによる警告が出力されるようになった)

config/environment.rb ファイル
RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION

#RUBY_PLATFORM の上書き処理の追加
if (RUBY_PLATFORM == "java") 
    require "java"
    os = java.lang.System.getProperty("os.name")

    RUBY_PLATFORM = "mswin(java)" if os.downcase.include?("windows")
end