diff --git a/Gemfile b/Gemfile index 73adc42..dd5881f 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,10 @@ source "http://rubygems.org" gemspec +platform :jruby do + gem 'spoon', '~> 0.0.1' +end + group :development do gem 'parka' gem 'rake' diff --git a/Gemfile.lock b/Gemfile.lock index 8d5dd78..b90f459 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,6 +17,7 @@ GEM diff-lcs (1.1.3) fakefs (0.3.2) hpricot (0.8.2) + hpricot (0.8.2-java) mime-types (1.16) mustache (0.11.2) parka (0.6.2) @@ -25,6 +26,7 @@ GEM thor rake (0.9.2.2) rcov (0.9.8) + rcov (0.9.8-java) rdiscount (1.6.5) rest-client (1.6.1) mime-types (>= 1.16) @@ -42,11 +44,13 @@ GEM diff-lcs (~> 1.1.2) rspec-mocks (2.8.0) rubyzip (0.9.4) + spoon (0.0.1) term-ansicolor (1.0.7) thor (0.14.6) xml-simple (1.0.15) PLATFORMS + java ruby DEPENDENCIES @@ -60,3 +64,4 @@ DEPENDENCIES rr (~> 1.0.2) rspec (~> 2.0) rubyzip + spoon (~> 0.0.1) diff --git a/lib/foreman/process.rb b/lib/foreman/process.rb index ac929fa..0ed4214 100644 --- a/lib/foreman/process.rb +++ b/lib/foreman/process.rb @@ -1,4 +1,6 @@ require "foreman" +require "rubygems" +require "spoon" if RUBY_PLATFORM == "java" class Foreman::Process @@ -27,15 +29,24 @@ class Foreman::Process private + def jruby? + defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java" + end + def fork_with_io(command) reader, writer = IO.pipe - pid = fork do - trap("INT", "IGNORE") - writer.sync = true - $stdout.reopen writer - $stderr.reopen writer - reader.close - exec Foreman.runner, replace_command_env(command) + command = replace_command_env(command) + pid = if jruby? + Spoon.spawnp Foreman.runner, command + else + fork do + trap("INT", "IGNORE") + writer.sync = true + $stdout.reopen writer + $stderr.reopen writer + reader.close + exec Foreman.runner, command + end end [ reader, pid ] end