vagrant-reflect 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/vagrant-reflect/command/reflect.rb +49 -40
- data/lib/vagrant-reflect/util/syncer.rb +236 -126
- data/lib/vagrant-reflect/version.rb +1 -1
- data/templates/locales/en.yml +3 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a125c9d631f0aa19172f28895bacb5a8e243c372
|
4
|
+
data.tar.gz: 124396c75e4bb6d37cf44ab64426dd9a496517b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a90cb48ce6ef31359cb746cca2930ffeaa3a8a2844c8cc4b662a57efe1bab7900cb0871cd59654996530e231b9c42f13305226351bcdd0586936b2ffe09dab6
|
7
|
+
data.tar.gz: ca55fd199a30b59757018e2f502ba70b77568558cd76e44439905d596f8ace5619fee25d3e9d7c0522fc33ab5e0ec2bee6aa86a04f68dd4546e4298421a1bf78
|
@@ -120,16 +120,11 @@ module VagrantReflect
|
|
120
120
|
|
121
121
|
ignores = []
|
122
122
|
opts.each do |path_opts|
|
123
|
+
ignores += path_opts[:syncer].excludes_to_regexp
|
123
124
|
path_opts[:machine].ui.info(
|
124
125
|
I18n.t(
|
125
126
|
'vagrant.plugins.vagrant-reflect.rsync_auto_path',
|
126
127
|
path: path.to_s))
|
127
|
-
|
128
|
-
next unless path_opts[:opts][:exclude]
|
129
|
-
|
130
|
-
Array(path_opts[:opts][:exclude]).each do |pattern|
|
131
|
-
ignores << Syncer.exclude_to_regexp(pattern.to_s)
|
132
|
-
end
|
133
128
|
end
|
134
129
|
|
135
130
|
@logger.info("Listening to path: #{path}")
|
@@ -170,43 +165,13 @@ module VagrantReflect
|
|
170
165
|
@logger.info(" - Added: #{added.inspect}")
|
171
166
|
@logger.info(" - Removed: #{removed.inspect}")
|
172
167
|
|
168
|
+
callback = options[:incremental] ? :sync_incremental : :sync_full
|
169
|
+
|
173
170
|
# Perform the sync for each machine
|
174
171
|
opts.each do |path_opts|
|
175
172
|
begin
|
176
|
-
# If
|
177
|
-
|
178
|
-
# It's seemingly impossible to ask rsync to only do a deletion
|
179
|
-
if !options[:incremental] || !removed.empty?
|
180
|
-
removed.each do |remove|
|
181
|
-
path_opts[:machine].ui.info(
|
182
|
-
I18n.t(
|
183
|
-
'vagrant.plugins.vagrant-reflect.rsync_auto_full_remove',
|
184
|
-
path: strip_path(path, remove)))
|
185
|
-
end
|
186
|
-
|
187
|
-
[modified, added].each do |changes|
|
188
|
-
changes.each do |change|
|
189
|
-
path_opts[:machine].ui.info(
|
190
|
-
I18n.t(
|
191
|
-
'vagrant.plugins.vagrant-reflect.rsync_auto_full_change',
|
192
|
-
path: strip_path(path, change)))
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
path_opts[:machine].ui.info(
|
197
|
-
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_full'))
|
198
|
-
|
199
|
-
path_opts[:syncer].sync_full
|
200
|
-
elsif !modified.empty? || !added.empty?
|
201
|
-
# Pass the list of changes to rsync so we quickly synchronise only
|
202
|
-
# the changed files instead of the whole folder
|
203
|
-
items = strip_paths(path, modified + added)
|
204
|
-
path_opts[:syncer].sync_incremental(items) do |item|
|
205
|
-
path_opts[:machine].ui.info(
|
206
|
-
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_increment',
|
207
|
-
path: item))
|
208
|
-
end
|
209
|
-
end
|
173
|
+
# If disabled incremental, do a full
|
174
|
+
send callback, path, path_opts, modified, added, removed
|
210
175
|
|
211
176
|
path_opts[:machine].ui.info(
|
212
177
|
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_synced'))
|
@@ -222,6 +187,50 @@ module VagrantReflect
|
|
222
187
|
end
|
223
188
|
end
|
224
189
|
|
190
|
+
def sync_full(path, path_opts, modified, added, removed)
|
191
|
+
[modified, added].flatten.each do |change|
|
192
|
+
path_opts[:machine].ui.info(
|
193
|
+
I18n.t(
|
194
|
+
'vagrant.plugins.vagrant-reflect.rsync_auto_full_change',
|
195
|
+
path: strip_path(path, change)))
|
196
|
+
end
|
197
|
+
|
198
|
+
removed.each do |remove|
|
199
|
+
path_opts[:machine].ui.info(
|
200
|
+
I18n.t(
|
201
|
+
'vagrant.plugins.vagrant-reflect.rsync_auto_full_remove',
|
202
|
+
path: strip_path(path, remove)))
|
203
|
+
end
|
204
|
+
|
205
|
+
path_opts[:machine].ui.info(
|
206
|
+
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_full'))
|
207
|
+
|
208
|
+
path_opts[:syncer].sync_full
|
209
|
+
end
|
210
|
+
|
211
|
+
def sync_incremental(path, path_opts, modified, added, removed)
|
212
|
+
if !modified.empty? || !added.empty?
|
213
|
+
# Pass the list of changes to rsync so we quickly synchronise only
|
214
|
+
# the changed files instead of the whole folder
|
215
|
+
items = strip_paths(path, modified + added)
|
216
|
+
path_opts[:syncer].sync_incremental(items) do |item|
|
217
|
+
path_opts[:machine].ui.info(
|
218
|
+
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_increment_change',
|
219
|
+
path: item))
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
return if removed.empty?
|
224
|
+
|
225
|
+
# Pass list of changes to a remove command
|
226
|
+
items = strip_paths(path, removed)
|
227
|
+
path_opts[:syncer].sync_removals(items) do |item|
|
228
|
+
path_opts[:machine].ui.info(
|
229
|
+
I18n.t('vagrant.plugins.vagrant-reflect.rsync_auto_increment_remove',
|
230
|
+
path: item))
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
225
234
|
def strip_paths(path, items)
|
226
235
|
items.map do |item|
|
227
236
|
item[path.length..-1]
|
@@ -6,51 +6,79 @@ module VagrantReflect
|
|
6
6
|
# This is a helper that abstracts out the functionality of rsyncing
|
7
7
|
# folders so that it can be called from anywhere.
|
8
8
|
class Syncer
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
RSYNC_TO_REGEXP_PATTERNS = [
|
10
|
+
['.', '\\.'],
|
11
|
+
['***', '|||EMPTY|||'],
|
12
|
+
['**', '|||GLOBAL|||'],
|
13
|
+
['*', '|||PATH|||'],
|
14
|
+
['?', '[^/]'],
|
15
|
+
['|||PATH|||', '[^/]+'],
|
16
|
+
['|||GLOBAL|||', '.+'],
|
17
|
+
['|||EMPTY|||', '.*']
|
18
|
+
].freeze
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
def initialize(machine, opts)
|
21
|
+
@opts = opts
|
22
|
+
@machine = machine
|
23
|
+
@workdir = @machine.env.root_path.to_s
|
19
24
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
25
|
+
init_paths
|
26
|
+
init_connection_info
|
27
|
+
init_excludes
|
28
|
+
init_commands
|
29
|
+
end
|
24
30
|
|
25
|
-
|
31
|
+
def log_configuration
|
32
|
+
@machine.ui.info(
|
33
|
+
I18n.t(
|
34
|
+
'vagrant.plugins.vagrant-reflect.rsync_folder_configuration',
|
35
|
+
guestpath: @guestpath,
|
36
|
+
hostpath: @hostpath))
|
26
37
|
|
27
|
-
|
28
|
-
# keep unit tests passing in the future.
|
29
|
-
# TODO: Escaped wildcards get substituted incorrectly - replace with FSM?
|
30
|
-
exclude = exclude.gsub('.', '\\.')
|
31
|
-
exclude = exclude.gsub('***', '|||EMPTY|||')
|
32
|
-
exclude = exclude.gsub('**', '|||GLOBAL|||')
|
33
|
-
exclude = exclude.gsub('*', '|||PATH|||')
|
34
|
-
exclude = exclude.gsub('?', '[^/]')
|
35
|
-
exclude = exclude.gsub('|||PATH|||', '[^/]+')
|
36
|
-
exclude = exclude.gsub('|||GLOBAL|||', '.+')
|
37
|
-
exclude = exclude.gsub('|||EMPTY|||', '.*')
|
38
|
-
regexp += exclude
|
39
|
-
|
40
|
-
regexp += dir_only ? '/' : '(?:/|$)'
|
38
|
+
return if @excludes.empty?
|
41
39
|
|
42
|
-
|
40
|
+
@machine.ui.info(
|
41
|
+
I18n.t(
|
42
|
+
'vagrant.plugins.vagrant-reflect.rsync_folder_excludes',
|
43
|
+
excludes: @excludes.inspect))
|
43
44
|
end
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
@
|
46
|
+
# This converts the rsync exclude patterns to regular expressions we can
|
47
|
+
# send to Listen.
|
48
|
+
def excludes_to_regexp
|
49
|
+
return @regexp if @regexp
|
50
|
+
|
51
|
+
@regexp = @excludes.map(&method(:exclude_to_regex_single))
|
52
|
+
end
|
53
|
+
|
54
|
+
def sync_incremental(items, &block)
|
55
|
+
send_items_to_command items, @rsync_command_inc, &block
|
56
|
+
end
|
57
|
+
|
58
|
+
def sync_full
|
59
|
+
r = Vagrant::Util::SubprocessPatched.execute(*@rsync_command_full)
|
60
|
+
check_exit @rsync_command_full, r
|
61
|
+
end
|
62
|
+
|
63
|
+
def sync_removals(items, &block)
|
64
|
+
# Look for removed directories and fill in guest paths
|
65
|
+
dirs = prepare_items_for_removal(items)
|
66
|
+
|
67
|
+
send_items_to_command items, @rm_command, &block
|
68
|
+
sync_removals_parents dirs.values, &block unless dirs.empty?
|
69
|
+
end
|
49
70
|
|
71
|
+
def sync_removals_parents(guest_items, &block)
|
72
|
+
send_items_to_command guest_items, @rmdir_command, &block
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def init_paths
|
50
78
|
# Folder info
|
51
79
|
@guestpath = @opts[:guestpath]
|
52
80
|
@hostpath = @opts[:hostpath]
|
53
|
-
@hostpath = File.expand_path(@hostpath, machine.env.root_path)
|
81
|
+
@hostpath = File.expand_path(@hostpath, @machine.env.root_path)
|
54
82
|
@hostpath = Vagrant::Util::Platform.fs_real_path(@hostpath).to_s
|
55
83
|
|
56
84
|
if Vagrant::Util::Platform.windows?
|
@@ -61,86 +89,113 @@ module VagrantReflect
|
|
61
89
|
# Make sure the host path ends with a "/" to avoid creating
|
62
90
|
# a nested directory...
|
63
91
|
@hostpath += '/' unless @hostpath.end_with?('/')
|
92
|
+
end
|
64
93
|
|
94
|
+
def init_connection_info
|
65
95
|
# Connection information
|
66
96
|
username = @machine.ssh_info[:username]
|
67
97
|
host = @machine.ssh_info[:host]
|
68
|
-
|
98
|
+
@remote = "#{username}@#{host}"
|
99
|
+
@target = "#{@remote}:#{@guestpath}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def init_excludes
|
103
|
+
# Exclude some files by default, and any that might be configured
|
104
|
+
# by the user.
|
105
|
+
@excludes = []
|
106
|
+
@excludes += Array(@opts[:exclude]).map(&:to_s) if @opts[:exclude]
|
107
|
+
@excludes.uniq!
|
108
|
+
end
|
109
|
+
|
110
|
+
def init_commands
|
111
|
+
init_rsh_command
|
112
|
+
init_rsync_command
|
113
|
+
init_rsync_command_full
|
114
|
+
init_rsync_command_inc
|
115
|
+
init_rm_command
|
116
|
+
init_rmdir_command
|
117
|
+
end
|
118
|
+
|
119
|
+
def init_rsh_command
|
120
|
+
proxy_command = []
|
69
121
|
if @machine.ssh_info[:proxy_command]
|
70
|
-
proxy_command
|
122
|
+
proxy_command += [
|
123
|
+
'-o',
|
124
|
+
"ProxyCommand='#{@machine.ssh_info[:proxy_command]}'"
|
125
|
+
]
|
71
126
|
end
|
72
127
|
|
73
|
-
rsh =
|
74
|
-
|
75
|
-
proxy_command +
|
76
|
-
'-o StrictHostKeyChecking=no '\
|
77
|
-
'-o IdentitiesOnly=true '\
|
78
|
-
'-o UserKnownHostsFile=/dev/null',
|
79
|
-
@machine.ssh_info[:private_key_path].map { |p| "-i '#{p}'" }
|
80
|
-
].flatten.join(' ')
|
81
|
-
|
82
|
-
@target = "#{username}@#{host}:#{@guestpath}"
|
128
|
+
@rsh = build_rsh_command(proxy_command).flatten
|
129
|
+
end
|
83
130
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
131
|
+
def build_rsh_command(proxy_command)
|
132
|
+
[
|
133
|
+
'ssh',
|
134
|
+
'-p', @machine.ssh_info[:port].to_s,
|
135
|
+
proxy_command,
|
136
|
+
'-o', 'StrictHostKeyChecking=no',
|
137
|
+
'-o', 'IdentitiesOnly=true',
|
138
|
+
'-o', 'UserKnownHostsFile=/dev/null',
|
139
|
+
@machine.ssh_info[:private_key_path].map { |p| ['-i', p] }
|
140
|
+
]
|
141
|
+
end
|
89
142
|
|
143
|
+
def init_rsync_command
|
90
144
|
# Get the command-line arguments
|
91
|
-
@
|
92
|
-
@
|
93
|
-
@
|
145
|
+
@rsync_command = ['rsync']
|
146
|
+
@rsync_command += Array(@opts[:args]).dup if @opts[:args]
|
147
|
+
@rsync_command ||= [
|
148
|
+
'--verbose', '--archive', '--delete', '-z', '--copy-links']
|
94
149
|
|
95
150
|
# On Windows, we have to set a default chmod flag to avoid permission
|
96
151
|
# issues
|
97
|
-
if Vagrant::Util::Platform.windows?
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
152
|
+
build_windows_chmod_args if Vagrant::Util::Platform.windows?
|
153
|
+
|
154
|
+
build_owner_args
|
155
|
+
|
156
|
+
@rsync_command << '-e'
|
157
|
+
@rsync_command << @rsh.join(' ')
|
158
|
+
|
159
|
+
@excludes.map { |e| @rsync_command += ['--exclude', e] }
|
160
|
+
end
|
161
|
+
|
162
|
+
def build_windows_chmod_args
|
163
|
+
return if @rsync_command.any? { |arg| arg.start_with?('--chmod=') }
|
109
164
|
|
165
|
+
# Ensures that all non-masked bits get enabled
|
166
|
+
@rsync_command << '--chmod=ugo=rwX'
|
167
|
+
|
168
|
+
# Remove the -p option if --archive is enabled (--archive equals
|
169
|
+
# -rlptgoD) otherwise new files will not have the destination-default
|
170
|
+
# permissions
|
171
|
+
return unless @rsync_command.include?('--archive') ||
|
172
|
+
@rsync_command.include?('-a')
|
173
|
+
|
174
|
+
@rsync_command << '--no-perms'
|
175
|
+
end
|
176
|
+
|
177
|
+
def build_owner_args
|
110
178
|
# Disable rsync's owner/group preservation (implied by --archive) unless
|
111
179
|
# specifically requested, since we adjust owner/group to match shared
|
112
180
|
# folder setting ourselves.
|
113
|
-
@
|
114
|
-
@
|
115
|
-
@
|
116
|
-
@
|
117
|
-
|
118
|
-
# Tell local rsync how to invoke remote rsync with sudo
|
119
|
-
if @machine.guest.capability?(:rsync_command)
|
120
|
-
@command << '--rsync-path' << @machine.guest.capability(:rsync_command)
|
121
|
-
end
|
181
|
+
@rsync_command << '--no-owner' unless
|
182
|
+
@rsync_command.include?('--owner') || @rsync_command.include?('-o')
|
183
|
+
@rsync_command << '--no-group' unless
|
184
|
+
@rsync_command.include?('--group') || @rsync_command.include?('-g')
|
185
|
+
end
|
122
186
|
|
123
|
-
|
124
|
-
|
187
|
+
def init_rsync_command_full
|
188
|
+
@rsync_command_full = @rsync_command.dup + [
|
189
|
+
@hostpath,
|
190
|
+
@target,
|
191
|
+
{
|
192
|
+
workdir: @workdir
|
193
|
+
}
|
125
194
|
]
|
126
|
-
|
127
|
-
excludes.map { |e| @command += ['--exclude', e] }
|
128
|
-
|
129
|
-
machine.ui.info(
|
130
|
-
I18n.t(
|
131
|
-
'vagrant.plugins.vagrant-reflect.rsync_folder_configuration',
|
132
|
-
guestpath: @guestpath,
|
133
|
-
hostpath: @hostpath))
|
134
|
-
if excludes.length > 1
|
135
|
-
machine.ui.info(
|
136
|
-
I18n.t(
|
137
|
-
'vagrant.plugins.vagrant-reflect.rsync_folder_excludes',
|
138
|
-
excludes: excludes.inspect))
|
139
|
-
end
|
140
195
|
end
|
141
196
|
|
142
|
-
def
|
143
|
-
|
197
|
+
def init_rsync_command_inc
|
198
|
+
@rsync_command_inc = @rsync_command.dup + [
|
144
199
|
'--files-from=-',
|
145
200
|
@hostpath,
|
146
201
|
@target,
|
@@ -149,56 +204,86 @@ module VagrantReflect
|
|
149
204
|
notify: :stdin
|
150
205
|
}
|
151
206
|
]
|
152
|
-
|
153
|
-
current = false
|
154
|
-
r = Vagrant::Util::SubprocessPatched.execute(*command) do |what, io|
|
155
|
-
next if what != :stdin
|
156
|
-
|
157
|
-
current = process_items(io, items, current, &block)
|
158
|
-
end
|
159
|
-
|
160
|
-
check_exit command, r
|
161
207
|
end
|
162
208
|
|
163
|
-
def
|
164
|
-
|
165
|
-
@
|
166
|
-
|
209
|
+
def init_rm_command
|
210
|
+
@rm_command = @rsh.dup + [
|
211
|
+
@remote,
|
212
|
+
'xargs rm -f',
|
167
213
|
{
|
168
|
-
workdir: @workdir
|
214
|
+
workdir: @workdir,
|
215
|
+
notify: :stdin
|
169
216
|
}
|
170
217
|
]
|
218
|
+
end
|
171
219
|
|
172
|
-
|
173
|
-
|
174
|
-
|
220
|
+
def init_rmdir_command
|
221
|
+
@rmdir_command = @rsh.dup + [
|
222
|
+
@remote,
|
223
|
+
'xargs rmdir',
|
224
|
+
{
|
225
|
+
workdir: @workdir,
|
226
|
+
notify: :stdin
|
227
|
+
}
|
228
|
+
]
|
175
229
|
end
|
176
230
|
|
177
|
-
|
231
|
+
def prepare_items_for_removal(items)
|
232
|
+
dirs = {}
|
233
|
+
items.map! do |rel_path|
|
234
|
+
check_for_empty_parents(rel_path, dirs)
|
235
|
+
@guestpath + rel_path
|
236
|
+
end
|
237
|
+
dirs
|
238
|
+
end
|
178
239
|
|
179
|
-
def
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
240
|
+
def check_for_empty_parents(rel_path, dirs)
|
241
|
+
parent = rel_path
|
242
|
+
loop do
|
243
|
+
parent = File.dirname(parent)
|
244
|
+
break if parent == '/'
|
245
|
+
unless File.exist?(@hostpath + parent) || dirs.key?(parent)
|
246
|
+
dirs[parent] = @guestpath + parent
|
185
247
|
end
|
248
|
+
end
|
249
|
+
end
|
186
250
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
break
|
192
|
-
end
|
251
|
+
def send_items_to_command(items, command, &block)
|
252
|
+
current = next_item(items, &block)
|
253
|
+
r = Vagrant::Util::SubprocessPatched.execute(*command) do |what, io|
|
254
|
+
next if what != :stdin
|
193
255
|
|
194
|
-
|
195
|
-
|
256
|
+
current = process_items(io, items, current, &block)
|
257
|
+
end
|
258
|
+
check_exit command, r
|
259
|
+
end
|
260
|
+
|
261
|
+
def process_items(io, items, current, &block)
|
262
|
+
until current.nil?
|
263
|
+
send_data(io, current)
|
264
|
+
current = next_item(items, &block)
|
196
265
|
end
|
197
266
|
|
198
267
|
# Finished! Close stdin
|
199
268
|
io.close_write
|
200
269
|
rescue IO::WaitWritable, Errno::EINTR
|
201
|
-
#
|
270
|
+
# Wait for writable again
|
271
|
+
return current
|
272
|
+
end
|
273
|
+
|
274
|
+
def next_item(items)
|
275
|
+
return nil if items.empty?
|
276
|
+
current = items.shift + "\n"
|
277
|
+
yield current if block_given?
|
278
|
+
current
|
279
|
+
end
|
280
|
+
|
281
|
+
def send_data(io, current)
|
282
|
+
# Handle partial writes
|
283
|
+
n = io.write_nonblock(current)
|
284
|
+
return unless n < current.length
|
285
|
+
current.slice! 0, n
|
286
|
+
throw IO::WaitWritable
|
202
287
|
end
|
203
288
|
|
204
289
|
def check_exit(command, r)
|
@@ -210,5 +295,30 @@ module VagrantReflect
|
|
210
295
|
hostpath: @hostpath,
|
211
296
|
stderr: r.stderr
|
212
297
|
end
|
298
|
+
|
299
|
+
def exclude_to_regex_single(exclude)
|
300
|
+
start_anchor = false
|
301
|
+
|
302
|
+
if exclude.start_with?('/')
|
303
|
+
start_anchor = true
|
304
|
+
exclude = exclude[1..-1]
|
305
|
+
end
|
306
|
+
|
307
|
+
regexp = start_anchor ? '^' : '(?:^|/)'
|
308
|
+
regexp += perform_substitutions(exclude)
|
309
|
+
regexp += exclude.end_with?('/') ? '' : '(?:/|$)'
|
310
|
+
|
311
|
+
Regexp.new(regexp)
|
312
|
+
end
|
313
|
+
|
314
|
+
def perform_substitutions(exclude)
|
315
|
+
# This is REALLY ghetto, but its a start. We can improve and
|
316
|
+
# keep unit tests passing in the future.
|
317
|
+
# TODO: Escaped wildcards get substituted incorrectly - replace with FSM?
|
318
|
+
RSYNC_TO_REGEXP_PATTERNS.each do |pattern|
|
319
|
+
exclude = exclude.gsub(pattern[0], pattern[1])
|
320
|
+
end
|
321
|
+
exclude
|
322
|
+
end
|
213
323
|
end
|
214
324
|
end
|
data/templates/locales/en.yml
CHANGED
@@ -14,8 +14,10 @@ en:
|
|
14
14
|
have specified `rsync_auto` to be false.
|
15
15
|
rsync_auto_path: |-
|
16
16
|
Watching: %{path}
|
17
|
-
|
17
|
+
rsync_auto_increment_change: |-
|
18
18
|
Sending change: %{path}
|
19
|
+
rsync_auto_increment_remove: |-
|
20
|
+
Sending removal: %{path}
|
19
21
|
rsync_auto_full_change: |-
|
20
22
|
Processing change: %{path}
|
21
23
|
rsync_auto_full_remove: |-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-reflect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Woods
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: driskell-listen
|