listen 2.7.5 → 2.7.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +0 -0
- data/.travis.yml +0 -1
- data/.yardopts +0 -0
- data/CHANGELOG.md +0 -0
- data/CONTRIBUTING.md +0 -0
- data/Gemfile +25 -4
- data/Guardfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +18 -10
- data/Rakefile +0 -0
- data/lib/listen.rb +2 -4
- data/lib/listen/adapter.rb +13 -4
- data/lib/listen/adapter/base.rb +33 -16
- data/lib/listen/adapter/bsd.rb +21 -38
- data/lib/listen/adapter/darwin.rb +17 -25
- data/lib/listen/adapter/linux.rb +34 -52
- data/lib/listen/adapter/polling.rb +9 -25
- data/lib/listen/adapter/tcp.rb +27 -14
- data/lib/listen/adapter/windows.rb +67 -23
- data/lib/listen/change.rb +26 -23
- data/lib/listen/cli.rb +0 -0
- data/lib/listen/directory.rb +47 -58
- data/lib/listen/file.rb +66 -101
- data/lib/listen/listener.rb +214 -155
- data/lib/listen/queue_optimizer.rb +104 -0
- data/lib/listen/record.rb +15 -5
- data/lib/listen/silencer.rb +14 -10
- data/lib/listen/tcp.rb +0 -1
- data/lib/listen/tcp/broadcaster.rb +31 -26
- data/lib/listen/tcp/message.rb +2 -2
- data/lib/listen/version.rb +1 -1
- data/listen.gemspec +1 -1
- data/spec/acceptance/listen_spec.rb +151 -239
- data/spec/acceptance/tcp_spec.rb +125 -134
- data/spec/lib/listen/adapter/base_spec.rb +13 -30
- data/spec/lib/listen/adapter/bsd_spec.rb +7 -35
- data/spec/lib/listen/adapter/darwin_spec.rb +18 -30
- data/spec/lib/listen/adapter/linux_spec.rb +49 -55
- data/spec/lib/listen/adapter/polling_spec.rb +20 -35
- data/spec/lib/listen/adapter/tcp_spec.rb +25 -27
- data/spec/lib/listen/adapter/windows_spec.rb +7 -33
- data/spec/lib/listen/adapter_spec.rb +10 -10
- data/spec/lib/listen/change_spec.rb +55 -57
- data/spec/lib/listen/directory_spec.rb +105 -155
- data/spec/lib/listen/file_spec.rb +186 -73
- data/spec/lib/listen/listener_spec.rb +233 -216
- data/spec/lib/listen/record_spec.rb +60 -22
- data/spec/lib/listen/silencer_spec.rb +48 -75
- data/spec/lib/listen/tcp/broadcaster_spec.rb +78 -69
- data/spec/lib/listen/tcp/listener_spec.rb +28 -71
- data/spec/lib/listen/tcp/message_spec.rb +48 -14
- data/spec/lib/listen_spec.rb +3 -3
- data/spec/spec_helper.rb +6 -3
- data/spec/support/acceptance_helper.rb +250 -31
- data/spec/support/fixtures_helper.rb +6 -4
- data/spec/support/platform_helper.rb +2 -2
- metadata +5 -5
- data/lib/listen/tcp/listener.rb +0 -108
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 962fc43324f716a5abe1d8acd8ea5df7c87d3d28
|
4
|
+
data.tar.gz: 84b801baff1f5026d64b15df0c9de5fceac572b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d95876a7d2bd3a39a8130685e2dfa40745ee6ca947646aa303a42b0ab1c4d8bb92347adf2b7e817209840c0a973a813ee5b3d90aafe0db6541361f2fa0d6b5a3
|
7
|
+
data.tar.gz: 3cf94f221c2c4debd84f14a4545ba6caecb45bf6c1d3097ab5482d4ce9e907858aa80d736cc66d54d74e9e100423aca970515ccc0debf89dfb5990f16d169752
|
data/.gitignore
CHANGED
File without changes
|
data/.rspec
CHANGED
File without changes
|
data/.rubocop.yml
CHANGED
File without changes
|
data/.travis.yml
CHANGED
data/.yardopts
CHANGED
File without changes
|
data/CHANGELOG.md
CHANGED
File without changes
|
data/CONTRIBUTING.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
@@ -3,14 +3,35 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
require 'rbconfig'
|
6
|
-
gem 'wdm', '>= 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw|cygwin/i
|
7
6
|
|
8
|
-
|
7
|
+
case RbConfig::CONFIG['target_os']
|
8
|
+
|
9
|
+
when /mswin|mingw|cygwin/i
|
10
|
+
gem 'wdm', '>= 0.1.0'
|
11
|
+
Kernel.warn 'NOTE: Known issues for your platform:'
|
12
|
+
Kernel.warn ' * celluloid-io dns resovler bug causes TCP adapter to fail'
|
13
|
+
Kernel.warn ' (fixed celluloid-io requires unreleased celluloid version)'
|
14
|
+
Kernel.warn " * celluloid master branch doesn't work properly on Windows"
|
15
|
+
|
16
|
+
# has fix, but causes above other problems:
|
17
|
+
# gem 'celluloid-io', github: 'celluloid/celluloid-io', ref: 'a72cae2e'
|
18
|
+
|
19
|
+
when /bsd|dragonfly/i
|
20
|
+
|
9
21
|
gem 'rb-kqueue', '>= 0.2'
|
10
|
-
|
11
|
-
|
22
|
+
|
23
|
+
Kernel.warn 'NOTE: BSD is unsupported because:'
|
24
|
+
Kernel.warn "* Ruby threads don't work correctly (Ruby/MRI unit tests)"
|
25
|
+
Kernel.warn "* and because of them, Celluloid doesn't work correctly"
|
26
|
+
|
27
|
+
Kernel.warn '* FFI blows up when libc is a LD script (ac63e07f7)'
|
12
28
|
gem 'ffi', github: 'carpetsmoker/ffi', ref: 'ac63e07f7'
|
29
|
+
|
30
|
+
Kernel.warn '* Celluloid core detection blows up (7fdef04)'
|
13
31
|
gem 'celluloid', github: 'celluloid/celluloid', ref: '7fdef04'
|
32
|
+
|
33
|
+
else
|
34
|
+
# handled by gemspec
|
14
35
|
end
|
15
36
|
|
16
37
|
group :tool do
|
data/Guardfile
CHANGED
File without changes
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -156,7 +156,7 @@ Also, setting the environment variable `LISTEN_GEM_DEBUGGING=1` does the same as
|
|
156
156
|
## Listen adapters
|
157
157
|
|
158
158
|
The Listen gem has a set of adapters to notify it when there are changes.
|
159
|
-
There are 4 OS-specific adapters to support Darwin, Linux,
|
159
|
+
There are 4 OS-specific adapters to support Darwin, Linux, ~~\*BSD~~ and Windows.
|
160
160
|
These adapters are fast as they use some system-calls to implement the notifying function.
|
161
161
|
|
162
162
|
There is also a polling adapter which is a cross-platform adapter and it will
|
@@ -178,11 +178,11 @@ require 'rbconfig'
|
|
178
178
|
gem 'wdm', '>= 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw|cygwin/i
|
179
179
|
```
|
180
180
|
|
181
|
-
### On
|
181
|
+
### On \*BSD
|
182
182
|
|
183
|
-
**NOTE:
|
183
|
+
**NOTE: \*BSD currently is BROKEN with no plans to fix it or support it (see: [#220](https://github.com/guard/listen/issues/220))**
|
184
184
|
|
185
|
-
If your are on
|
185
|
+
If your are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) instead of polling.
|
186
186
|
Please add the following to your Gemfile:
|
187
187
|
|
188
188
|
```ruby
|
@@ -199,13 +199,10 @@ end
|
|
199
199
|
|
200
200
|
```
|
201
201
|
|
202
|
-
### Issues
|
203
|
-
|
204
|
-
Listen traps SIGINT signal to properly finalize listeners. If you plan
|
205
|
-
on trapping this signal yourself - make sure to call `Listen.stop` in
|
206
|
-
signal handler.
|
202
|
+
### Issues and troubleshooting
|
207
203
|
|
208
204
|
Sometimes OS-specific adapters don't work. :'(
|
205
|
+
|
209
206
|
Here are some things you could try to avoid forcing polling.
|
210
207
|
|
211
208
|
* [Update your Dropbox client](http://www.dropbox.com/downloading), if you have Dropbox installed.
|
@@ -216,7 +213,18 @@ Here are some things you could try to avoid forcing polling.
|
|
216
213
|
|
217
214
|
If your application keeps using the polling-adapter and you can't figure out why, feel free to [open an issue](https://github.com/guard/listen/issues/new) (and be sure to [give all the details](https://github.com/guard/listen/blob/master/CONTRIBUTING.md)).
|
218
215
|
|
219
|
-
Also, if you have problems related to receiving the wrong events, too many
|
216
|
+
Also, if you have problems related to receiving the wrong events, too many
|
217
|
+
events or none at all, be sure set the environment variable
|
218
|
+
`LISTEN_GEM_DEBUGGING=1` and include the output when reporting a new issue.
|
219
|
+
|
220
|
+
If the listener works and then stops listening at some point and no errors are
|
221
|
+
shown with `LISTEN_GEM_DEBUGGING=1`, set `LISTEN_GEM_DEBUGGING=2` for full
|
222
|
+
logging.
|
223
|
+
|
224
|
+
Listen traps SIGINT signal to properly finalize listeners. If you plan
|
225
|
+
on trapping this signal yourself - make sure to call `Listen.stop` in
|
226
|
+
signal handler.
|
227
|
+
|
220
228
|
|
221
229
|
## Forwarding file events over TCP
|
222
230
|
|
data/Rakefile
CHANGED
File without changes
|
data/lib/listen.rb
CHANGED
@@ -25,8 +25,7 @@ module Listen
|
|
25
25
|
@stopping = false
|
26
26
|
options = args.last.is_a?(Hash) ? args.last : {}
|
27
27
|
if target = options.delete(:forward_to)
|
28
|
-
|
29
|
-
TCP::Listener.new(target, :broadcaster, *args, &block)
|
28
|
+
Listener.new(target, :broadcaster, *args, &block)
|
30
29
|
else
|
31
30
|
Listener.new(*args, &block)
|
32
31
|
end
|
@@ -53,8 +52,7 @@ module Listen
|
|
53
52
|
# @return [Listen::Listener] the listener
|
54
53
|
#
|
55
54
|
def on(target, *args, &block)
|
56
|
-
|
57
|
-
TCP::Listener.new(target, :recipient, *args, &block)
|
55
|
+
Listener.new(target, :recipient, *args, &block)
|
58
56
|
end
|
59
57
|
|
60
58
|
private
|
data/lib/listen/adapter.rb
CHANGED
@@ -7,29 +7,38 @@ require 'listen/adapter/windows'
|
|
7
7
|
|
8
8
|
module Listen
|
9
9
|
module Adapter
|
10
|
-
OPTIMIZED_ADAPTERS =
|
10
|
+
OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows]
|
11
11
|
POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\
|
12
12
|
'Learn more at https://github.com/guard/listen#polling-fallback.'
|
13
13
|
|
14
14
|
def self.select(options = {})
|
15
|
+
_log :debug, 'Adapter: considering TCP ...'
|
15
16
|
return TCP if options[:force_tcp]
|
17
|
+
_log :debug, 'Adapter: considering polling ...'
|
16
18
|
return Polling if options[:force_polling]
|
19
|
+
_log :debug, 'Adapter: considering optimized backend...'
|
17
20
|
return _usable_adapter_class if _usable_adapter_class
|
18
|
-
|
21
|
+
_log :debug, 'Adapter: falling back to polling...'
|
19
22
|
_warn_polling_fallback(options)
|
20
23
|
Polling
|
24
|
+
rescue
|
25
|
+
_log :warn, "Adapter: failed: #{$!.inspect}:#{$@.join("\n")}"
|
26
|
+
raise
|
21
27
|
end
|
22
28
|
|
23
29
|
private
|
24
30
|
|
25
31
|
def self._usable_adapter_class
|
26
|
-
|
27
|
-
adapters.detect { |adapter| adapter.send(:usable?) }
|
32
|
+
OPTIMIZED_ADAPTERS.detect(&:usable?)
|
28
33
|
end
|
29
34
|
|
30
35
|
def self._warn_polling_fallback(options)
|
31
36
|
msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE)
|
32
37
|
Kernel.warn "[Listen warning]:\n #{msg}" if msg
|
33
38
|
end
|
39
|
+
|
40
|
+
def self._log(type, message)
|
41
|
+
Celluloid.logger.send(type, message)
|
42
|
+
end
|
34
43
|
end
|
35
44
|
end
|
data/lib/listen/adapter/base.rb
CHANGED
@@ -3,41 +3,58 @@ module Listen
|
|
3
3
|
class Base
|
4
4
|
include Celluloid
|
5
5
|
|
6
|
-
# The default delay between checking for changes.
|
7
|
-
DEFAULT_LATENCY = 0.1
|
8
|
-
|
9
6
|
attr_accessor :listener
|
10
7
|
|
11
8
|
def initialize(listener)
|
12
9
|
@listener = listener
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
fail NotImplementedError
|
10
|
+
rescue
|
11
|
+
_log :error, "adapter config failed: #{$!}:#{$@.join("\n")}"
|
12
|
+
raise
|
17
13
|
end
|
18
14
|
|
19
15
|
def start
|
20
|
-
|
16
|
+
_configure
|
17
|
+
Thread.new do
|
18
|
+
begin
|
19
|
+
_run
|
20
|
+
rescue
|
21
|
+
_log :error, "run() in thread failed: #{$!}:#{$@.join("\n")}"
|
22
|
+
raise
|
23
|
+
end
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
def self.local_fs?
|
24
28
|
true
|
25
29
|
end
|
26
30
|
|
31
|
+
def self.usable?
|
32
|
+
const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os']
|
33
|
+
end
|
34
|
+
|
27
35
|
private
|
28
36
|
|
29
|
-
def
|
30
|
-
listener.options[:latency] || DEFAULT_LATENCY
|
37
|
+
def _configure
|
31
38
|
end
|
32
39
|
|
33
|
-
def
|
34
|
-
listener.directories
|
40
|
+
def _directories
|
41
|
+
listener.directories
|
42
|
+
end
|
43
|
+
|
44
|
+
def _notify_change(type, path, options = {})
|
45
|
+
unless (worker = listener.async(:change_pool))
|
46
|
+
_log :warn, 'Failed to allocate worker from change pool'
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
worker.change(type, path, options)
|
51
|
+
rescue RuntimeError
|
52
|
+
_log :error, "_notify_change crashed: #{$!}:#{$@.join("\n")}"
|
53
|
+
raise
|
35
54
|
end
|
36
55
|
|
37
|
-
def
|
38
|
-
|
39
|
-
pool = listener.registry[:change_pool]
|
40
|
-
pool.async.change(path, options) if listener.listen?
|
56
|
+
def _log(type, message)
|
57
|
+
Celluloid.logger.send(type, message)
|
41
58
|
end
|
42
59
|
end
|
43
60
|
end
|
data/lib/listen/adapter/bsd.rb
CHANGED
@@ -5,18 +5,14 @@
|
|
5
5
|
module Listen
|
6
6
|
module Adapter
|
7
7
|
class BSD < Base
|
8
|
-
|
9
|
-
#
|
10
|
-
EVENTS = [:delete, :write, :extend, :attrib, :rename] # :link, :revoke
|
8
|
+
OS_REGEXP = /bsd|dragonfly/i
|
11
9
|
|
12
|
-
|
10
|
+
EVENTS = [:delete, :write, :extend, :attrib, :rename] # :link, :revoke
|
13
11
|
|
14
|
-
# The message to show when wdm gem isn't available
|
15
|
-
#
|
16
12
|
BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
|
17
13
|
Please add the following to your Gemfile to avoid polling for changes:
|
18
14
|
require 'rbconfig'
|
19
|
-
if RbConfig::CONFIG['target_os'] =~ #{
|
15
|
+
if RbConfig::CONFIG['target_os'] =~ #{OS_REGEXP}
|
20
16
|
gem 'rb-kqueue', '>= 0.2'
|
21
17
|
|
22
18
|
# Base versions have known conflicts/bugs
|
@@ -39,56 +35,47 @@ module Listen
|
|
39
35
|
EOS
|
40
36
|
|
41
37
|
def self.usable?
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
38
|
+
return false unless super
|
39
|
+
Kernel.warn BSD_EXPERIMENTAL
|
40
|
+
require 'rb-kqueue'
|
41
|
+
require 'find'
|
42
|
+
true
|
48
43
|
rescue LoadError
|
49
44
|
Kernel.warn BUNDLER_DECLARE_GEM
|
50
45
|
false
|
51
46
|
end
|
52
47
|
|
53
|
-
def start
|
54
|
-
worker = _init_worker
|
55
|
-
Thread.new { worker.run }
|
56
|
-
end
|
57
|
-
|
58
48
|
private
|
59
49
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
KQueue::Queue.new.tap do |queue|
|
67
|
-
_directories_path.each do |path|
|
68
|
-
# use Record to make a snapshot of dir, so we
|
69
|
-
# can detect new files
|
70
|
-
_find(path) { |file_path| _watch_file(file_path, queue) }
|
71
|
-
end
|
50
|
+
def _configure
|
51
|
+
@worker = KQueue::Queue.new
|
52
|
+
_directories.each do |path|
|
53
|
+
# use Record to make a snapshot of dir, so we
|
54
|
+
# can detect new files
|
55
|
+
_find(path.to_s) { |file_path| _watch_file(file_path, @worker) }
|
72
56
|
end
|
73
57
|
end
|
74
58
|
|
59
|
+
def _run
|
60
|
+
@worker.run
|
61
|
+
end
|
62
|
+
|
75
63
|
def _worker_callback
|
76
64
|
lambda do |event|
|
77
|
-
change = _change(event.flags)
|
78
65
|
path = _event_path(event)
|
79
66
|
if path.directory?
|
80
67
|
# Force dir content tracking to kick in, or we won't have
|
81
68
|
# names of added files
|
82
|
-
_notify_change(
|
69
|
+
_notify_change(:dir, path, recursive: true)
|
83
70
|
else
|
84
|
-
_notify_change(
|
71
|
+
_notify_change(:file, path, change: _change(event.flags))
|
85
72
|
end
|
86
73
|
|
87
74
|
# If it is a directory, and it has a write flag, it means a
|
88
75
|
# file has been added so find out which and deal with it.
|
89
76
|
# No need to check for removed files, kqueue will forget them
|
90
77
|
# when the vfs does.
|
91
|
-
_watch_for_new_file(event) if
|
78
|
+
_watch_for_new_file(event) if path.directory?
|
92
79
|
end
|
93
80
|
end
|
94
81
|
|
@@ -106,10 +93,6 @@ module Listen
|
|
106
93
|
Pathname.new(event.watcher.path)
|
107
94
|
end
|
108
95
|
|
109
|
-
def _new_file_added?(event)
|
110
|
-
::File.directory?(event.watcher.path) && event.flags.include?(:write)
|
111
|
-
end
|
112
|
-
|
113
96
|
def _watch_for_new_file(event)
|
114
97
|
queue = event.watcher.queue
|
115
98
|
_find(_event_path(event).to_s) do |file_path|
|
@@ -3,39 +3,31 @@ module Listen
|
|
3
3
|
# Adapter implementation for Mac OS X `FSEvents`.
|
4
4
|
#
|
5
5
|
class Darwin < Base
|
6
|
-
|
7
|
-
RbConfig::CONFIG['target_os'] =~ /darwin(1.+)?$/i
|
8
|
-
end
|
6
|
+
OS_REGEXP = /darwin(1.+)?$/i
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
super
|
13
|
-
end
|
14
|
-
|
15
|
-
def start
|
16
|
-
worker = _init_worker
|
17
|
-
Thread.new { worker.run }
|
18
|
-
end
|
8
|
+
# The default delay between checking for changes.
|
9
|
+
DEFAULT_LATENCY = 0.1
|
19
10
|
|
20
11
|
private
|
21
12
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
13
|
+
def _configure
|
14
|
+
require 'rb-fsevent'
|
15
|
+
@worker = FSEvent.new
|
16
|
+
@worker.watch(_directories.map(&:to_s), latency: _latency) do |changes|
|
17
|
+
changes.each do |path|
|
18
|
+
new_path = Pathname.new(path.sub(/\/$/, ''))
|
19
|
+
_log :debug, "fsevent: #{new_path}"
|
20
|
+
_notify_change(:dir, new_path)
|
30
21
|
end
|
31
22
|
end
|
32
23
|
end
|
33
24
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
25
|
+
def _run
|
26
|
+
@worker.run
|
27
|
+
end
|
28
|
+
|
29
|
+
def _latency
|
30
|
+
listener.options[:latency] || DEFAULT_LATENCY
|
39
31
|
end
|
40
32
|
end
|
41
33
|
end
|
data/lib/listen/adapter/linux.rb
CHANGED
@@ -1,17 +1,13 @@
|
|
1
1
|
module Listen
|
2
2
|
module Adapter
|
3
3
|
# Listener implementation for Linux `inotify`.
|
4
|
+
# @see https://github.com/nex3/rb-inotify
|
4
5
|
#
|
5
6
|
class Linux < Base
|
6
|
-
|
7
|
-
|
8
|
-
# @see http://www.tin.org/bin/man.cgi?section=7&topic=inotify
|
9
|
-
# @see https://github.com/nex3/rb-inotify
|
10
|
-
#
|
7
|
+
OS_REGEXP = /linux/i
|
8
|
+
|
11
9
|
EVENTS = [:recursive, :attrib, :create, :delete, :move, :close_write]
|
12
10
|
|
13
|
-
# The message to show when the limit of inotify watchers is not enough
|
14
|
-
#
|
15
11
|
WIKI_URL = 'https://github.com/guard/listen'\
|
16
12
|
'/wiki/Increasing-the-amount-of-inotify-watchers'
|
17
13
|
|
@@ -22,53 +18,49 @@ module Listen
|
|
22
18
|
for information on how to solve this issue.
|
23
19
|
EOS
|
24
20
|
|
25
|
-
|
26
|
-
RbConfig::CONFIG['target_os'] =~ /linux/i
|
27
|
-
end
|
21
|
+
private
|
28
22
|
|
29
|
-
def
|
23
|
+
def _configure
|
30
24
|
require 'rb-inotify'
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
worker = _init_worker
|
36
|
-
Thread.new { worker.run }
|
25
|
+
@worker = INotify::Notifier.new
|
26
|
+
_directories.each do |path|
|
27
|
+
@worker.watch(path.to_s, *EVENTS, &_callback)
|
28
|
+
end
|
37
29
|
rescue Errno::ENOSPC
|
30
|
+
# workaround - Celluloid catches abort and prints nothing
|
38
31
|
STDERR.puts INOTIFY_LIMIT_MESSAGE
|
39
32
|
STDERR.flush
|
40
33
|
abort(INOTIFY_LIMIT_MESSAGE)
|
41
34
|
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
# Initializes a INotify worker and adds a watcher for
|
46
|
-
# each directory passed to the adapter.
|
47
|
-
#
|
48
|
-
# @return [INotify::Notifier] initialized worker
|
49
|
-
#
|
50
|
-
def _init_worker
|
51
|
-
INotify::Notifier.new.tap do |worker|
|
52
|
-
_directories_path.each do |path|
|
53
|
-
worker.watch(path, *EVENTS, &_worker_callback)
|
54
|
-
end
|
55
|
-
end
|
36
|
+
def _run
|
37
|
+
@worker.run
|
56
38
|
end
|
57
39
|
|
58
|
-
def
|
40
|
+
def _callback
|
59
41
|
lambda do |event|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
_log(event)
|
66
|
-
|
67
|
-
if
|
68
|
-
|
42
|
+
# NOTE: avoid using event.absolute_name since new API
|
43
|
+
# will need to have a custom recursion implemented
|
44
|
+
# to properly match events to configured directories
|
45
|
+
path = Pathname.new(event.watcher.path) + event.name
|
46
|
+
|
47
|
+
_log :debug, "inotify: #{event.name} #{path} (#{event.flags.inspect})"
|
48
|
+
|
49
|
+
if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT']
|
50
|
+
if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event)
|
51
|
+
_notify_change(:dir, path.dirname)
|
52
|
+
else
|
53
|
+
_notify_change(:dir, path)
|
54
|
+
end
|
69
55
|
else
|
70
|
-
|
71
|
-
|
56
|
+
next if _skip_event?(event)
|
57
|
+
cookie_opts = event.cookie.zero? ? {} : { cookie: event.cookie }
|
58
|
+
if _dir_event?(event)
|
59
|
+
_notify_change(:dir, path, cookie_opts)
|
60
|
+
else
|
61
|
+
options = { change: _change(event.flags) }
|
62
|
+
_notify_change(:file, path, options.merge(cookie_opts))
|
63
|
+
end
|
72
64
|
end
|
73
65
|
end
|
74
66
|
end
|
@@ -97,16 +89,6 @@ module Listen
|
|
97
89
|
def _dir_event?(event)
|
98
90
|
event.flags.include?(:isdir)
|
99
91
|
end
|
100
|
-
|
101
|
-
def _event_path(event)
|
102
|
-
Pathname.new(event.absolute_name)
|
103
|
-
end
|
104
|
-
|
105
|
-
def _log(event)
|
106
|
-
name = event.name
|
107
|
-
flags = event.flags.inspect
|
108
|
-
Celluloid.logger.info "inotify event: #{flags}: #{name}"
|
109
|
-
end
|
110
92
|
end
|
111
93
|
end
|
112
94
|
end
|