From 6d1c3562a705d06b4f8e09276dc12a10c80c76b4 Mon Sep 17 00:00:00 2001 From: Thomas Reynolds Date: Wed, 20 Jan 2016 12:20:27 -0800 Subject: [PATCH] Differentiate polling from find_new_files to remove double reads in build mode --- .../core_extensions/file_watcher.rb | 4 ++-- middleman-core/lib/middleman-core/sources.rb | 15 +++++++++++++-- .../lib/middleman-core/sources/source_watcher.rb | 11 +++++++++++ .../step_definitions/middleman_steps.rb | 4 ++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb b/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb index b5769b86..82df8f73 100644 --- a/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb +++ b/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb @@ -47,7 +47,7 @@ module Middleman # @return [void] Contract Any def before_configuration - @sources.find_new_files! + @sources.poll_once! end # After we config, find new files since config can change paths. @@ -60,7 +60,7 @@ module Middleman end @sources.start! - @sources.find_new_files! + @sources.poll_once! end protected diff --git a/middleman-core/lib/middleman-core/sources.rb b/middleman-core/lib/middleman-core/sources.rb index 267a8069..7114d9f0 100644 --- a/middleman-core/lib/middleman-core/sources.rb +++ b/middleman-core/lib/middleman-core/sources.rb @@ -91,7 +91,7 @@ module Middleman validator: (block_given? ? block : regex)) bump_count - find_new_files! if @running + poll_once! if @running end # Whether this path is ignored. @@ -219,13 +219,24 @@ module Middleman .find { |d| d.exists?(path) } end - # Manually poll all watchers for new content. + # Manually check for new files # # @return [void] Contract ArrayOf[Pathname] def find_new_files! return [] unless @update_count != @last_update_count + @last_update_count = @update_count + watchers.reduce([]) { |sum, w| sum + w.find_new_files! } + end + + # Manually poll all watchers for new content. + # + # @return [void] + Contract ArrayOf[Pathname] + def poll_once! + return [] unless @update_count != @last_update_count + @last_update_count = @update_count watchers.reduce([]) { |sum, w| sum + w.poll_once! } end diff --git a/middleman-core/lib/middleman-core/sources/source_watcher.rb b/middleman-core/lib/middleman-core/sources/source_watcher.rb index 84c1506b..70f749b0 100644 --- a/middleman-core/lib/middleman-core/sources/source_watcher.rb +++ b/middleman-core/lib/middleman-core/sources/source_watcher.rb @@ -1,6 +1,7 @@ # Watcher Library require 'listen' require 'middleman-core/contracts' +require 'digest' # Monkey patch Listen silencer so `only` works on directories too module Listen @@ -177,6 +178,16 @@ module Middleman @listener = nil end + Contract ArrayOf[Pathname] + def find_new_files! + new_files = ::Middleman::Util.all_files_under(@directory.to_s) + .reject { |p| @files.key?(p) } + + update(new_files, []) + + new_files + end + # Manually trigger update events. # # @return [void] diff --git a/middleman-core/lib/middleman-core/step_definitions/middleman_steps.rb b/middleman-core/lib/middleman-core/step_definitions/middleman_steps.rb index 63236a10..35a4a681 100644 --- a/middleman-core/lib/middleman-core/step_definitions/middleman_steps.rb +++ b/middleman-core/lib/middleman-core/step_definitions/middleman_steps.rb @@ -31,13 +31,13 @@ end Then /^the file "([^\"]*)" has the contents$/ do |path, contents| write_file(path, contents) - @server_inst.files.find_new_files! + @server_inst.files.poll_once! end Then /^the file "([^\"]*)" is removed$/ do |path| step %Q{I remove the file "#{path}"} - @server_inst.files.find_new_files! + @server_inst.files.poll_once! end Given /^a modification time for a file named "([^\"]*)"$/ do |file|