diff options
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/file_update_checker.rb | 15 | ||||
-rw-r--r-- | activesupport/test/file_update_checker_shared_tests.rb | 17 |
2 files changed, 29 insertions, 3 deletions
diff --git a/activesupport/lib/active_support/file_update_checker.rb b/activesupport/lib/active_support/file_update_checker.rb index 4f0a2dedc5..d1eb410c85 100644 --- a/activesupport/lib/active_support/file_update_checker.rb +++ b/activesupport/lib/active_support/file_update_checker.rb @@ -111,13 +111,22 @@ module ActiveSupport # healthy to consider this edge case because with mtimes in the future # reloading is not triggered. def max_mtime(paths) + return nil if paths.empty? + time_now = Time.now - time_at_zero = Time.at(0) - max_time = time_at_zero + max_time = nil paths.each do |path| time = File.mtime(path) + if max_time.nil? + if time.compare_without_coercion(time_now) < 0 + max_time = time + end + + next + end + # This avoids ActiveSupport::CoreExt::Time#time_with_coercion # which is super slow when comparing two Time objects # @@ -128,7 +137,7 @@ module ActiveSupport end end - max_time.object_id == time_at_zero.object_id ? nil : max_time + max_time end def compile_glob(hash) diff --git a/activesupport/test/file_update_checker_shared_tests.rb b/activesupport/test/file_update_checker_shared_tests.rb index 5207860a0e..a78c3a67b6 100644 --- a/activesupport/test/file_update_checker_shared_tests.rb +++ b/activesupport/test/file_update_checker_shared_tests.rb @@ -134,6 +134,23 @@ module FileUpdateCheckerSharedTests assert_equal 1, i end + test 'should return max_time for files with mtime = Time.at(0)' do + i = 0 + + FileUtils.touch(tmpfiles) + + now = Time.now + time = Time.at(0) # wrong mtime from the future + File.utime(time, time, tmpfiles[0]) + + checker = new_checker(tmpfiles) { i += 1 } + + touch(tmpfiles[1..-1]) + + assert checker.execute_if_updated + assert_equal 1, i + end + test 'should cache updated result until execute' do i = 0 |