class Listen::Adapter::Linux
def _change(event_flags)
def _change(event_flags) { modified: [:attrib, :close_write], moved_to: [:moved_to], moved_from: [:moved_from], added: [:create], removed: [:delete] }.each do |change, flags| return change unless (flags & event_flags).empty? end nil end
def _configure(directory, &callback)
def _configure(directory, &callback) require 'rb-inotify' @worker ||= ::INotify::Notifier.new @worker.watch(directory.to_s, *options.events, &callback) rescue Errno::ENOSPC raise ::Listen::Error::INotifyMaxWatchesExceeded, <<~EOS Unable to monitor directories for changes because iNotify max watches exceeded. See #{README_URL} . EOS end
def _dir_event?(event)
def _dir_event?(event) event.flags.include?(:isdir) end
def _process_event(dir, event)
def _process_event(dir, event) # NOTE: avoid using event.absolute_name since new API # will need to have a custom recursion implemented # to properly match events to configured directories path = Pathname.new(event.watcher.path) + event.name rel_path = path.relative_path_from(dir).to_s Listen.logger.debug { "inotify: #{rel_path} (#{event.flags.inspect})" } if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT'] if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event) rel_path = path.dirname.relative_path_from(dir).to_s end _queue_change(:dir, dir, rel_path, {}) return end return if _skip_event?(event) cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie } # Note: don't pass options to force rescanning the directory, so we can # detect moving/deleting a whole tree if _dir_event?(event) _queue_change(:dir, dir, rel_path, cookie_params) return end params = cookie_params.merge(change: _change(event.flags)) _queue_change(:file, dir, rel_path, params) end
def _run
def _run @worker.run end
def _skip_event?(event)
def _skip_event?(event) # Event on root directory return true if event.name == '' # INotify reports changes to files inside directories as events # on the directories themselves too. # # @see http://linux.die.net/man/7/inotify _dir_event?(event) && (event.flags & [:close, :modify]).any? end
def _stop
def _stop @worker&.close super end