mirror of https://github.com/rails/rails
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:
commit
1d21ad9c46
|
@ -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!
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue