Windows上の JRuby で Redmine を実行した時の Subversion 連携に注意
Redmine を Windows 上の JRuby で実行した際に Subversion との連携が正しく動作しない点について簡単に調査してみた。
環境は以下の通り。
- JRuby 1.1.2
- Redmine 0.7.2
- Subversion win32 1.4.5
原因
原因は、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 上での実行ではダブルクォート「"」で囲む事が意図されているが、以下のように JRuby の RUBY_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