vagrant-fsnotify 0.0.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/AUTHORS +5 -0
- data/CHANGELOG.md +38 -0
- data/Gemfile +1 -1
- data/README.md +157 -1
- data/lib/vagrant-fsnotify/command-fsnotify.rb +70 -5
- data/lib/vagrant-fsnotify/plugin.rb +6 -2
- data/lib/vagrant-fsnotify/version.rb +1 -1
- data/vagrant-fsnotify.gemspec +2 -4
- metadata +16 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 461039d21338e7042fb005d2490fa17fc369089e
|
4
|
+
data.tar.gz: 16699e1e2d069a0e4c81ef954903a44f77e6a7cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0626b5ee3d78752b6745f8531ed3b24a35430f34620c1a4feb9336a97ecbe78e794d5d6dff50af62f1a2c99f278ffd106a68f1f32747b90265200cf26d95d39f
|
7
|
+
data.tar.gz: e627af659185f6a19fda0436e87dcc2d44e1bccf1e3df1b0ade9fd07884028f9929eccce88237c9859897360c500090bf64d2b2e511eefeec4001ec4a16bcb50
|
data/AUTHORS
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
0.2.0 - 2015-07-14
|
2
|
+
==================
|
3
|
+
- *Breaking change:* Minimum required Vagrant version changed to 1.7.3+
|
4
|
+
- Fixed a dependency issue with celluloid (#10, @leafac)
|
5
|
+
|
6
|
+
0.1.1 - 2015-07-05 (yanked)
|
7
|
+
===========================
|
8
|
+
Note: This release was yanked due to a dependency issue, see #9
|
9
|
+
- Added command synopsis (#7, @leafac)
|
10
|
+
- Fix issue with vagrant runtime dependency on celluloid (#8, @leafac)
|
11
|
+
|
12
|
+
0.1.0 - 2015-07-05 (yanked)
|
13
|
+
===========================
|
14
|
+
Note: This release was yanked due to a dependency issue, see #9
|
15
|
+
- *Breaking change:* Added support for forwading file addition/removal (#6, @leafac)
|
16
|
+
- Depend on `vagrant` rather than `listen` for better compatibility with upstream (#5, @leafac)
|
17
|
+
- Added documentation (#3 & #4, @leafac)
|
18
|
+
|
19
|
+
0.0.6 - 2015-04-16
|
20
|
+
==================
|
21
|
+
- Fix multimachine use, allow specifying which machine to target (@elskwid)
|
22
|
+
|
23
|
+
0.0.5 - 2015-04-11
|
24
|
+
==================
|
25
|
+
- Fix `listen` dependency
|
26
|
+
|
27
|
+
0.0.4 - 2014-08-18
|
28
|
+
==================
|
29
|
+
- Uses access time modification, rather than modified time
|
30
|
+
|
31
|
+
0.0.3 - 2014-08-15
|
32
|
+
==================
|
33
|
+
- Allow guest path overriding
|
34
|
+
|
35
|
+
|
36
|
+
0.0.2 - 2014-08-15
|
37
|
+
==================
|
38
|
+
- Increase the delay between changes to 2 seconds
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,160 @@
|
|
1
1
|
vagrant-fsnotify
|
2
2
|
================
|
3
3
|
|
4
|
-
Forward filesystem change notifications to your Vagrant VM
|
4
|
+
Forward filesystem change notifications to your [Vagrant][vagrant] VM.
|
5
|
+
|
6
|
+
Problem
|
7
|
+
-------
|
8
|
+
|
9
|
+
Some filesystems (e.g. ext4, HFS+) have a feature of event notification.
|
10
|
+
Interested applications can subscribe and are notified when filesystem events
|
11
|
+
happen (e.g. a file was created, modified or deleted).
|
12
|
+
|
13
|
+
Applications can make use of this system to provide features such as auto-reload
|
14
|
+
or live updates. For example, [Jekyll][jekyll] regenerates the static website
|
15
|
+
and [Guard][guard] triggers a test run or a build when source files are
|
16
|
+
modified.
|
17
|
+
|
18
|
+
Unfortunately, [Vagrant][vagrant] users have a hard time making use of these
|
19
|
+
features when the application is running inside a virtual machine. When the file
|
20
|
+
is modified on the host, the event is not propagated to the guest and the
|
21
|
+
auto-reload never happens.
|
22
|
+
|
23
|
+
There are several bug reports related to this issue:
|
24
|
+
|
25
|
+
- <https://www.virtualbox.org/ticket/10660>
|
26
|
+
- <https://github.com/guard/listen/issues/53>
|
27
|
+
- <https://github.com/guard/listen/issues/57>
|
28
|
+
- <https://github.com/guard/guard/issues/269>
|
29
|
+
- <https://github.com/mitchellh/vagrant/issues/707>
|
30
|
+
|
31
|
+
There are two generally accepted solutions. The first is fall back to long
|
32
|
+
polling, the other is to
|
33
|
+
[forward the events over TCP][forwarding-file-events-over-tcp]. The problem with
|
34
|
+
long polling is that it's painfully slow, especially in shared folders. The
|
35
|
+
problem with forwarding events is that it's not a general approach that works
|
36
|
+
for any application.
|
37
|
+
|
38
|
+
Solution
|
39
|
+
--------
|
40
|
+
|
41
|
+
`vagrant-fsnotify` proposes a different solution: run a process listening for
|
42
|
+
filesystem events on the host and, when a notification is received, access the
|
43
|
+
virtual machine guest and `touch` the file in there (or `touch` followed by a
|
44
|
+
`rm` in case of file removals), causing an event to be propagated on the guest
|
45
|
+
filesystem.
|
46
|
+
|
47
|
+
This leverages the speed of using real filesystem events while still being
|
48
|
+
general enough to don't require any support from applications.
|
49
|
+
|
50
|
+
Caveats
|
51
|
+
-------
|
52
|
+
|
53
|
+
Due to the nature of filesystem events and the fact that `vagrant-fsnotify` uses
|
54
|
+
`touch`, the events are triggerred back on the host a second time. To avoid
|
55
|
+
infinite loops, we add an arbitrary debounce of 2 seconds between `touch`-ing
|
56
|
+
the same file. Thus, if a file is modified on the host more than once in 2
|
57
|
+
seconds the VM will only see one notification. If the second trigger on the
|
58
|
+
host or this arbitrary debounce is unacceptable for your application,
|
59
|
+
`vagrant-fsnotify` might not be for you.
|
60
|
+
|
61
|
+
Installation
|
62
|
+
------------
|
63
|
+
|
64
|
+
`vagrant-fsnotify` is a [Vagrant][vagrant] plugin and can be installed by
|
65
|
+
running:
|
66
|
+
|
67
|
+
```console
|
68
|
+
$ vagrant plugin install vagrant-fsnotify
|
69
|
+
```
|
70
|
+
|
71
|
+
[Vagrant][vagrant] version 1.5 or greater is required.
|
72
|
+
|
73
|
+
Usage
|
74
|
+
-----
|
75
|
+
|
76
|
+
### Basic setup
|
77
|
+
|
78
|
+
In `Vagrantfile` synced folder configuration, add the `fsnotify: true`
|
79
|
+
option. For example, in order to enable `vagrant-fsnotify` for the the default
|
80
|
+
`/vagrant` shared folder, add the following:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: true
|
84
|
+
```
|
85
|
+
|
86
|
+
When the guest virtual machine is up, run the following:
|
87
|
+
|
88
|
+
```console
|
89
|
+
$ vagrant fsnotify
|
90
|
+
```
|
91
|
+
|
92
|
+
This starts the long running process that captures filesystem events on the host
|
93
|
+
and forwards them to the guest virtual machine.
|
94
|
+
|
95
|
+
### Multi-VM environments
|
96
|
+
|
97
|
+
In multi-VM environments, you can specify the name of the VMs targeted by
|
98
|
+
`vagrant-fsnotify` using:
|
99
|
+
|
100
|
+
```console
|
101
|
+
$ vagrant fsnotify <vm-name-1> <vm-name-2> ...
|
102
|
+
```
|
103
|
+
|
104
|
+
### Excluding files
|
105
|
+
|
106
|
+
To exclude files or directories from being watched, you can add an `:exclude`
|
107
|
+
option, which takes an array of strings (matched as a regexp against relative
|
108
|
+
paths):
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: true,
|
112
|
+
exclude: ["path1", "some/directory"]
|
113
|
+
```
|
114
|
+
|
115
|
+
This will exclude all files inside the `path1` and `some/directory`. It will
|
116
|
+
also exclude files such as `another/directory/path1`
|
117
|
+
|
118
|
+
### Guest path override
|
119
|
+
|
120
|
+
If your actual path on the VM is not the same as the one in `synced_folder`, for
|
121
|
+
example when using [`vagrant-bindfs`][vagrant-bindfs], you can use the
|
122
|
+
`:override_guestpath` option:
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: true,
|
126
|
+
override_guestpath: "/real/path"
|
127
|
+
```
|
128
|
+
|
129
|
+
This will forward a notification on `./myfile` to `/real/path/myfile` instead of
|
130
|
+
`/vagrant/myfile`.
|
131
|
+
|
132
|
+
### Select filesystem events
|
133
|
+
|
134
|
+
By default, when the `:fsnotify` key in the `Vagrantfile` is configured with
|
135
|
+
`true`, all filesystem events are forwarded to the VM (i.e. file creation,
|
136
|
+
modification and removal events). If, instead, you want to select only a few of
|
137
|
+
those events to be forwarded (e.g. you don't care about file removals), you can
|
138
|
+
use an Array of Symbols among the following options: `:added`, `:modified` and
|
139
|
+
`:removed`.
|
140
|
+
|
141
|
+
For example, to forward only added files events to the default `/vagrant`
|
142
|
+
folder, add the following to the `Vagrantfile`:
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: [:added]
|
146
|
+
```
|
147
|
+
|
148
|
+
|
149
|
+
Original work
|
150
|
+
-------------
|
151
|
+
|
152
|
+
This plugin used [`vagrant-rsync-back`][vagrant-rsync-back] by @smerill and the
|
153
|
+
[Vagrant][vagrant] source code as a starting point.
|
154
|
+
|
155
|
+
[vagrant]: https://www.vagrantup.com/
|
156
|
+
[jekyll]: http://jekyllrb.com/
|
157
|
+
[guard]: http://guardgem.org/
|
158
|
+
[forwarding-file-events-over-tcp]: https://github.com/guard/listen#forwarding-file-events-over-tcp
|
159
|
+
[vagrant-bindfs]: https://github.com/gael-ian/vagrant-bindfs
|
160
|
+
[vagrant-rsync-back]: https://github.com/smerrill/vagrant-rsync-back
|
@@ -4,6 +4,10 @@ module VagrantPlugins::Fsnotify
|
|
4
4
|
class Command < Vagrant.plugin("2", :command)
|
5
5
|
include Vagrant::Action::Builtin::MixinSyncedFolders
|
6
6
|
|
7
|
+
def self.synopsis
|
8
|
+
'forwards filesystem events to virtual machine'
|
9
|
+
end
|
10
|
+
|
7
11
|
def execute
|
8
12
|
@logger = Log4r::Logger.new("vagrant::commands::fsnotify")
|
9
13
|
|
@@ -29,7 +33,19 @@ module VagrantPlugins::Fsnotify
|
|
29
33
|
|
30
34
|
folder.each do |id, opts|
|
31
35
|
|
32
|
-
|
36
|
+
if !(
|
37
|
+
(opts[:fsnotify] == true) ||
|
38
|
+
(
|
39
|
+
opts[:fsnotify].respond_to?(:include?) &&
|
40
|
+
(
|
41
|
+
opts[:fsnotify].include?(:modified) ||
|
42
|
+
opts[:fsnotify].include?(:added) ||
|
43
|
+
opts[:fsnotify].include?(:removed)
|
44
|
+
)
|
45
|
+
)
|
46
|
+
)
|
47
|
+
next
|
48
|
+
end
|
33
49
|
|
34
50
|
# Folder info
|
35
51
|
hostpath = opts[:hostpath]
|
@@ -68,7 +84,27 @@ module VagrantPlugins::Fsnotify
|
|
68
84
|
end
|
69
85
|
|
70
86
|
if paths.empty?
|
71
|
-
@env.ui.info(
|
87
|
+
@env.ui.info(<<-MESSAGE)
|
88
|
+
Nothing to sync.
|
89
|
+
|
90
|
+
Note that the valid values for the `:fsnotify' configuration key on
|
91
|
+
`Vagrantfile' are either `true' (which forwards all kinds of filesystem events)
|
92
|
+
or an Array containing symbols among the following options: `:modified',
|
93
|
+
`:added' and `:removed' (in which case, only the specified filesystem events are
|
94
|
+
forwarded).
|
95
|
+
|
96
|
+
For example, to forward all filesystem events to the default `/vagrant' folder,
|
97
|
+
add the following to the `Vagrantfile':
|
98
|
+
|
99
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: true
|
100
|
+
|
101
|
+
And to forward only added files events to the default `/vagrant' folder, add the
|
102
|
+
following to the `Vagrantfile':
|
103
|
+
|
104
|
+
config.vm.synced_folder ".", "/vagrant", fsnotify: [:added]
|
105
|
+
|
106
|
+
Exiting...
|
107
|
+
MESSAGE
|
72
108
|
return 1
|
73
109
|
end
|
74
110
|
|
@@ -95,7 +131,7 @@ module VagrantPlugins::Fsnotify
|
|
95
131
|
Vagrant::Util::Busy.busy(callback) do
|
96
132
|
listener.start
|
97
133
|
queue.pop
|
98
|
-
listener.stop if listener.
|
134
|
+
listener.stop if listener.state != :stopped
|
99
135
|
end
|
100
136
|
|
101
137
|
return 0
|
@@ -113,10 +149,26 @@ module VagrantPlugins::Fsnotify
|
|
113
149
|
end
|
114
150
|
|
115
151
|
tosync = {}
|
152
|
+
todelete = []
|
116
153
|
|
117
154
|
paths.each do |hostpath, folder|
|
118
155
|
|
119
|
-
|
156
|
+
toanalyze = []
|
157
|
+
if folder[:opts][:fsnotify] == true
|
158
|
+
toanalyze += modified + added + removed
|
159
|
+
else
|
160
|
+
if folder[:opts][:fsnotify].include? :modified
|
161
|
+
toanalyze += modified
|
162
|
+
end
|
163
|
+
if folder[:opts][:fsnotify].include? :added
|
164
|
+
toanalyze += added
|
165
|
+
end
|
166
|
+
if folder[:opts][:fsnotify].include? :removed
|
167
|
+
toanalyze += removed
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
toanalyze.each do |file|
|
120
172
|
|
121
173
|
if file.start_with?(hostpath)
|
122
174
|
|
@@ -128,7 +180,13 @@ module VagrantPlugins::Fsnotify
|
|
128
180
|
end
|
129
181
|
|
130
182
|
@changes[rel_path] = Time.now.to_i
|
131
|
-
|
183
|
+
if modified.include? file
|
184
|
+
folder[:machine].ui.info("fsnotify: Changed: #{rel_path}")
|
185
|
+
elsif added.include? file
|
186
|
+
folder[:machine].ui.info("fsnotify: Added: #{rel_path}")
|
187
|
+
elsif removed.include? file
|
188
|
+
folder[:machine].ui.info("fsnotify: Removed: #{rel_path}")
|
189
|
+
end
|
132
190
|
|
133
191
|
guestpath = folder[:opts][:override_guestpath] || folder[:opts][:guestpath]
|
134
192
|
guestpath = File.join(guestpath, rel_path)
|
@@ -136,6 +194,9 @@ module VagrantPlugins::Fsnotify
|
|
136
194
|
tosync[folder[:machine]] = [] if !tosync.has_key?(folder[:machine])
|
137
195
|
tosync[folder[:machine]] << guestpath
|
138
196
|
|
197
|
+
if removed.include? file
|
198
|
+
todelete << guestpath
|
199
|
+
end
|
139
200
|
end
|
140
201
|
|
141
202
|
end
|
@@ -144,6 +205,10 @@ module VagrantPlugins::Fsnotify
|
|
144
205
|
|
145
206
|
tosync.each do |machine, files|
|
146
207
|
machine.communicate.execute("touch -a '#{files.join("' '")}'")
|
208
|
+
remove_from_this_machine = files & todelete
|
209
|
+
unless remove_from_this_machine.empty?
|
210
|
+
machine.communicate.execute("rm -rf '#{remove_from_this_machine.join("' '")}'")
|
211
|
+
end
|
147
212
|
end
|
148
213
|
|
149
214
|
rescue => e
|
@@ -4,8 +4,12 @@ rescue LoadError
|
|
4
4
|
raise "The vagrant-fsnotify plugin must be run within Vagrant."
|
5
5
|
end
|
6
6
|
|
7
|
-
if Vagrant::VERSION < "1.
|
8
|
-
raise
|
7
|
+
if Vagrant::VERSION < "1.7.3"
|
8
|
+
raise <<-ERROR
|
9
|
+
The vagrant-fsnotify plugin is only compatible with Vagrant 1.7.3+. If you can't
|
10
|
+
upgrade, consider installing an old version of vagrant-fsnotify with:
|
11
|
+
$ vagrant plugin install vagrant-fsnotify --plugin-version 0.0.6.
|
12
|
+
ERROR
|
9
13
|
end
|
10
14
|
|
11
15
|
module VagrantPlugins::Fsnotify
|
data/vagrant-fsnotify.gemspec
CHANGED
@@ -18,8 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
22
|
-
|
23
|
-
spec.add_development_dependency "bundler", "~> 1.9"
|
24
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "rake"
|
25
23
|
end
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-fsnotify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrien Kohlbecker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: listen
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 2.8.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 2.8.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- -
|
17
|
+
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
19
|
+
version: '0'
|
34
20
|
type: :development
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
26
|
+
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- -
|
31
|
+
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '0'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- -
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
40
|
+
version: '0'
|
55
41
|
description: Use vagrant-fsnotify to forward filesystem change notifications to your
|
56
42
|
Vagrant VM
|
57
43
|
email:
|
@@ -60,7 +46,9 @@ executables: []
|
|
60
46
|
extensions: []
|
61
47
|
extra_rdoc_files: []
|
62
48
|
files:
|
63
|
-
- .gitignore
|
49
|
+
- ".gitignore"
|
50
|
+
- AUTHORS
|
51
|
+
- CHANGELOG.md
|
64
52
|
- Gemfile
|
65
53
|
- LICENSE
|
66
54
|
- README.md
|
@@ -83,17 +71,17 @@ require_paths:
|
|
83
71
|
- lib
|
84
72
|
required_ruby_version: !ruby/object:Gem::Requirement
|
85
73
|
requirements:
|
86
|
-
- -
|
74
|
+
- - ">="
|
87
75
|
- !ruby/object:Gem::Version
|
88
76
|
version: '0'
|
89
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
78
|
requirements:
|
91
|
-
- -
|
79
|
+
- - ">="
|
92
80
|
- !ruby/object:Gem::Version
|
93
81
|
version: '0'
|
94
82
|
requirements: []
|
95
83
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.
|
84
|
+
rubygems_version: 2.4.8
|
97
85
|
signing_key:
|
98
86
|
specification_version: 4
|
99
87
|
summary: Forward filesystem change notifications to your Vagrant VM
|