2010-10-17 19:42:40 +00:00
|
|
|
require 'rbconfig'
|
2010-10-03 21:00:33 +00:00
|
|
|
|
|
|
|
module Guard
|
2010-10-17 19:42:40 +00:00
|
|
|
|
|
|
|
autoload :Darwin, 'guard/listeners/darwin'
|
|
|
|
autoload :Linux, 'guard/listeners/linux'
|
|
|
|
autoload :Polling, 'guard/listeners/polling'
|
|
|
|
|
2010-10-03 21:00:33 +00:00
|
|
|
class Listener
|
2010-11-30 20:15:03 +00:00
|
|
|
attr_accessor :last_event, :changed_files
|
2010-10-17 19:42:40 +00:00
|
|
|
|
2010-11-30 20:15:03 +00:00
|
|
|
def self.select_and_init
|
2010-10-17 19:42:40 +00:00
|
|
|
if mac? && Darwin.usable?
|
|
|
|
Darwin.new
|
|
|
|
elsif linux? && Linux.usable?
|
|
|
|
Linux.new
|
|
|
|
else
|
|
|
|
UI.info "Using polling (Please help us to support your system better than that.)"
|
|
|
|
Polling.new
|
2010-10-03 21:00:33 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-10-17 19:42:40 +00:00
|
|
|
def initialize
|
2010-11-30 20:15:03 +00:00
|
|
|
@changed_files = []
|
2010-10-17 19:42:40 +00:00
|
|
|
update_last_event
|
2010-10-03 21:00:33 +00:00
|
|
|
end
|
|
|
|
|
2010-11-30 20:15:03 +00:00
|
|
|
def get_and_clear_changed_files
|
|
|
|
files = changed_files.dup
|
|
|
|
changed_files.clear
|
|
|
|
files.uniq
|
|
|
|
end
|
|
|
|
|
2010-10-03 21:00:33 +00:00
|
|
|
private
|
|
|
|
|
2010-11-30 20:15:03 +00:00
|
|
|
def find_changed_files(dirs, options = {})
|
|
|
|
files = potentially_changed_files(dirs, options).select { |path| File.file?(path) && changed_file?(path) }
|
2010-10-03 21:00:33 +00:00
|
|
|
files.map! { |file| file.gsub("#{Dir.pwd}/", '') }
|
|
|
|
end
|
|
|
|
|
2010-11-30 20:15:03 +00:00
|
|
|
def potentially_changed_files(dirs, options = {})
|
2010-10-17 19:42:40 +00:00
|
|
|
match = options[:all] ? "**/*" : "*"
|
|
|
|
Dir.glob(dirs.map { |dir| "#{dir}#{match}" })
|
2010-10-03 21:00:33 +00:00
|
|
|
end
|
|
|
|
|
2010-11-30 20:15:03 +00:00
|
|
|
def changed_file?(file)
|
2010-10-03 21:00:33 +00:00
|
|
|
File.mtime(file) >= last_event
|
2010-10-07 18:53:29 +00:00
|
|
|
rescue
|
|
|
|
false
|
2010-10-03 21:00:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def update_last_event
|
|
|
|
@last_event = Time.now
|
|
|
|
end
|
|
|
|
|
2010-10-17 19:42:40 +00:00
|
|
|
def self.mac?
|
|
|
|
Config::CONFIG['target_os'] =~ /darwin/i
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.linux?
|
|
|
|
Config::CONFIG['target_os'] =~ /linux/i
|
2010-10-03 21:00:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|