Merge pull request #33822 from y-yagi/do_not_check_parents_dor_directories

Do no watch parent directory of `dirs`
This commit is contained in:
Yuji Yaginuma 2018-12-21 16:58:47 +09:00 committed by GitHub
commit 1d21ad9c46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 2 deletions

View File

@ -52,7 +52,10 @@ module ActiveSupport
@pid = Process.pid
@boot_mutex = Mutex.new
if (@dtw = directories_to_watch).any?
dtw = directories_to_watch
@dtw, @missing = dtw.partition(&:exist?)
if @dtw.any?
# Loading listen triggers warnings. These are originated by a legit
# usage of attr_* macros for private attributes, but adds a lot of noise
# to our test suite. Thus, we lazy load it and disable warnings locally.
@ -75,6 +78,19 @@ module ActiveSupport
@updated.make_true
end
end
if @missing.any?(&:exist?)
@boot_mutex.synchronize do
appeared, @missing = @missing.partition(&:exist?)
shutdown!
@dtw += appeared
boot!
@updated.make_true
end
end
@updated.true?
end
@ -96,6 +112,10 @@ module ActiveSupport
Listen.to(*@dtw, &method(:changed)).start
end
def shutdown!
Listen.stop
end
def changed(modified, added, removed)
unless updated?
@updated.make_true if (modified + added + removed).any? { |f| watching?(f) }
@ -123,7 +143,7 @@ module ActiveSupport
end
def directories_to_watch
dtw = (@files + @dirs.keys).map { |f| @ph.existing_parent(f) }
dtw = @files.map(&:dirname) + @dirs.keys
dtw.compact!
dtw.uniq!

View File

@ -76,6 +76,34 @@ class EventedFileUpdateCheckerTest < ActiveSupport::TestCase
Process.wait(pid)
end
test "updated should become true when nonexistent directory is added later" do
Dir.mktmpdir do |dir|
watched_dir = File.join(dir, "app")
unwatched_dir = File.join(dir, "node_modules")
not_exist_watched_dir = File.join(dir, "test")
Dir.mkdir(watched_dir)
Dir.mkdir(unwatched_dir)
checker = new_checker([], watched_dir => ".rb", not_exist_watched_dir => ".rb") { }
FileUtils.touch(File.join(watched_dir, "a.rb"))
wait
assert_predicate checker, :updated?
assert checker.execute_if_updated
Dir.mkdir(not_exist_watched_dir)
wait
assert_predicate checker, :updated?
assert checker.execute_if_updated
FileUtils.touch(File.join(unwatched_dir, "a.rb"))
wait
assert_not_predicate checker, :updated?
assert_not checker.execute_if_updated
end
end
end
class EventedFileUpdateCheckerPathHelperTest < ActiveSupport::TestCase