listen 3.0.8 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/listen.rb +1 -4
- data/lib/listen/adapter.rb +27 -25
- data/lib/listen/adapter/base.rb +7 -3
- data/lib/listen/adapter/bsd.rb +3 -3
- data/lib/listen/adapter/config.rb +1 -1
- data/lib/listen/adapter/darwin.rb +10 -6
- data/lib/listen/adapter/linux.rb +4 -8
- data/lib/listen/adapter/polling.rb +1 -1
- data/lib/listen/adapter/windows.rb +5 -6
- data/lib/listen/backend.rb +5 -12
- data/lib/listen/change.rb +8 -10
- data/lib/listen/directory.rb +2 -13
- data/lib/listen/event/config.rb +2 -6
- data/lib/listen/event/queue.rb +4 -9
- data/lib/listen/file.rb +1 -1
- data/lib/listen/fsm.rb +2 -1
- data/lib/listen/internals/thread_pool.rb +1 -9
- data/lib/listen/listener.rb +3 -3
- data/lib/listen/listener/config.rb +3 -7
- data/lib/listen/queue_optimizer.rb +4 -4
- data/lib/listen/record.rb +1 -3
- data/lib/listen/record/entry.rb +4 -13
- data/lib/listen/record/symlink_detector.rb +2 -2
- data/lib/listen/silencer.rb +2 -2
- data/lib/listen/version.rb +1 -1
- metadata +7 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d04237309b5073d900c70a81c8541f2531788404
|
4
|
+
data.tar.gz: 5836d56ad7c14047b7839f800c4bcced1c873dbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6ec5d3c5fcde2494c9ffff5c3f74bcb7b6173839907e375e91cd52c216d4876af9fe4bfb24d217d900af69f30c752ee760d65b707b2586a06463c1e67a4040e
|
7
|
+
data.tar.gz: b2e7d18eeabc1fd755684eea761caa67ab7054756fdeb00109af89fc0afee507dcc71f6ebfb90753b2d1ab27f4a3ead7b7447543c7abd5834fd2ddf0df011725
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ The Listen gem listens to file modifications and notifies you about the changes.
|
|
13
13
|
* You can watch multiple directories.
|
14
14
|
* Regexp-patterns for ignoring paths for more accuracy and speed
|
15
15
|
* Increased change detection accuracy on OS X HFS and VFAT volumes.
|
16
|
-
* Tested on MRI Ruby environments (2.
|
16
|
+
* Tested on MRI Ruby environments (2.2+ only) via [Travis CI](https://travis-ci.org/guard/listen),
|
17
17
|
|
18
18
|
## Issues / limitations
|
19
19
|
|
@@ -27,7 +27,7 @@ The Listen gem listens to file modifications and notifies you about the changes.
|
|
27
27
|
* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work.
|
28
28
|
* Windows and \*BSD adapter aren't continuously and automatically tested.
|
29
29
|
* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)).
|
30
|
-
* Ruby
|
30
|
+
* Ruby < 2.2.x is no longer supported - upgrade to Ruby 2.2 or 2.3
|
31
31
|
|
32
32
|
Pull requests or help is very welcome for these.
|
33
33
|
|
data/lib/listen.rb
CHANGED
data/lib/listen/adapter.rb
CHANGED
@@ -7,37 +7,39 @@ require 'listen/adapter/windows'
|
|
7
7
|
|
8
8
|
module Listen
|
9
9
|
module Adapter
|
10
|
-
OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows]
|
10
|
+
OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows].freeze
|
11
11
|
POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\
|
12
|
-
'Learn more at https://github.com/guard/listen#listen-adapters.'
|
12
|
+
'Learn more at https://github.com/guard/listen#listen-adapters.'.freeze
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
class << self
|
15
|
+
def select(options = {})
|
16
|
+
_log :debug, 'Adapter: considering polling ...'
|
17
|
+
return Polling if options[:force_polling]
|
18
|
+
_log :debug, 'Adapter: considering optimized backend...'
|
19
|
+
return _usable_adapter_class if _usable_adapter_class
|
20
|
+
_log :debug, 'Adapter: falling back to polling...'
|
21
|
+
_warn_polling_fallback(options)
|
22
|
+
Polling
|
23
|
+
rescue
|
24
|
+
_log :warn, format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect,
|
25
|
+
$ERROR_POSITION * "\n")
|
26
|
+
raise
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
+
private
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
def _usable_adapter_class
|
32
|
+
OPTIMIZED_ADAPTERS.detect(&:usable?)
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
def _warn_polling_fallback(options)
|
36
|
+
msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE)
|
37
|
+
Kernel.warn "[Listen warning]:\n #{msg}" if msg
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
40
|
+
def _log(type, message)
|
41
|
+
Listen::Logger.send(type, message)
|
42
|
+
end
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
data/lib/listen/adapter/base.rb
CHANGED
@@ -8,7 +8,7 @@ module Listen
|
|
8
8
|
attr_reader :options
|
9
9
|
|
10
10
|
# TODO: only used by tests
|
11
|
-
DEFAULTS = {}
|
11
|
+
DEFAULTS = {}.freeze
|
12
12
|
|
13
13
|
attr_reader :config
|
14
14
|
|
@@ -129,8 +129,12 @@ module Listen
|
|
129
129
|
_log(:error, formatted)
|
130
130
|
end
|
131
131
|
|
132
|
-
|
133
|
-
|
132
|
+
class << self
|
133
|
+
private
|
134
|
+
|
135
|
+
def _log(*args, &block)
|
136
|
+
Listen::Logger.send(*args, &block)
|
137
|
+
end
|
134
138
|
end
|
135
139
|
end
|
136
140
|
end
|
data/lib/listen/adapter/bsd.rb
CHANGED
@@ -16,7 +16,7 @@ module Listen
|
|
16
16
|
:rename
|
17
17
|
# :link, :revoke
|
18
18
|
]
|
19
|
-
}
|
19
|
+
}.freeze
|
20
20
|
|
21
21
|
BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
|
22
22
|
Please add the following to your Gemfile to avoid polling for changes:
|
@@ -38,9 +38,9 @@ module Listen
|
|
38
38
|
|
39
39
|
private
|
40
40
|
|
41
|
-
def _configure(directory, &
|
41
|
+
def _configure(directory, &callback)
|
42
42
|
@worker ||= KQueue::Queue.new
|
43
|
-
@callback =
|
43
|
+
@callback = callback
|
44
44
|
# use Record to make a snapshot of dir, so we
|
45
45
|
# can detect new files
|
46
46
|
_find(directory.to_s) { |path| _watch_file(path, @worker) }
|
@@ -11,7 +11,7 @@ module Listen
|
|
11
11
|
def initialize(directories, queue, silencer, adapter_options)
|
12
12
|
# Default to current directory if no directories are supplied
|
13
13
|
directories = [Dir.pwd] if directories.to_a.empty?
|
14
|
-
|
14
|
+
|
15
15
|
# TODO: fix (flatten, array, compact?)
|
16
16
|
@directories = directories.map do |directory|
|
17
17
|
Pathname.new(directory.to_s).realpath
|
@@ -9,7 +9,7 @@ module Listen
|
|
9
9
|
OS_REGEXP = /darwin(?<major_version>1\d+)/i
|
10
10
|
|
11
11
|
# The default delay between checking for changes.
|
12
|
-
DEFAULTS = { latency: 0.1 }
|
12
|
+
DEFAULTS = { latency: 0.1 }.freeze
|
13
13
|
|
14
14
|
INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '')
|
15
15
|
rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8.
|
@@ -23,9 +23,12 @@ module Listen
|
|
23
23
|
|
24
24
|
def self.usable?
|
25
25
|
require 'rb-fsevent'
|
26
|
-
|
27
|
-
return
|
28
|
-
return true if
|
26
|
+
version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version]
|
27
|
+
return false unless version
|
28
|
+
return true if version.to_i >= 13 # darwin13 is OS X 10.9
|
29
|
+
|
30
|
+
fsevent_version = Gem::Version.new(FSEvent::VERSION)
|
31
|
+
return true if fsevent_version <= Gem::Version.new('0.9.4')
|
29
32
|
Kernel.warn INCOMPATIBLE_GEM_VERSION
|
30
33
|
false
|
31
34
|
end
|
@@ -55,7 +58,7 @@ module Listen
|
|
55
58
|
def _process_event(dir, event)
|
56
59
|
_log :debug, "fsevent: processing event: #{event.inspect}"
|
57
60
|
event.each do |path|
|
58
|
-
new_path = Pathname.new(path.sub(
|
61
|
+
new_path = Pathname.new(path.sub(%r{\/$}, ''))
|
59
62
|
_log :debug, "fsevent: #{new_path}"
|
60
63
|
# TODO: does this preserve symlinks?
|
61
64
|
rel_path = new_path.relative_path_from(dir).to_s
|
@@ -67,7 +70,8 @@ module Listen
|
|
67
70
|
_log :debug, "fsevent: running worker: #{worker.inspect}"
|
68
71
|
worker.run
|
69
72
|
rescue
|
70
|
-
|
73
|
+
format_string = 'fsevent: running worker failed: %s:%s called from: %s'
|
74
|
+
_log_exception format_string, caller
|
71
75
|
end
|
72
76
|
|
73
77
|
def _run_workers_in_background(workers)
|
data/lib/listen/adapter/linux.rb
CHANGED
@@ -14,12 +14,12 @@ module Listen
|
|
14
14
|
:close_write
|
15
15
|
],
|
16
16
|
wait_for_delay: 0.1
|
17
|
-
}
|
17
|
+
}.freeze
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
21
|
WIKI_URL = 'https://github.com/guard/listen'\
|
22
|
-
'/wiki/Increasing-the-amount-of-inotify-watchers'
|
22
|
+
'/wiki/Increasing-the-amount-of-inotify-watchers'.freeze
|
23
23
|
|
24
24
|
INOTIFY_LIMIT_MESSAGE = <<-EOS.gsub(/^\s*/, '')
|
25
25
|
FATAL: Listen error: unable to monitor directories for changes.
|
@@ -35,9 +35,7 @@ module Listen
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def _run
|
38
|
-
Thread.current[:listen_blocking_read_thread] = true
|
39
38
|
@worker.run
|
40
|
-
Thread.current[:listen_blocking_read_thread] = false
|
41
39
|
end
|
42
40
|
|
43
41
|
def _process_event(dir, event)
|
@@ -52,10 +50,8 @@ module Listen
|
|
52
50
|
if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT']
|
53
51
|
if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event)
|
54
52
|
rel_path = path.dirname.relative_path_from(dir).to_s
|
55
|
-
_queue_change(:dir, dir, rel_path, {})
|
56
|
-
else
|
57
|
-
_queue_change(:dir, dir, rel_path, {})
|
58
53
|
end
|
54
|
+
_queue_change(:dir, dir, rel_path, {})
|
59
55
|
return
|
60
56
|
end
|
61
57
|
|
@@ -101,7 +97,7 @@ module Listen
|
|
101
97
|
end
|
102
98
|
|
103
99
|
def _stop
|
104
|
-
@worker
|
100
|
+
@worker.close
|
105
101
|
end
|
106
102
|
end
|
107
103
|
end
|
@@ -24,21 +24,21 @@ module Listen
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
def _configure(dir
|
27
|
+
def _configure(dir)
|
28
28
|
require 'wdm'
|
29
29
|
_log :debug, 'wdm - starting...'
|
30
30
|
@worker ||= WDM::Monitor.new
|
31
31
|
@worker.watch_recursively(dir.to_s, :files) do |change|
|
32
|
-
|
32
|
+
yield([:file, change])
|
33
33
|
end
|
34
34
|
|
35
35
|
@worker.watch_recursively(dir.to_s, :directories) do |change|
|
36
|
-
|
36
|
+
yield([:dir, change])
|
37
37
|
end
|
38
38
|
|
39
39
|
events = [:attributes, :last_write]
|
40
40
|
@worker.watch_recursively(dir.to_s, *events) do |change|
|
41
|
-
|
41
|
+
yield([:attr, change])
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -70,7 +70,6 @@ module Listen
|
|
70
70
|
_queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {})
|
71
71
|
elsif change.type == :added
|
72
72
|
_queue_change(:dir, dir, rel_path, {})
|
73
|
-
else
|
74
73
|
# do nothing - changed directory means either:
|
75
74
|
# - removed subdirs (handled above)
|
76
75
|
# - added subdirs (handled above)
|
@@ -81,7 +80,7 @@ module Listen
|
|
81
80
|
end
|
82
81
|
rescue
|
83
82
|
details = event.inspect
|
84
|
-
_log :error, format('wdm - callback (%): %s:%s', details, $ERROR_INFO,
|
83
|
+
_log :error, format('wdm - callback (%s): %s:%s', details, $ERROR_INFO,
|
85
84
|
$ERROR_POSITION * "\n")
|
86
85
|
raise
|
87
86
|
end
|
data/lib/listen/backend.rb
CHANGED
@@ -2,12 +2,12 @@ require 'listen/adapter'
|
|
2
2
|
require 'listen/adapter/base'
|
3
3
|
require 'listen/adapter/config'
|
4
4
|
|
5
|
-
require 'forwardable'
|
6
|
-
|
7
5
|
# This class just aggregates configuration object to avoid Listener specs
|
8
6
|
# from exploding with huge test setup blocks
|
9
7
|
module Listen
|
10
8
|
class Backend
|
9
|
+
extend Forwardable
|
10
|
+
|
11
11
|
def initialize(directories, queue, silencer, config)
|
12
12
|
adapter_select_opts = config.adapter_select_options
|
13
13
|
|
@@ -24,17 +24,10 @@ module Listen
|
|
24
24
|
@adapter = adapter_class.new(aconfig)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def stop
|
32
|
-
adapter.stop
|
33
|
-
end
|
27
|
+
delegate start: :adapter
|
28
|
+
delegate stop: :adapter
|
34
29
|
|
35
|
-
|
36
|
-
@min_delay_between_events
|
37
|
-
end
|
30
|
+
attr_reader :min_delay_between_events
|
38
31
|
|
39
32
|
private
|
40
33
|
|
data/lib/listen/change.rb
CHANGED
@@ -35,7 +35,7 @@ module Listen
|
|
35
35
|
cookie = options[:cookie]
|
36
36
|
|
37
37
|
if !cookie && config.silenced?(rel_path, type)
|
38
|
-
Listen::Logger.debug {
|
38
|
+
Listen::Logger.debug { "(silenced): #{rel_path.inspect}" }
|
39
39
|
return
|
40
40
|
end
|
41
41
|
|
@@ -49,16 +49,14 @@ module Listen
|
|
49
49
|
if change
|
50
50
|
options = cookie ? { cookie: cookie } : {}
|
51
51
|
config.queue(type, change, watched_dir, rel_path, options)
|
52
|
+
elsif type == :dir
|
53
|
+
# NOTE: POSSIBLE RECURSION
|
54
|
+
# TODO: fix - use a queue instead
|
55
|
+
Directory.scan(self, rel_path, options)
|
52
56
|
else
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
Directory.scan(self, rel_path, options)
|
57
|
-
else
|
58
|
-
change = File.change(record, rel_path)
|
59
|
-
return if !change || options[:silence]
|
60
|
-
config.queue(:file, change, watched_dir, rel_path)
|
61
|
-
end
|
57
|
+
change = File.change(record, rel_path)
|
58
|
+
return if !change || options[:silence]
|
59
|
+
config.queue(:file, change, watched_dir, rel_path)
|
62
60
|
end
|
63
61
|
rescue RuntimeError => ex
|
64
62
|
msg = format(
|
data/lib/listen/directory.rb
CHANGED
@@ -12,7 +12,7 @@ module Listen
|
|
12
12
|
|
13
13
|
# TODO: use children(with_directory: false)
|
14
14
|
path = dir + rel_path
|
15
|
-
current = Set.new(
|
15
|
+
current = Set.new(path.children)
|
16
16
|
|
17
17
|
Listen::Logger.debug do
|
18
18
|
format('%s: %s(%s): %s -> %s',
|
@@ -28,7 +28,7 @@ module Listen
|
|
28
28
|
end
|
29
29
|
rescue Errno::ENOENT
|
30
30
|
# The directory changed meanwhile, so rescan it
|
31
|
-
current = Set.new(
|
31
|
+
current = Set.new(path.children)
|
32
32
|
retry
|
33
33
|
end
|
34
34
|
|
@@ -72,16 +72,5 @@ module Listen
|
|
72
72
|
opts.delete(:recursive)
|
73
73
|
snapshot.invalidate(type, path, opts)
|
74
74
|
end
|
75
|
-
|
76
|
-
def self._children(path)
|
77
|
-
return path.children unless RUBY_ENGINE == 'jruby'
|
78
|
-
|
79
|
-
# JRuby inconsistency workaround, see:
|
80
|
-
# https://github.com/jruby/jruby/issues/3840
|
81
|
-
exists = path.exist?
|
82
|
-
directory = path.directory?
|
83
|
-
return path.children unless (exists && !directory)
|
84
|
-
raise Errno::ENOTDIR, path.to_s
|
85
|
-
end
|
86
75
|
end
|
87
76
|
end
|
data/lib/listen/event/config.rb
CHANGED
@@ -27,9 +27,7 @@ module Listen
|
|
27
27
|
Time.now.to_f
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
@event_queue
|
32
|
-
end
|
30
|
+
attr_reader :event_queue
|
33
31
|
|
34
32
|
def callable?
|
35
33
|
@block
|
@@ -39,9 +37,7 @@ module Listen
|
|
39
37
|
@queue_optimizer.smoosh_changes(changes)
|
40
38
|
end
|
41
39
|
|
42
|
-
|
43
|
-
@min_delay_between_events
|
44
|
-
end
|
40
|
+
attr_reader :min_delay_between_events
|
45
41
|
|
46
42
|
def stopped?
|
47
43
|
listener.state == :stopped
|
data/lib/listen/event/queue.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'thread'
|
2
2
|
|
3
|
-
require 'forwardable'
|
4
|
-
|
5
3
|
module Listen
|
6
4
|
module Event
|
7
5
|
class Queue
|
6
|
+
extend Forwardable
|
7
|
+
|
8
8
|
class Config
|
9
9
|
def initialize(relative)
|
10
10
|
@relative = relative
|
@@ -33,13 +33,8 @@ module Listen
|
|
33
33
|
block.call(args) if block
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def pop
|
41
|
-
event_queue.pop
|
42
|
-
end
|
36
|
+
delegate empty?: :event_queue
|
37
|
+
delegate pop: :event_queue
|
43
38
|
|
44
39
|
private
|
45
40
|
|
data/lib/listen/file.rb
CHANGED
@@ -26,7 +26,7 @@ module Listen
|
|
26
26
|
end
|
27
27
|
|
28
28
|
return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING']
|
29
|
-
return unless
|
29
|
+
return unless inaccurate_mac_time?(lstat)
|
30
30
|
|
31
31
|
# Check if change happened within 1 second (maybe it's even
|
32
32
|
# too much, e.g. 0.3-0.5 could be sufficient).
|
data/lib/listen/fsm.rb
CHANGED
@@ -111,7 +111,8 @@ module Listen
|
|
111
111
|
attr_reader :name, :transitions
|
112
112
|
|
113
113
|
def initialize(name, transitions = nil, &block)
|
114
|
-
@name
|
114
|
+
@name = name
|
115
|
+
@block = block
|
115
116
|
@transitions = nil
|
116
117
|
@transitions = Array(transitions).map(&:to_sym) if transitions
|
117
118
|
end
|
@@ -13,16 +13,8 @@ module Listen
|
|
13
13
|
return if @threads.empty? # return to avoid using possibly stubbed Queue
|
14
14
|
|
15
15
|
killed = Queue.new
|
16
|
-
# You can't kill a read on a descriptor in JRuby, so let's just
|
17
|
-
# ignore running threads (listen rb-inotify waiting for disk activity
|
18
|
-
# before closing) pray threads die faster than they are created...
|
19
|
-
limit = RUBY_ENGINE == 'jruby' ? [1] : []
|
20
|
-
|
21
16
|
killed << @threads.pop.kill until @threads.empty?
|
22
|
-
until killed.empty?
|
23
|
-
th = killed.pop
|
24
|
-
th.join(*limit) unless th[:listen_blocking_read_thread]
|
25
|
-
end
|
17
|
+
killed.pop.join until killed.empty?
|
26
18
|
end
|
27
19
|
end
|
28
20
|
end
|
data/lib/listen/listener.rb
CHANGED
@@ -61,13 +61,13 @@ module Listen
|
|
61
61
|
|
62
62
|
default_state :initializing
|
63
63
|
|
64
|
-
state :initializing, to:
|
64
|
+
state :initializing, to: :backend_started
|
65
65
|
|
66
|
-
state :backend_started, to: [:frontend_ready
|
66
|
+
state :backend_started, to: [:frontend_ready] do
|
67
67
|
backend.start
|
68
68
|
end
|
69
69
|
|
70
|
-
state :frontend_ready, to: [:processing_events
|
70
|
+
state :frontend_ready, to: [:processing_events] do
|
71
71
|
processor.setup
|
72
72
|
end
|
73
73
|
|
@@ -10,7 +10,7 @@ module Listen
|
|
10
10
|
# Backend selecting options
|
11
11
|
force_polling: false,
|
12
12
|
polling_fallback_message: nil
|
13
|
-
}
|
13
|
+
}.freeze
|
14
14
|
|
15
15
|
def initialize(opts)
|
16
16
|
@options = DEFAULTS.merge(opts)
|
@@ -23,13 +23,9 @@ module Listen
|
|
23
23
|
@relative
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
@min_delay_between_events
|
28
|
-
end
|
26
|
+
attr_reader :min_delay_between_events
|
29
27
|
|
30
|
-
|
31
|
-
@silencer_rules
|
32
|
-
end
|
28
|
+
attr_reader :silencer_rules
|
33
29
|
|
34
30
|
def adapter_instance_options(klass)
|
35
31
|
valid_keys = klass.const_get('DEFAULTS').keys
|
@@ -88,7 +88,7 @@ module Listen
|
|
88
88
|
# editor rename() call (e.g. Kate and Sublime)
|
89
89
|
def _reinterpret_related_changes(cookies)
|
90
90
|
table = { moved_to: :added, moved_from: :removed }
|
91
|
-
cookies.
|
91
|
+
cookies.flat_map do |_, changes|
|
92
92
|
data = _detect_possible_editor_save(changes)
|
93
93
|
if data
|
94
94
|
to_dir, to_file = data
|
@@ -101,7 +101,7 @@ module Listen
|
|
101
101
|
[table.fetch(change, change), dir, path]
|
102
102
|
end
|
103
103
|
end
|
104
|
-
end
|
104
|
+
end
|
105
105
|
end
|
106
106
|
|
107
107
|
def _detect_possible_editor_save(changes)
|
@@ -113,9 +113,9 @@ module Listen
|
|
113
113
|
changes.each do |data|
|
114
114
|
case data[1]
|
115
115
|
when :moved_from
|
116
|
-
from_type, from_change, _, from,
|
116
|
+
from_type, from_change, _, from, = data
|
117
117
|
when :moved_to
|
118
|
-
to_type, to_change, to_dir, to,
|
118
|
+
to_type, to_change, to_dir, to, = data
|
119
119
|
else
|
120
120
|
return nil
|
121
121
|
end
|
data/lib/listen/record.rb
CHANGED
data/lib/listen/record/entry.rb
CHANGED
@@ -6,14 +6,16 @@ module Listen
|
|
6
6
|
# file: "/home/me/watched_dir", "app/models", "foo.rb"
|
7
7
|
# dir, "/home/me/watched_dir", "."
|
8
8
|
def initialize(root, relative, name = nil)
|
9
|
-
@root
|
9
|
+
@root = root
|
10
|
+
@relative = relative
|
11
|
+
@name = name
|
10
12
|
end
|
11
13
|
|
12
14
|
attr_reader :root, :relative, :name
|
13
15
|
|
14
16
|
def children
|
15
17
|
child_relative = _join
|
16
|
-
(
|
18
|
+
(Dir.entries(sys_path) - %w(. ..)).map do |name|
|
17
19
|
Entry.new(@root, child_relative, name)
|
18
20
|
end
|
19
21
|
end
|
@@ -46,17 +48,6 @@ module Listen
|
|
46
48
|
args = [@relative, @name].compact
|
47
49
|
args.empty? ? nil : ::File.join(*args)
|
48
50
|
end
|
49
|
-
|
50
|
-
def _entries(dir)
|
51
|
-
return Dir.entries(dir) unless RUBY_ENGINE == 'jruby'
|
52
|
-
|
53
|
-
# JRuby inconsistency workaround, see:
|
54
|
-
# https://github.com/jruby/jruby/issues/3840
|
55
|
-
exists = ::File.exist?(dir)
|
56
|
-
directory = ::File.directory?(dir)
|
57
|
-
return Dir.entries(dir) unless (exists && !directory)
|
58
|
-
raise Errno::ENOTDIR, dir
|
59
|
-
end
|
60
51
|
end
|
61
52
|
end
|
62
53
|
end
|
@@ -4,9 +4,9 @@ module Listen
|
|
4
4
|
# @private api
|
5
5
|
class Record
|
6
6
|
class SymlinkDetector
|
7
|
-
WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors'
|
7
|
+
WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors'.freeze
|
8
8
|
|
9
|
-
SYMLINK_LOOP_ERROR = <<-EOS
|
9
|
+
SYMLINK_LOOP_ERROR = <<-EOS.freeze
|
10
10
|
** ERROR: directory is already being watched! **
|
11
11
|
|
12
12
|
Directory: %s
|
data/lib/listen/silencer.rb
CHANGED
@@ -15,7 +15,7 @@ module Listen
|
|
15
15
|
)(/|$)}x
|
16
16
|
|
17
17
|
# The default list of files that get ignored.
|
18
|
-
DEFAULT_IGNORED_EXTENSIONS
|
18
|
+
DEFAULT_IGNORED_EXTENSIONS = %r{(?:
|
19
19
|
# Kate's tmp\/swp files
|
20
20
|
\..*\d+\.new
|
21
21
|
| \.kate-swp
|
@@ -50,7 +50,7 @@ module Listen
|
|
50
50
|
| \.DS_Store
|
51
51
|
| \.tmp
|
52
52
|
| ~
|
53
|
-
)
|
53
|
+
)$}x
|
54
54
|
|
55
55
|
attr_accessor :only_patterns, :ignore_patterns
|
56
56
|
|
data/lib/listen/version.rb
CHANGED
metadata
CHANGED
@@ -1,42 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: listen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thibaud Guillaume-Gentil
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb-fsevent
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.9'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.9.
|
19
|
+
version: 0.9.3
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.9'
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.9.
|
26
|
+
version: 0.9.3
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rb-inotify
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0.9'
|
40
31
|
- - ">="
|
41
32
|
- !ruby/object:Gem::Version
|
42
33
|
version: 0.9.7
|
@@ -44,9 +35,6 @@ dependencies:
|
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
46
37
|
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '0.9'
|
50
38
|
- - ">="
|
51
39
|
- !ruby/object:Gem::Version
|
52
40
|
version: 0.9.7
|
@@ -118,9 +106,9 @@ require_paths:
|
|
118
106
|
- lib
|
119
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
108
|
requirements:
|
121
|
-
- - "
|
109
|
+
- - "~>"
|
122
110
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
111
|
+
version: '2.2'
|
124
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
113
|
requirements:
|
126
114
|
- - ">="
|
@@ -128,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
116
|
version: '0'
|
129
117
|
requirements: []
|
130
118
|
rubyforge_project:
|
131
|
-
rubygems_version: 2.
|
119
|
+
rubygems_version: 2.4.8
|
132
120
|
signing_key:
|
133
121
|
specification_version: 4
|
134
122
|
summary: Listen to file modifications
|