add support for Windows using rb-fchange. Specs fail because of k32WaitForMultipleObjects blocks all threads

This commit is contained in:
slavic 2011-04-30 13:38:57 +03:00
parent 6ecb72c9cb
commit 94e04ec7e0
6 changed files with 129 additions and 3 deletions

View File

@ -14,4 +14,5 @@ if Config::CONFIG['target_os'] =~ /linux/i
end end
if Config::CONFIG['target_os'] =~ /mswin|mingw/i if Config::CONFIG['target_os'] =~ /mswin|mingw/i
gem 'win32console' gem 'win32console'
gem 'rb-fchange', :git => 'git://github.com/stereobooster/rb-fchange.git'
end end

View File

@ -4,6 +4,7 @@ module Guard
autoload :Darwin, 'guard/listeners/darwin' autoload :Darwin, 'guard/listeners/darwin'
autoload :Linux, 'guard/listeners/linux' autoload :Linux, 'guard/listeners/linux'
autoload :Windows, 'guard/listeners/windows'
autoload :Polling, 'guard/listeners/polling' autoload :Polling, 'guard/listeners/polling'
class Listener class Listener
@ -14,6 +15,8 @@ module Guard
Darwin.new Darwin.new
elsif linux? && Linux.usable? elsif linux? && Linux.usable?
Linux.new Linux.new
elsif windows? && Windows.usable?
Windows.new
else else
UI.info "Using polling (Please help us to support your system better than that.)" UI.info "Using polling (Please help us to support your system better than that.)"
Polling.new Polling.new
@ -54,6 +57,10 @@ module Guard
Config::CONFIG['target_os'] =~ /linux/i Config::CONFIG['target_os'] =~ /linux/i
end end
def self.windows?
Config::CONFIG['target_os'] =~ /mswin|mingw/i
end
end end
end end

View File

@ -0,0 +1,35 @@
module Guard
class Windows < Listener
attr_reader :fchange
def initialize
super
@fchange = FChange::Notifier.new
end
def on_change(&callback)
@fchange.watch Dir.pwd, :all_events do |event|
files = modified_files([event.watcher.path])
update_last_event
callback.call(files)
end
end
def start
@fchange.run
end
def stop
@fchange.stop
end
def self.usable?
require 'rb-fchange'
true
rescue LoadError
UI.info "Please install rb-fchange gem for Windows file events support"
false
end
end
end

View File

@ -14,10 +14,10 @@ describe Guard::Listener do
subject.select_and_init subject.select_and_init
end end
it "uses polling listener on Windows" do it "uses windows listener on Windows" do
Config::CONFIG['target_os'] = 'win32' Config::CONFIG['target_os'] = 'win32'
Guard::Polling.stub(:usable?).and_return(true) Guard::Windows.stub(:usable?).and_return(true)
Guard::Polling.should_receive(:new) Guard::Windows.should_receive(:new)
subject.select_and_init subject.select_and_init
end end

View File

@ -0,0 +1,79 @@
require 'spec_helper'
require 'guard/listeners/windows'
describe Guard::Windows do
subject { Guard::Windows }
if linux?
it "isn't usable on linux" do
subject.should_not be_usable
end
end
if mac?
it "isn't usable on Mac" do
subject.should_not be_usable
end
end
if windows?
it "is usable on Windows 2000 and later" do
subject.should be_usable
end
describe "#on_change" do
before(:each) do
@results = []
@listener = Guard::Windows.new
@listener.on_change do |files|
@results += files
end
end
it "catches new file" do
file = @fixture_path.join("newfile.rb")
File.exists?(file).should be_false
start
FileUtils.touch file
stop
File.delete file
@results.should == ['spec/fixtures/newfile.rb']
end
it "catches file update" do
file = @fixture_path.join("folder1/file1.txt")
File.exists?(file).should be_true
start
FileUtils.touch file
stop
@results.should == ['spec/fixtures/folder1/file1.txt']
end
it "catches files update" do
file1 = @fixture_path.join("folder1/file1.txt")
file2 = @fixture_path.join("folder1/folder2/file2.txt")
File.exists?(file1).should be_true
File.exists?(file2).should be_true
start
FileUtils.touch file1
FileUtils.touch file2
stop
@results.should == ['spec/fixtures/folder1/file1.txt', 'spec/fixtures/folder1/folder2/file2.txt']
end
end
end
private
def start
sleep 0.6
Thread.new { @listener.start }
sleep 0.6
end
def stop
sleep 0.6
@listener.stop
end
end

View File

@ -5,3 +5,7 @@ end
def linux? def linux?
Config::CONFIG['target_os'] =~ /linux/i Config::CONFIG['target_os'] =~ /linux/i
end end
def windows?
Config::CONFIG['target_os'] =~ /mswin|mingw/i
end