diff options
author | Yuji Yaginuma <yuuji.yaginuma@gmail.com> | 2018-12-21 16:58:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-21 16:58:47 +0900 |
commit | 1d21ad9c46b833d463cb1bb9fb593c6106f0e44a (patch) | |
tree | f30196077569784c8f05038425da6e86def7a094 /activesupport | |
parent | 5d905abbe77295e65c88b50940af4bfb99a48482 (diff) | |
parent | caa3cc8868206f8109e0d633efb09d31e94ef635 (diff) | |
download | rails-1d21ad9c46b833d463cb1bb9fb593c6106f0e44a.tar.gz rails-1d21ad9c46b833d463cb1bb9fb593c6106f0e44a.tar.bz2 rails-1d21ad9c46b833d463cb1bb9fb593c6106f0e44a.zip |
Merge pull request #33822 from y-yagi/do_not_check_parents_dor_directories
Do no watch parent directory of `dirs`
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/evented_file_update_checker.rb | 24 | ||||
-rw-r--r-- | activesupport/test/evented_file_update_checker_test.rb | 28 |
2 files changed, 50 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/evented_file_update_checker.rb b/activesupport/lib/active_support/evented_file_update_checker.rb index 97e982eb05..1ef8584c52 100644 --- a/activesupport/lib/active_support/evented_file_update_checker.rb +++ b/activesupport/lib/active_support/evented_file_update_checker.rb @@ -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! diff --git a/activesupport/test/evented_file_update_checker_test.rb b/activesupport/test/evented_file_update_checker_test.rb index a557608986..b2d5eb94c2 100644 --- a/activesupport/test/evented_file_update_checker_test.rb +++ b/activesupport/test/evented_file_update_checker_test.rb @@ -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 |