diff --git a/Gemfile b/Gemfile index 7be0323..28cb64a 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,10 @@ source "http://rubygems.org" gemspec +platform :mingw do + gem "win32console", "~> 1.3.0" +end + platform :jruby do gem "posix-spawn", "~> 0.3.6" end diff --git a/Gemfile.lock b/Gemfile.lock index df77dc2..6d263d3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -47,6 +47,7 @@ GEM rubyzip (0.9.4) term-ansicolor (1.0.7) thor (0.14.6) + win32console (1.3.0-x86-mingw32) xml-simple (1.0.15) PLATFORMS @@ -66,3 +67,4 @@ DEPENDENCIES rr (~> 1.0.2) rspec (~> 2.0) rubyzip + win32console (~> 1.3.0) diff --git a/dist/mingw32.rake b/dist/mingw32.rake new file mode 100644 index 0000000..37c9498 --- /dev/null +++ b/dist/mingw32.rake @@ -0,0 +1,14 @@ +file pkg("foreman-#{version}-mingw32.gem") => distribution_files do |t| + sh "env PLATFORM=mingw32 gem build foreman.gemspec" + sh "mv foreman-#{version}-mingw32.gem #{t.name}" +end + +task "mingw32:build" => pkg("foreman-#{version}-mingw32.gem") + +task "mingw32:clean" do + clean pkg("foreman-#{version}-mingw32.gem") +end + +task "mingw32:release" => "mingw32:build" do |t| + sh "parka push -f #{pkg("foreman-#{version}-mingw32.gem")}" +end diff --git a/foreman.gemspec b/foreman.gemspec index 5e6ee36..0d479c0 100644 --- a/foreman.gemspec +++ b/foreman.gemspec @@ -23,4 +23,9 @@ Gem::Specification.new do |gem| gem.add_dependency "posix-spawn", "~> 0.3.6" gem.platform = Gem::Platform.new("java") end + + if ENV["PLATFORM"] == "mingw32" + gem.add_dependency "win32console", "~> 1.3.0" + gem.platform = Gem::Platform.new("mingw32") + end end diff --git a/lib/foreman.rb b/lib/foreman.rb index 3c8f011..f9d501f 100644 --- a/lib/foreman.rb +++ b/lib/foreman.rb @@ -14,5 +14,12 @@ module Foreman File.expand_path("../../bin/runner", __FILE__) end -end + def self.jruby? + defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java" + end + def self.windows? + defined?(RUBY_PLATFORM) and RUBY_PLATFORM =~ /(win|w)32$/ + end + +end diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index a71871a..088dee6 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -88,6 +88,7 @@ private ###################################################################### def watch_for_output Thread.new do + require "win32console" if Foreman.windows? begin loop do rs, ws = IO.select(readers.values, [], [], 1) @@ -155,7 +156,7 @@ private ###################################################################### end def termtitle(title) - printf("\033]0;#{title}\007") + printf("\033]0;#{title}\007") unless Foreman.windows? end def running_processes diff --git a/lib/foreman/process.rb b/lib/foreman/process.rb index b7515a1..e834b40 100644 --- a/lib/foreman/process.rb +++ b/lib/foreman/process.rb @@ -26,22 +26,14 @@ class Foreman::Process private - def jruby? - defined?(RUBY_PLATFORM) and RUBY_PLATFORM == "java" - end - - def windows? - defined?(RUBY_PLATFORM) and RUBY_PLATFORM =~ /(win|w)32$/ - end - def fork_with_io(command, basedir) reader, writer = IO.pipe command = replace_command_env(command) - pid = if windows? + pid = if Foreman.windows? Dir.chdir(basedir) do Process.spawn command, :out => writer, :err => writer end - elsif jruby? + elsif Foreman.jruby? require "posix/spawn" POSIX::Spawn.spawn(Foreman.runner, "-d", basedir, command, { :out => writer, :err => writer