Permalink
Browse files

add support for Windows using rb-fchange. Specs fail because of k32Wa…

…itForMultipleObjects blocks all threads
  • Loading branch information...
1 parent 6ecb72c commit 94e04ec7e0c16e533be91b5769af1c84e0045a40 @stereobooster committed Apr 30, 2011
View
@@ -14,4 +14,5 @@ if Config::CONFIG['target_os'] =~ /linux/i
end
if Config::CONFIG['target_os'] =~ /mswin|mingw/i
gem 'win32console'
+ gem 'rb-fchange', :git => 'git://github.com/stereobooster/rb-fchange.git'
end
View
@@ -4,6 +4,7 @@ module Guard
autoload :Darwin, 'guard/listeners/darwin'
autoload :Linux, 'guard/listeners/linux'
+ autoload :Windows, 'guard/listeners/windows'
autoload :Polling, 'guard/listeners/polling'
class Listener
@@ -14,6 +15,8 @@ def self.select_and_init
Darwin.new
elsif linux? && Linux.usable?
Linux.new
+ elsif windows? && Windows.usable?
+ Windows.new
else
UI.info "Using polling (Please help us to support your system better than that.)"
Polling.new
@@ -54,6 +57,10 @@ def self.linux?
Config::CONFIG['target_os'] =~ /linux/i
end
+ def self.windows?
+ Config::CONFIG['target_os'] =~ /mswin|mingw/i
+ end
+
end
end
@@ -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
@@ -14,10 +14,10 @@
subject.select_and_init
end
- it "uses polling listener on Windows" do
+ it "uses windows listener on Windows" do
Config::CONFIG['target_os'] = 'win32'
- Guard::Polling.stub(:usable?).and_return(true)
- Guard::Polling.should_receive(:new)
+ Guard::Windows.stub(:usable?).and_return(true)
+ Guard::Windows.should_receive(:new)
subject.select_and_init
end
@@ -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
@@ -4,4 +4,8 @@ def mac?
def linux?
Config::CONFIG['target_os'] =~ /linux/i
+end
+
+def windows?
+ Config::CONFIG['target_os'] =~ /mswin|mingw/i
end

0 comments on commit 94e04ec

Please sign in to comment.