guard 1.0.3 → 1.1.0.alpha
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.
- data/CHANGELOG.md +0 -6
- data/README.md +38 -30
- data/lib/guard.rb +158 -285
- data/lib/guard/cli.rb +16 -2
- data/lib/guard/dsl.rb +41 -20
- data/lib/guard/dsl_describer.rb +1 -1
- data/lib/guard/group.rb +1 -1
- data/lib/guard/guard.rb +39 -5
- data/lib/guard/guardfile.rb +70 -0
- data/lib/guard/runner.rb +179 -0
- data/lib/guard/ui.rb +1 -1
- data/lib/guard/version.rb +2 -4
- data/lib/guard/watcher.rb +1 -0
- metadata +16 -77
- data/bin/fsevent_watch_guard_guard +0 -0
- data/lib/guard/listener.rb +0 -376
- data/lib/guard/listeners/darwin.rb +0 -62
- data/lib/guard/listeners/linux.rb +0 -93
- data/lib/guard/listeners/polling.rb +0 -55
- data/lib/guard/listeners/windows.rb +0 -63
- data/lib/vendor/darwin/Gemfile +0 -6
- data/lib/vendor/darwin/Guardfile +0 -8
- data/lib/vendor/darwin/LICENSE +0 -20
- data/lib/vendor/darwin/README.rdoc +0 -255
- data/lib/vendor/darwin/Rakefile +0 -21
- data/lib/vendor/darwin/bin/fsevent_watch +0 -0
- data/lib/vendor/darwin/ext/fsevent_watch/Info.plist +0 -38
- data/lib/vendor/darwin/ext/fsevent_watch/LICENSE +0 -21
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch.xcodeproj/project.pbxproj +0 -254
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/TSICTString.c +0 -394
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/TSICTString.h +0 -74
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/cli.c +0 -160
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/cli.h +0 -45
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/common.h +0 -34
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/compat.c +0 -20
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/compat.h +0 -40
- data/lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/main.c +0 -509
- data/lib/vendor/darwin/ext/fsevent_watch/xcconfig/Common.xcconfig +0 -82
- data/lib/vendor/darwin/ext/fsevent_watch/xcconfig/Debug.xcconfig +0 -19
- data/lib/vendor/darwin/ext/fsevent_watch/xcconfig/Release.xcconfig +0 -23
- data/lib/vendor/darwin/ext/fsevent_watch/xcconfig/fsevent_watch.xcconfig +0 -17
- data/lib/vendor/darwin/ext/rakefile.rb +0 -47
- data/lib/vendor/darwin/ext/rb-fsevent.xcconfig +0 -33
- data/lib/vendor/darwin/lib/rb-fsevent.rb +0 -2
- data/lib/vendor/darwin/lib/rb-fsevent/fsevent.rb +0 -111
- data/lib/vendor/darwin/lib/rb-fsevent/version.rb +0 -3
- data/lib/vendor/darwin/rb-fsevent.gemspec +0 -25
- data/lib/vendor/darwin/spec/fixtures/folder1/file1.txt +0 -0
- data/lib/vendor/darwin/spec/fixtures/folder1/folder2/file2.txt +0 -0
- data/lib/vendor/darwin/spec/rb-fsevent/fsevent_spec.rb +0 -88
- data/lib/vendor/darwin/spec/spec_helper.rb +0 -23
- data/lib/vendor/linux/MIT-LICENSE +0 -20
- data/lib/vendor/linux/README.md +0 -66
- data/lib/vendor/linux/Rakefile +0 -54
- data/lib/vendor/linux/VERSION +0 -1
- data/lib/vendor/linux/lib/rb-inotify.rb +0 -17
- data/lib/vendor/linux/lib/rb-inotify/event.rb +0 -139
- data/lib/vendor/linux/lib/rb-inotify/native.rb +0 -31
- data/lib/vendor/linux/lib/rb-inotify/native/flags.rb +0 -89
- data/lib/vendor/linux/lib/rb-inotify/notifier.rb +0 -308
- data/lib/vendor/linux/lib/rb-inotify/watcher.rb +0 -83
- data/lib/vendor/linux/rb-inotify.gemspec +0 -53
- data/lib/vendor/windows/Gemfile +0 -4
- data/lib/vendor/windows/README.md +0 -34
- data/lib/vendor/windows/Rakefile +0 -18
- data/lib/vendor/windows/lib/rb-fchange.rb +0 -14
- data/lib/vendor/windows/lib/rb-fchange/event.rb +0 -29
- data/lib/vendor/windows/lib/rb-fchange/native.rb +0 -45
- data/lib/vendor/windows/lib/rb-fchange/native/flags.rb +0 -78
- data/lib/vendor/windows/lib/rb-fchange/notifier.rb +0 -149
- data/lib/vendor/windows/lib/rb-fchange/version.rb +0 -3
- data/lib/vendor/windows/lib/rb-fchange/watcher.rb +0 -99
- data/lib/vendor/windows/rb-fchange.gemspec +0 -34
- data/lib/vendor/windows/spec/fixtures/folder1/file1.txt +0 -0
- data/lib/vendor/windows/spec/fixtures/folder1/folder2/file2.txt +0 -0
- data/lib/vendor/windows/spec/rb-fchange/fchange_spec.rb +0 -119
- data/lib/vendor/windows/spec/spec_helper.rb +0 -21
data/lib/guard/ui.rb
CHANGED
data/lib/guard/version.rb
CHANGED
data/lib/guard/watcher.rb
CHANGED
metadata
CHANGED
@@ -1,40 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0.alpha
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Thibaud Guillaume-Gentil
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.15.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.15.2
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
31
|
+
name: listen
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
37
|
+
version: 0.4.2
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
45
|
+
version: 0.4.2
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: bundler
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.
|
69
|
+
version: 2.10.0
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 2.
|
77
|
+
version: 2.10.0
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: guard-rspec
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
requirements:
|
83
83
|
- - ~>
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.
|
85
|
+
version: 0.7.0
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
requirements:
|
91
91
|
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.
|
93
|
+
version: 0.7.0
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: yard
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,7 +148,6 @@ extensions: []
|
|
148
148
|
extra_rdoc_files: []
|
149
149
|
files:
|
150
150
|
- bin/fsevent_watch_guard
|
151
|
-
- bin/fsevent_watch_guard_guard
|
152
151
|
- bin/guard
|
153
152
|
- images/failed.png
|
154
153
|
- images/pending.png
|
@@ -158,15 +157,11 @@ files:
|
|
158
157
|
- lib/guard/dsl_describer.rb
|
159
158
|
- lib/guard/group.rb
|
160
159
|
- lib/guard/guard.rb
|
160
|
+
- lib/guard/guardfile.rb
|
161
161
|
- lib/guard/hook.rb
|
162
162
|
- lib/guard/interactor.rb
|
163
163
|
- lib/guard/interactors/readline.rb
|
164
164
|
- lib/guard/interactors/simple.rb
|
165
|
-
- lib/guard/listener.rb
|
166
|
-
- lib/guard/listeners/darwin.rb
|
167
|
-
- lib/guard/listeners/linux.rb
|
168
|
-
- lib/guard/listeners/polling.rb
|
169
|
-
- lib/guard/listeners/windows.rb
|
170
165
|
- lib/guard/notifier.rb
|
171
166
|
- lib/guard/notifiers/gntp.rb
|
172
167
|
- lib/guard/notifiers/growl.rb
|
@@ -174,68 +169,12 @@ files:
|
|
174
169
|
- lib/guard/notifiers/libnotify.rb
|
175
170
|
- lib/guard/notifiers/notifysend.rb
|
176
171
|
- lib/guard/notifiers/rb_notifu.rb
|
172
|
+
- lib/guard/runner.rb
|
177
173
|
- lib/guard/templates/Guardfile
|
178
174
|
- lib/guard/ui.rb
|
179
175
|
- lib/guard/version.rb
|
180
176
|
- lib/guard/watcher.rb
|
181
177
|
- lib/guard.rb
|
182
|
-
- lib/vendor/darwin/bin/fsevent_watch
|
183
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/cli.c
|
184
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/cli.h
|
185
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/common.h
|
186
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/compat.c
|
187
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/compat.h
|
188
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/main.c
|
189
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/TSICTString.c
|
190
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch/TSICTString.h
|
191
|
-
- lib/vendor/darwin/ext/fsevent_watch/fsevent_watch.xcodeproj/project.pbxproj
|
192
|
-
- lib/vendor/darwin/ext/fsevent_watch/Info.plist
|
193
|
-
- lib/vendor/darwin/ext/fsevent_watch/LICENSE
|
194
|
-
- lib/vendor/darwin/ext/fsevent_watch/xcconfig/Common.xcconfig
|
195
|
-
- lib/vendor/darwin/ext/fsevent_watch/xcconfig/Debug.xcconfig
|
196
|
-
- lib/vendor/darwin/ext/fsevent_watch/xcconfig/fsevent_watch.xcconfig
|
197
|
-
- lib/vendor/darwin/ext/fsevent_watch/xcconfig/Release.xcconfig
|
198
|
-
- lib/vendor/darwin/ext/rakefile.rb
|
199
|
-
- lib/vendor/darwin/ext/rb-fsevent.xcconfig
|
200
|
-
- lib/vendor/darwin/Gemfile
|
201
|
-
- lib/vendor/darwin/Guardfile
|
202
|
-
- lib/vendor/darwin/lib/rb-fsevent/fsevent.rb
|
203
|
-
- lib/vendor/darwin/lib/rb-fsevent/version.rb
|
204
|
-
- lib/vendor/darwin/lib/rb-fsevent.rb
|
205
|
-
- lib/vendor/darwin/LICENSE
|
206
|
-
- lib/vendor/darwin/Rakefile
|
207
|
-
- lib/vendor/darwin/rb-fsevent.gemspec
|
208
|
-
- lib/vendor/darwin/README.rdoc
|
209
|
-
- lib/vendor/darwin/spec/fixtures/folder1/file1.txt
|
210
|
-
- lib/vendor/darwin/spec/fixtures/folder1/folder2/file2.txt
|
211
|
-
- lib/vendor/darwin/spec/rb-fsevent/fsevent_spec.rb
|
212
|
-
- lib/vendor/darwin/spec/spec_helper.rb
|
213
|
-
- lib/vendor/linux/lib/rb-inotify/event.rb
|
214
|
-
- lib/vendor/linux/lib/rb-inotify/native/flags.rb
|
215
|
-
- lib/vendor/linux/lib/rb-inotify/native.rb
|
216
|
-
- lib/vendor/linux/lib/rb-inotify/notifier.rb
|
217
|
-
- lib/vendor/linux/lib/rb-inotify/watcher.rb
|
218
|
-
- lib/vendor/linux/lib/rb-inotify.rb
|
219
|
-
- lib/vendor/linux/MIT-LICENSE
|
220
|
-
- lib/vendor/linux/Rakefile
|
221
|
-
- lib/vendor/linux/rb-inotify.gemspec
|
222
|
-
- lib/vendor/linux/README.md
|
223
|
-
- lib/vendor/linux/VERSION
|
224
|
-
- lib/vendor/windows/Gemfile
|
225
|
-
- lib/vendor/windows/lib/rb-fchange/event.rb
|
226
|
-
- lib/vendor/windows/lib/rb-fchange/native/flags.rb
|
227
|
-
- lib/vendor/windows/lib/rb-fchange/native.rb
|
228
|
-
- lib/vendor/windows/lib/rb-fchange/notifier.rb
|
229
|
-
- lib/vendor/windows/lib/rb-fchange/version.rb
|
230
|
-
- lib/vendor/windows/lib/rb-fchange/watcher.rb
|
231
|
-
- lib/vendor/windows/lib/rb-fchange.rb
|
232
|
-
- lib/vendor/windows/Rakefile
|
233
|
-
- lib/vendor/windows/rb-fchange.gemspec
|
234
|
-
- lib/vendor/windows/README.md
|
235
|
-
- lib/vendor/windows/spec/fixtures/folder1/file1.txt
|
236
|
-
- lib/vendor/windows/spec/fixtures/folder1/folder2/file2.txt
|
237
|
-
- lib/vendor/windows/spec/rb-fchange/fchange_spec.rb
|
238
|
-
- lib/vendor/windows/spec/spec_helper.rb
|
239
178
|
- CHANGELOG.md
|
240
179
|
- LICENSE
|
241
180
|
- man/guard.1
|
Binary file
|
data/lib/guard/listener.rb
DELETED
@@ -1,376 +0,0 @@
|
|
1
|
-
require 'rbconfig'
|
2
|
-
require 'digest/sha1'
|
3
|
-
|
4
|
-
module Guard
|
5
|
-
|
6
|
-
autoload :Darwin, 'guard/listeners/darwin'
|
7
|
-
autoload :Linux, 'guard/listeners/linux'
|
8
|
-
autoload :Windows, 'guard/listeners/windows'
|
9
|
-
autoload :Polling, 'guard/listeners/polling'
|
10
|
-
|
11
|
-
# The Listener is the base class for all listener
|
12
|
-
# implementations.
|
13
|
-
#
|
14
|
-
# @abstract
|
15
|
-
#
|
16
|
-
class Listener
|
17
|
-
|
18
|
-
# Default paths that gets ignored by the listener
|
19
|
-
DEFAULT_IGNORE_PATHS = %w[. .. .bundle .git log tmp vendor]
|
20
|
-
|
21
|
-
attr_accessor :changed_files
|
22
|
-
attr_reader :directory, :ignore_paths
|
23
|
-
|
24
|
-
def paused?
|
25
|
-
@paused
|
26
|
-
end
|
27
|
-
|
28
|
-
# Select the appropriate listener implementation for the
|
29
|
-
# current OS and initializes it.
|
30
|
-
#
|
31
|
-
# @param [Hash] options the options for the listener
|
32
|
-
# @option options [String] watchdir the directory to watch
|
33
|
-
# @return [Guard::Listener] the chosen listener
|
34
|
-
#
|
35
|
-
def self.select_and_init(options = {})
|
36
|
-
watchdir = options && options[:watchdir] && File.expand_path(options[:watchdir])
|
37
|
-
watchdir = Dir.pwd unless watchdir
|
38
|
-
|
39
|
-
no_vendor = options && options[:no_vendor] ? options[:no_vendor] : false
|
40
|
-
|
41
|
-
if mac? && Darwin.usable?(no_vendor)
|
42
|
-
Darwin.new(watchdir, options)
|
43
|
-
elsif linux? && Linux.usable?(no_vendor)
|
44
|
-
Linux.new(watchdir, options)
|
45
|
-
elsif windows? && Windows.usable?(no_vendor)
|
46
|
-
Windows.new(watchdir, options)
|
47
|
-
else
|
48
|
-
UI.info 'Using polling (Please help us to support your system better than that).'
|
49
|
-
Polling.new(watchdir, options)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Initialize the listener.
|
54
|
-
#
|
55
|
-
# @param [String] directory the root directory to listen to
|
56
|
-
# @option options [Boolean] relativize_paths use only relative paths
|
57
|
-
# @option options [Boolean] watch_all_modifications to enable deleted and moved file listening.
|
58
|
-
# @option options [Array<String>] ignore_paths the paths to ignore by the listener
|
59
|
-
#
|
60
|
-
def initialize(directory = Dir.pwd, options = {})
|
61
|
-
@sha1_checksums_hash = {}
|
62
|
-
@file_timestamp_hash = {}
|
63
|
-
@changed_files = []
|
64
|
-
@paused = false
|
65
|
-
|
66
|
-
@directory = directory.to_s
|
67
|
-
|
68
|
-
options = options.inject({}) { |h,(k,v)| h[k.to_sym] = v; h }
|
69
|
-
@relativize_paths = options.fetch(:relativize_paths, true)
|
70
|
-
@watch_all_modifications = options.fetch(:watch_all_modifications, false)
|
71
|
-
|
72
|
-
@ignore_paths = DEFAULT_IGNORE_PATHS
|
73
|
-
@ignore_paths |= options[:ignore_paths] if options[:ignore_paths]
|
74
|
-
|
75
|
-
update_last_event
|
76
|
-
start_reactor
|
77
|
-
end
|
78
|
-
|
79
|
-
# Start watching the root directory.
|
80
|
-
#
|
81
|
-
def start
|
82
|
-
watch(@directory)
|
83
|
-
timestamp_files if watch_all_modifications?
|
84
|
-
end
|
85
|
-
|
86
|
-
# Stop listening for events.
|
87
|
-
#
|
88
|
-
def stop
|
89
|
-
end
|
90
|
-
|
91
|
-
# Pause the listener to ignore change events.
|
92
|
-
#
|
93
|
-
def pause
|
94
|
-
@paused = true
|
95
|
-
end
|
96
|
-
|
97
|
-
# Unpause the listener to listen again to change events.
|
98
|
-
#
|
99
|
-
def run
|
100
|
-
@paused = false
|
101
|
-
end
|
102
|
-
|
103
|
-
# Clear the list of changed files.
|
104
|
-
#
|
105
|
-
def clear_changed_files
|
106
|
-
@changed_files.clear
|
107
|
-
end
|
108
|
-
|
109
|
-
# Store a listener callback.
|
110
|
-
#
|
111
|
-
# @param [Block] callback the callback to store
|
112
|
-
#
|
113
|
-
def on_change(&callback)
|
114
|
-
@callback = callback
|
115
|
-
end
|
116
|
-
|
117
|
-
# Updates the timestamp of the last event.
|
118
|
-
#
|
119
|
-
def update_last_event
|
120
|
-
@last_event = Time.now
|
121
|
-
end
|
122
|
-
|
123
|
-
# Get the modified files.
|
124
|
-
#
|
125
|
-
# If the `:watch_all_modifications` option is true, then moved and
|
126
|
-
# deleted files are also reported, but prefixed by an exclamation point.
|
127
|
-
#
|
128
|
-
# @example Deleted or moved file
|
129
|
-
# !/home/user/dir/file.rb
|
130
|
-
#
|
131
|
-
# @param [Array<String>] dirs the watched directories
|
132
|
-
# @param [Hash] options the listener options
|
133
|
-
# @option options [Symbol] all whether to files in sub directories
|
134
|
-
# @return [Array<String>] paths of files that have been modified
|
135
|
-
#
|
136
|
-
def modified_files(dirs, options = {})
|
137
|
-
last_event = @last_event
|
138
|
-
files = []
|
139
|
-
|
140
|
-
if watch_all_modifications?
|
141
|
-
deleted_files = @file_timestamp_hash.collect do |path, ts|
|
142
|
-
unless File.exists?(path)
|
143
|
-
@sha1_checksums_hash.delete(path)
|
144
|
-
@file_timestamp_hash.delete(path)
|
145
|
-
"!#{path}"
|
146
|
-
end
|
147
|
-
end
|
148
|
-
files.concat(deleted_files.compact)
|
149
|
-
end
|
150
|
-
update_last_event
|
151
|
-
updated_files = potentially_modified_files(dirs, options).select do |path|
|
152
|
-
file_modified?(path, last_event)
|
153
|
-
end
|
154
|
-
files.concat(updated_files)
|
155
|
-
|
156
|
-
relativize_paths(files)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Register a directory to watch.
|
160
|
-
# Must be implemented by the subclasses.
|
161
|
-
#
|
162
|
-
# @param [String] directory the directory to watch
|
163
|
-
#
|
164
|
-
def watch(directory)
|
165
|
-
raise NotImplementedError, "do whatever you want here, given the directory as only argument"
|
166
|
-
end
|
167
|
-
|
168
|
-
# Get all files that are in the watched directory.
|
169
|
-
#
|
170
|
-
# @return [Array<String>] the list of files
|
171
|
-
#
|
172
|
-
def all_files
|
173
|
-
potentially_modified_files([@directory], :all => true)
|
174
|
-
end
|
175
|
-
|
176
|
-
# Scopes all given paths to the current directory.
|
177
|
-
#
|
178
|
-
# @param [Array<String>] paths the paths to change
|
179
|
-
# @return [Array<String>] all paths now relative to the current dir
|
180
|
-
#
|
181
|
-
def relativize_paths(paths)
|
182
|
-
return paths unless relativize_paths?
|
183
|
-
paths.map do |path|
|
184
|
-
path.gsub(%r{^(!)?#{ @directory }/},'\1')
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
# Use paths relative to the current directory.
|
189
|
-
#
|
190
|
-
# @return [Boolean] whether to use relative or absolute paths
|
191
|
-
#
|
192
|
-
def relativize_paths?
|
193
|
-
!!@relativize_paths
|
194
|
-
end
|
195
|
-
|
196
|
-
# test if the listener should also watch for deleted and
|
197
|
-
# moved files
|
198
|
-
#
|
199
|
-
# @return [Boolean] whether to watch all file modifications or not
|
200
|
-
#
|
201
|
-
def watch_all_modifications?
|
202
|
-
!!@watch_all_modifications
|
203
|
-
end
|
204
|
-
|
205
|
-
# Populate initial timestamp file hash to watch for deleted or moved files.
|
206
|
-
#
|
207
|
-
def timestamp_files
|
208
|
-
all_files.each { |path| set_file_timestamp_hash(path) }
|
209
|
-
end
|
210
|
-
|
211
|
-
# Removes the ignored paths from the directory list.
|
212
|
-
#
|
213
|
-
# @param [Array<String>] dirs the directory to listen to
|
214
|
-
# @param [Array<String>] ignore_paths the paths to ignore
|
215
|
-
# @return children of the passed dirs that are not in the ignore_paths list
|
216
|
-
#
|
217
|
-
def exclude_ignored_paths(dirs, ignore_paths = self.ignore_paths)
|
218
|
-
Dir.glob(dirs.map { |d| "#{d.sub(%r{/+$}, '')}/*" }, File::FNM_DOTMATCH).reject do |path|
|
219
|
-
ignore_paths.include?(File.basename(path))
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
private
|
224
|
-
|
225
|
-
# Start the listener thread.
|
226
|
-
#
|
227
|
-
def start_reactor
|
228
|
-
return if ENV["GUARD_ENV"] == 'test'
|
229
|
-
|
230
|
-
Thread.new do
|
231
|
-
loop do
|
232
|
-
if @changed_files != [] && !@paused
|
233
|
-
changed_files = @changed_files.dup
|
234
|
-
clear_changed_files
|
235
|
-
::Guard.run_on_change(changed_files)
|
236
|
-
else
|
237
|
-
sleep 0.1
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
# Gets a list of files that are in the modified directories.
|
244
|
-
#
|
245
|
-
# @param [Array<String>] dirs the list of directories
|
246
|
-
# @param [Hash] options the find file option
|
247
|
-
# @option options [Symbol] all whether to files in sub directories
|
248
|
-
#
|
249
|
-
def potentially_modified_files(dirs, options = {})
|
250
|
-
paths = exclude_ignored_paths(dirs)
|
251
|
-
|
252
|
-
if options[:all]
|
253
|
-
paths.inject([]) do |array, path|
|
254
|
-
if File.file?(path)
|
255
|
-
array << path
|
256
|
-
else
|
257
|
-
array += Dir.glob("#{ path }/**/*", File::FNM_DOTMATCH).select { |p| File.file?(p) }
|
258
|
-
end
|
259
|
-
array
|
260
|
-
end
|
261
|
-
else
|
262
|
-
paths.select { |path| File.file?(path) }
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
# Test if the file content has changed.
|
267
|
-
#
|
268
|
-
# Depending on the filesystem, mtime/ctime is probably only precise to the second, so round
|
269
|
-
# both values down to the second for the comparison.
|
270
|
-
#
|
271
|
-
# ctime is used only on == comparison to always catches Rails 3.1 Assets pipelined on Mac OSX
|
272
|
-
#
|
273
|
-
# @param [String] path the file path
|
274
|
-
# @param [Time] last_event the time of the last event
|
275
|
-
# @return [Boolean] Whether the file content has changed or not.
|
276
|
-
#
|
277
|
-
def file_modified?(path, last_event)
|
278
|
-
ctime = File.ctime(path).to_i
|
279
|
-
mtime = File.mtime(path).to_i
|
280
|
-
|
281
|
-
if [mtime, ctime].max == last_event.to_i
|
282
|
-
file_content_modified?(path)
|
283
|
-
elsif mtime > last_event.to_i
|
284
|
-
set_sha1_checksums_hash(path)
|
285
|
-
set_file_timestamp_hash(path) if watch_all_modifications?
|
286
|
-
true
|
287
|
-
elsif watch_all_modifications?
|
288
|
-
ts = file_timestamp(path)
|
289
|
-
if ts != @file_timestamp_hash[path]
|
290
|
-
set_file_timestamp_hash(path, ts)
|
291
|
-
true
|
292
|
-
end
|
293
|
-
else
|
294
|
-
false
|
295
|
-
end
|
296
|
-
rescue
|
297
|
-
false
|
298
|
-
end
|
299
|
-
|
300
|
-
# Tests if the file content has been modified by
|
301
|
-
# comparing the SHA1 checksum.
|
302
|
-
#
|
303
|
-
# @param [String] path the file path
|
304
|
-
#
|
305
|
-
def file_content_modified?(path)
|
306
|
-
checksum = sha1_checksum(path)
|
307
|
-
if @sha1_checksums_hash[path] != checksum
|
308
|
-
set_sha1_checksums_hash(path, checksum)
|
309
|
-
true
|
310
|
-
else
|
311
|
-
false
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
# Set save a files current timestamp
|
316
|
-
#
|
317
|
-
# @param [String] path the file path
|
318
|
-
# @param [Integer] file_timestamp the files modified timestamp
|
319
|
-
#
|
320
|
-
def set_file_timestamp_hash(path, timestamp = nil)
|
321
|
-
@file_timestamp_hash[path] = timestamp ? timestamp : file_timestamp(path)
|
322
|
-
end
|
323
|
-
|
324
|
-
# Set the current checksum of a file.
|
325
|
-
#
|
326
|
-
# @param [String] path the file path
|
327
|
-
# @param [String] sha1_checksum the checksum of the file
|
328
|
-
#
|
329
|
-
def set_sha1_checksums_hash(path, checksum = nil)
|
330
|
-
@sha1_checksums_hash[path] = checksum ? checksum : sha1_checksum(path)
|
331
|
-
end
|
332
|
-
|
333
|
-
# Gets a files modified timestamp
|
334
|
-
#
|
335
|
-
# @param [String] path the file path
|
336
|
-
# @return [Integer] file modified timestamp
|
337
|
-
#
|
338
|
-
def file_timestamp(path)
|
339
|
-
File.mtime(path).to_i
|
340
|
-
end
|
341
|
-
|
342
|
-
# Calculates the SHA1 checksum of a file.
|
343
|
-
#
|
344
|
-
# @param [String] path the path to the file
|
345
|
-
# @return [String] the SHA1 checksum
|
346
|
-
#
|
347
|
-
def sha1_checksum(path)
|
348
|
-
Digest::SHA1.file(path).to_s
|
349
|
-
end
|
350
|
-
|
351
|
-
# Test if the OS is Mac OS X.
|
352
|
-
#
|
353
|
-
# @return [Boolean] Whether the OS is Mac OS X
|
354
|
-
#
|
355
|
-
def self.mac?
|
356
|
-
RbConfig::CONFIG['target_os'] =~ /darwin/i
|
357
|
-
end
|
358
|
-
|
359
|
-
# Test if the OS is Linux.
|
360
|
-
#
|
361
|
-
# @return [Boolean] Whether the OS is Linux
|
362
|
-
#
|
363
|
-
def self.linux?
|
364
|
-
RbConfig::CONFIG['target_os'] =~ /linux/i
|
365
|
-
end
|
366
|
-
|
367
|
-
# Test if the OS is Windows.
|
368
|
-
#
|
369
|
-
# @return [Boolean] Whether the OS is Windows
|
370
|
-
#
|
371
|
-
def self.windows?
|
372
|
-
RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
|
373
|
-
end
|
374
|
-
|
375
|
-
end
|
376
|
-
end
|