lib/rb-fsevent/fsevent.rb in rb-fsevent-0.3.9 vs lib/rb-fsevent/fsevent.rb in rb-fsevent-0.3.10

- old
+ new

@@ -1,61 +1,65 @@ class FSEvent - attr_reader :path, :callback, :pipe - - def watch(path, &callback) - @path = path + attr_reader :paths, :callback, :pipe + + def watch(paths, &callback) + @paths = paths.kind_of?(Enumerable) ? paths : [paths] @callback = callback end - + def run launch_bin listen end - + def stop if pipe Process.kill("KILL", pipe.pid) pipe.close end rescue IOError end - + private - + def bin_path File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin')) end - + def launch_bin - @pipe = IO.popen("#{bin_path}/fsevent_watch #{shellescape(path)}") + @pipe = IO.popen("#{bin_path}/fsevent_watch #{shellescaped_paths}") end - + def listen while !pipe.eof? if line = pipe.readline modified_dir_paths = line.split(":").select { |dir| dir != "\n" } callback.call(modified_dir_paths) end end rescue Interrupt, IOError stop end - + + def shellescaped_paths + @paths.map {|path| shellescape(path)}.join(' ') + end + # for Ruby 1.8.6 support def shellescape(str) # An empty argument will be skipped, so return empty quotes. return "''" if str.empty? - + str = str.dup - + # Process as a single byte sequence because not all shell # implementations are multibyte aware. str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1") - + # A LF cannot be escaped with a backslash because a backslash + LF # combo is regarded as line continuation and simply ignored. str.gsub!(/\n/, "'\n'") - + return str end - + end \ No newline at end of file