driskell-listen 3.0.6.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1 -0
- data/CONTRIBUTING.md +38 -0
- data/LICENSE.txt +22 -0
- data/README.md +293 -0
- data/bin/driskell-listen +12 -0
- data/lib/driskell-listen.rb +61 -0
- data/lib/driskell-listen/adapter.rb +44 -0
- data/lib/driskell-listen/adapter/base.rb +147 -0
- data/lib/driskell-listen/adapter/bsd.rb +106 -0
- data/lib/driskell-listen/adapter/config.rb +26 -0
- data/lib/driskell-listen/adapter/darwin.rb +71 -0
- data/lib/driskell-listen/adapter/linux.rb +96 -0
- data/lib/driskell-listen/adapter/polling.rb +37 -0
- data/lib/driskell-listen/adapter/simulated_darwin.rb +65 -0
- data/lib/driskell-listen/adapter/windows.rb +99 -0
- data/lib/driskell-listen/backend.rb +45 -0
- data/lib/driskell-listen/change.rb +80 -0
- data/lib/driskell-listen/cli.rb +65 -0
- data/lib/driskell-listen/directory.rb +83 -0
- data/lib/driskell-listen/event/config.rb +59 -0
- data/lib/driskell-listen/event/loop.rb +117 -0
- data/lib/driskell-listen/event/processor.rb +122 -0
- data/lib/driskell-listen/event/queue.rb +56 -0
- data/lib/driskell-listen/file.rb +80 -0
- data/lib/driskell-listen/fsm.rb +131 -0
- data/lib/driskell-listen/internals/thread_pool.rb +21 -0
- data/lib/driskell-listen/listener.rb +132 -0
- data/lib/driskell-listen/listener/config.rb +45 -0
- data/lib/driskell-listen/logger.rb +32 -0
- data/lib/driskell-listen/options.rb +23 -0
- data/lib/driskell-listen/queue_optimizer.rb +132 -0
- data/lib/driskell-listen/record.rb +104 -0
- data/lib/driskell-listen/record/entry.rb +56 -0
- data/lib/driskell-listen/silencer.rb +97 -0
- data/lib/driskell-listen/silencer/controller.rb +48 -0
- data/lib/driskell-listen/version.rb +5 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1b754e9ebee0d0d18528b37fce13049f588fcd6b
|
4
|
+
data.tar.gz: a60593e7ee856b6b283c3745581efd3a6c6d7d6c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 45d904cf82eb65198fa77a329dfcec72605c88bcabdd7adfff755e2e10b39bab31b5969296cc4b6520d958be335d448d5252a36f53a5bdfcceada4be641d7251
|
7
|
+
data.tar.gz: f979e13bfd024ebaff176e4079af627d8e3fdb0821040d35ebee7a05823f07ae242712c6f3db293e53ea90e2438087c15b7c5d3d6f59fdc75c950cfc8c588c49
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Moved to [GitHub releases](https://github.com/guard/listen/releases) page.
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
Contribute to Listen
|
2
|
+
===================
|
3
|
+
|
4
|
+
File an issue
|
5
|
+
-------------
|
6
|
+
|
7
|
+
If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for known issues, solutions and workarounds.
|
8
|
+
|
9
|
+
You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues).
|
10
|
+
|
11
|
+
**Please don't ask question in the issue tracker**, instead ask them in our
|
12
|
+
[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
|
13
|
+
|
14
|
+
Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard?
|
15
|
+
|
16
|
+
|
17
|
+
**It's most likely that your bug gets resolved faster if you provide as much information as possible!**
|
18
|
+
|
19
|
+
The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for details.
|
20
|
+
|
21
|
+
|
22
|
+
Development
|
23
|
+
-----------
|
24
|
+
|
25
|
+
* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
|
26
|
+
* Source hosted at [GitHub](https://github.com/guard/listen).
|
27
|
+
|
28
|
+
Pull requests are very welcome! Please try to follow these simple rules if applicable:
|
29
|
+
|
30
|
+
* Please create a topic branch for every separate change you make.
|
31
|
+
* Make sure your patches are well tested. All specs run with `rake spec` must pass.
|
32
|
+
* Update the [Yard](http://yardoc.org/) documentation.
|
33
|
+
* Update the [README](https://github.com/guard/listen/blob/master/README.md).
|
34
|
+
* Update the [CHANGELOG](https://github.com/guard/listen/blob/master/CHANGELOG.md) for noteworthy changes.
|
35
|
+
* Please **do not change** the version number.
|
36
|
+
|
37
|
+
For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
|
38
|
+
`#guard` (irc.freenode.net).
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Thibaud Guillaume-Gentil
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,293 @@
|
|
1
|
+
:exclamation: Listen is currently accepting more maintainers. Please [read this](https://github.com/guard/guard/wiki/Maintainers) if you're interested in joining the team.
|
2
|
+
|
3
|
+
# Listen
|
4
|
+
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/listen.png)](http://badge.fury.io/rb/listen) [![Build Status](https://travis-ci.org/guard/listen.png)](https://travis-ci.org/guard/listen) [![Dependency Status](https://gemnasium.com/guard/listen.png)](https://gemnasium.com/guard/listen) [![Code Climate](https://codeclimate.com/github/guard/listen.png)](https://codeclimate.com/github/guard/listen) [![Coverage Status](https://coveralls.io/repos/guard/listen/badge.png?branch=master)](https://coveralls.io/r/guard/listen)
|
6
|
+
|
7
|
+
The Listen gem listens to file modifications and notifies you about the changes.
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below.
|
12
|
+
* Detects file modification, addition and removal.
|
13
|
+
* You can watch multiple directories.
|
14
|
+
* Regexp-patterns for ignoring paths for more accuracy and speed
|
15
|
+
* Increased change detection accuracy on OS X HFS and VFAT volumes.
|
16
|
+
* Tested on MRI Ruby environments (2.0+ only) via [Travis CI](https://travis-ci.org/guard/listen),
|
17
|
+
|
18
|
+
## Issues / limitations
|
19
|
+
|
20
|
+
* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)):
|
21
|
+
* Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)).
|
22
|
+
* Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273)- see [Duplicate directory errors](https://github.com/guard/listen/wiki/Duplicate-directory-errors)).
|
23
|
+
* No directory/adapter-specific configuration options.
|
24
|
+
* Support for plugins planned for future.
|
25
|
+
* TCP functionality was removed in Listen [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`.
|
26
|
+
* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.).
|
27
|
+
* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work.
|
28
|
+
* Windows and \*BSD adapter aren't continuously and automatically tested.
|
29
|
+
* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)).
|
30
|
+
* Ruby 1.9.3 is no longer maintained (and may not work with Listen) - it's best to upgrade to Ruby 2.2.2.
|
31
|
+
|
32
|
+
Pull requests or help is very welcome for these.
|
33
|
+
|
34
|
+
## Install
|
35
|
+
|
36
|
+
The simplest way to install Listen is to use [Bundler](http://bundler.io).
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
gem 'listen', '~> 3.0' # NOTE: for TCP functionality, use '~> 2.10' for now
|
40
|
+
```
|
41
|
+
|
42
|
+
## Usage
|
43
|
+
|
44
|
+
Call `Listen.to` with either a single directory or multiple directories, then define the "changes" callback in a block.
|
45
|
+
|
46
|
+
``` ruby
|
47
|
+
listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
|
48
|
+
puts "modified absolute path: #{modified}"
|
49
|
+
puts "added absolute path: #{added}"
|
50
|
+
puts "removed absolute path: #{removed}"
|
51
|
+
end
|
52
|
+
listener.start # not blocking
|
53
|
+
sleep
|
54
|
+
```
|
55
|
+
|
56
|
+
### Pause / unpause / stop
|
57
|
+
|
58
|
+
Listeners can also be easily paused/unpaused:
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' }
|
62
|
+
|
63
|
+
listener.start
|
64
|
+
listener.paused? # => false
|
65
|
+
listener.processing? # => true
|
66
|
+
|
67
|
+
listener.pause # stops processing changes (but keeps on collecting them)
|
68
|
+
listener.paused? # => true
|
69
|
+
listener.processing? # => false
|
70
|
+
|
71
|
+
listener.unpause # resumes processing changes ("start" would do the same)
|
72
|
+
listener.stop # stop both listening to changes and processing them
|
73
|
+
```
|
74
|
+
|
75
|
+
Note: While paused, Listen keeps on collecting changes in the background - to clear them, call "stop"
|
76
|
+
|
77
|
+
Note: You should keep track of all started listeners and stop them properly on finish.
|
78
|
+
|
79
|
+
### Ignore / ignore!
|
80
|
+
|
81
|
+
Listen ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer), you can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method.
|
82
|
+
|
83
|
+
``` ruby
|
84
|
+
listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... }
|
85
|
+
listener.start
|
86
|
+
listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension.
|
87
|
+
listener.ignore /\.rb/ # ignore rb extension in addition of pkg.
|
88
|
+
sleep
|
89
|
+
```
|
90
|
+
|
91
|
+
Note: `:ignore` regexp patterns are evaluated against relative paths.
|
92
|
+
|
93
|
+
Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274))
|
94
|
+
|
95
|
+
### Only
|
96
|
+
|
97
|
+
Listen catches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method.
|
98
|
+
|
99
|
+
``` ruby
|
100
|
+
listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... }
|
101
|
+
listener.start
|
102
|
+
listener.only /_spec\.rb$/ # overwrite all existing only patterns.
|
103
|
+
sleep
|
104
|
+
```
|
105
|
+
|
106
|
+
Note: `:only` regexp patterns are evaluated only against relative **file** paths.
|
107
|
+
|
108
|
+
|
109
|
+
## Changes callback
|
110
|
+
|
111
|
+
Changes to the listened-to directories gets reported back to the user in a callback.
|
112
|
+
The registered callback gets invoked, when there are changes, with **three** parameters:
|
113
|
+
`modified`, `added` and `removed` paths, in that particular order.
|
114
|
+
Paths are always returned in their absolute form.
|
115
|
+
|
116
|
+
Example:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
listener = Listen.to('path/to/app') do |modified, added, removed|
|
120
|
+
# This block will be called when there are changes.
|
121
|
+
end
|
122
|
+
listener.start
|
123
|
+
sleep
|
124
|
+
```
|
125
|
+
|
126
|
+
or ...
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
# Create a callback
|
130
|
+
callback = Proc.new do |modified, added, removed|
|
131
|
+
# This proc will be called when there are changes.
|
132
|
+
end
|
133
|
+
listener = Listen.to('dir', &callback)
|
134
|
+
listener.start
|
135
|
+
sleep
|
136
|
+
```
|
137
|
+
|
138
|
+
## Options
|
139
|
+
|
140
|
+
All the following options can be set through the `Listen.to` after the directory path(s) params.
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/] # Ignore a list of paths
|
144
|
+
# default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer
|
145
|
+
|
146
|
+
ignore!: %r{/foo/bar} # Same as ignore options, but overwrite default ignored paths.
|
147
|
+
|
148
|
+
only: %r{.rb$} # Only listen to specific files
|
149
|
+
# default: none
|
150
|
+
|
151
|
+
latency: 0.5 # Set the delay (**in seconds**) between checking for changes
|
152
|
+
# default: 0.25 sec (1.0 sec for polling)
|
153
|
+
|
154
|
+
wait_for_delay: 4 # Set the delay (**in seconds**) between calls to the callback when changes exist
|
155
|
+
# default: 0.10 sec
|
156
|
+
|
157
|
+
force_polling: true # Force the use of the polling adapter
|
158
|
+
# default: none
|
159
|
+
|
160
|
+
relative: false # Whether changes should be relative to current dir or not
|
161
|
+
# default: false
|
162
|
+
|
163
|
+
polling_fallback_message: 'custom message' # Set a custom polling fallback message (or disable it with false)
|
164
|
+
# default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters."
|
165
|
+
```
|
166
|
+
|
167
|
+
## Debugging
|
168
|
+
|
169
|
+
Setting the environment variable `LISTEN_GEM_DEBUGGING=1` sets up the INFO level logger, while `LISTEN_GEM_DEBUGGING=2` sets up the DEBUG level logger.
|
170
|
+
|
171
|
+
You can also set `Listen.logger` to a custom logger.
|
172
|
+
|
173
|
+
|
174
|
+
## Listen adapters
|
175
|
+
|
176
|
+
The Listen gem has a set of adapters to notify it when there are changes.
|
177
|
+
|
178
|
+
There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows.
|
179
|
+
These adapters are fast as they use some system-calls to implement the notifying function.
|
180
|
+
|
181
|
+
There is also a polling adapter - although it's much slower than other adapters,
|
182
|
+
it works on every platform/system and scenario (including network filesystems such as VM shared folders).
|
183
|
+
|
184
|
+
The Darwin and Linux adapters are dependencies of the Listen gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below.
|
185
|
+
|
186
|
+
The Listen gem will choose the best adapter automatically, if present. If you
|
187
|
+
want to force the use of the polling adapter, use the `:force_polling` option
|
188
|
+
while initializing the listener.
|
189
|
+
|
190
|
+
### On Windows
|
191
|
+
|
192
|
+
If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling.
|
193
|
+
|
194
|
+
Please add the following to your Gemfile:
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
|
198
|
+
```
|
199
|
+
|
200
|
+
### On \*BSD
|
201
|
+
|
202
|
+
If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling.
|
203
|
+
|
204
|
+
Please add the following to your Gemfile:
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
require 'rbconfig'
|
208
|
+
if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i
|
209
|
+
gem 'rb-kqueue', '>= 0.2'
|
210
|
+
end
|
211
|
+
|
212
|
+
```
|
213
|
+
|
214
|
+
### Getting the [polling fallback message](#options)?
|
215
|
+
|
216
|
+
Please visit the [installation section of the Listen WIKI](https://github.com/guard/listen/wiki#installation) for more information and options for potential fixes.
|
217
|
+
|
218
|
+
### Issues and troubleshooting
|
219
|
+
|
220
|
+
*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=1` environment variable, it can be almost impossible to guess why listen is not working as expected.*
|
221
|
+
|
222
|
+
See [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting)
|
223
|
+
|
224
|
+
## Performance
|
225
|
+
|
226
|
+
If Listen seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are).
|
227
|
+
|
228
|
+
Also, if the directories you're watching contain many files, make sure you're:
|
229
|
+
|
230
|
+
* not using Polling (ideally)
|
231
|
+
* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS)
|
232
|
+
* running Listen with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs)
|
233
|
+
* not watching directories with log files, database files or other frequently changing files
|
234
|
+
* not using a version of Listen prior to 2.7.7
|
235
|
+
* not getting silent crashes within Listen (see LISTEN_GEM_DEBUGGING=2)
|
236
|
+
* not running multiple instances of Listen in the background
|
237
|
+
* using a file system with atime modification disabled (ideally)
|
238
|
+
* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT
|
239
|
+
* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output)
|
240
|
+
* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs
|
241
|
+
|
242
|
+
When in doubt, LISTEN_GEM_DEBUGGING=2 can help discover the actual events and time they happened.
|
243
|
+
|
244
|
+
See also [Tips and Techniques](https://github.com/guard/listen/wiki/Tips-and-Techniques).
|
245
|
+
|
246
|
+
## Development
|
247
|
+
|
248
|
+
* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
|
249
|
+
* Source hosted at [GitHub](https://github.com/guard/listen).
|
250
|
+
|
251
|
+
Pull requests are very welcome! Please try to follow these simple rules if applicable:
|
252
|
+
|
253
|
+
* Please create a topic branch for every separate change you make.
|
254
|
+
* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen).
|
255
|
+
* Update the [Yard](http://yardoc.org/) documentation.
|
256
|
+
* Update the [README](https://github.com/guard/listen/blob/master/README.md).
|
257
|
+
* Please **do not change** the version number.
|
258
|
+
|
259
|
+
For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
|
260
|
+
`#guard` (irc.freenode.net).
|
261
|
+
|
262
|
+
## Acknowledgments
|
263
|
+
|
264
|
+
* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f).
|
265
|
+
* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][].
|
266
|
+
* [Nathan Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper.
|
267
|
+
* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper.
|
268
|
+
* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him.
|
269
|
+
* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration.
|
270
|
+
|
271
|
+
## Author
|
272
|
+
|
273
|
+
[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg))
|
274
|
+
|
275
|
+
## Contributors
|
276
|
+
|
277
|
+
[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors)
|
278
|
+
|
279
|
+
[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg
|
280
|
+
[Maher Sallam]: https://github.com/Maher4Ever
|
281
|
+
[Michael Kessler (netzpirat)]: https://github.com/netzpirat
|
282
|
+
[Travis Tilley (ttilley)]: https://github.com/ttilley
|
283
|
+
[fssm]: https://github.com/ttilley/fssm
|
284
|
+
[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent
|
285
|
+
[Mathieu Arnold (mat813)]: https://github.com/mat813
|
286
|
+
[Nathan Weizenbaum (nex3)]: https://github.com/nex3
|
287
|
+
[rb-inotify]: https://github.com/nex3/rb-inotify
|
288
|
+
[stereobooster]: https://github.com/stereobooster
|
289
|
+
[rb-fchange]: https://github.com/stereobooster/rb-fchange
|
290
|
+
[rb-kqueue]: https://github.com/mat813/rb-kqueue
|
291
|
+
[Yehuda Katz (wycats)]: https://github.com/wycats
|
292
|
+
[vigilo]: https://github.com/wycats/vigilo
|
293
|
+
[wdm]: https://github.com/Maher4Ever/wdm
|
data/bin/driskell-listen
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Driskell
|
4
|
+
module Listen
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'driskell-listen/logger'
|
9
|
+
require 'driskell-listen/listener'
|
10
|
+
|
11
|
+
require 'driskell-listen/internals/thread_pool'
|
12
|
+
|
13
|
+
# Always set up logging by default first time file is required
|
14
|
+
#
|
15
|
+
# NOTE: If you need to clear the logger completely, do so *after*
|
16
|
+
# requiring this file. If you need to set a custom logger,
|
17
|
+
# require the listen/logger file and set the logger before requiring
|
18
|
+
# this file.
|
19
|
+
Driskell::Listen.setup_default_logger_if_unset
|
20
|
+
|
21
|
+
# Won't print anything by default because of level - unless you've set
|
22
|
+
# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level
|
23
|
+
Driskell::Listen::Logger.info "Listen loglevel set to: #{Driskell::Listen.logger.level}"
|
24
|
+
Driskell::Listen::Logger.info "Listen version: #{Driskell::Listen::VERSION}"
|
25
|
+
|
26
|
+
module Driskell::Listen
|
27
|
+
class << self
|
28
|
+
# Listens to file system modifications on a either single directory or
|
29
|
+
# multiple directories.
|
30
|
+
#
|
31
|
+
# @param (see Driskell::Listen::Listener#new)
|
32
|
+
#
|
33
|
+
# @yield [modified, added, removed] the changed files
|
34
|
+
# @yieldparam [Array<String>] modified the list of modified files
|
35
|
+
# @yieldparam [Array<String>] added the list of added files
|
36
|
+
# @yieldparam [Array<String>] removed the list of removed files
|
37
|
+
#
|
38
|
+
# @return [Driskell::Listen::Listener] the listener
|
39
|
+
#
|
40
|
+
def to(*args, &block)
|
41
|
+
@listeners ||= []
|
42
|
+
Listener.new(*args, &block).tap do |listener|
|
43
|
+
@listeners << listener
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# This is used by the `listen` binary to handle Ctrl-C
|
48
|
+
#
|
49
|
+
def stop
|
50
|
+
Internals::ThreadPool.stop
|
51
|
+
@listeners ||= []
|
52
|
+
|
53
|
+
# TODO: should use a mutex for this
|
54
|
+
@listeners.each do |listener|
|
55
|
+
# call stop to halt the main loop
|
56
|
+
listener.stop
|
57
|
+
end
|
58
|
+
@listeners = nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'driskell-listen/adapter/base'
|
2
|
+
require 'driskell-listen/adapter/bsd'
|
3
|
+
require 'driskell-listen/adapter/darwin'
|
4
|
+
require 'driskell-listen/adapter/linux'
|
5
|
+
require 'driskell-listen/adapter/polling'
|
6
|
+
require 'driskell-listen/adapter/windows'
|
7
|
+
require 'driskell-listen/adapter/simulated_darwin'
|
8
|
+
|
9
|
+
module Driskell::Listen
|
10
|
+
module Adapter
|
11
|
+
OPTIMIZED_ADAPTERS = [Darwin, SimulatedDarwin, Linux, BSD, Windows]
|
12
|
+
POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\
|
13
|
+
'Learn more at https://github.com/guard/listen#listen-adapters.'
|
14
|
+
|
15
|
+
def self.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
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def self._usable_adapter_class
|
32
|
+
OPTIMIZED_ADAPTERS.detect(&:usable?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self._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
|
39
|
+
|
40
|
+
def self._log(type, message)
|
41
|
+
Driskell::Listen::Logger.send(type, message)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|