Fix the file watcher to correctly use relative paths, to ignore files we don't care about, and have a find_new_files method that works like reload_path, but only touches previously-unknown files. This all ends up speeding up the build by a lot.

This commit is contained in:
Ben Hollis 2012-04-23 01:12:52 -07:00
parent 9024de85d8
commit a4fcb4d939
2 changed files with 27 additions and 3 deletions

View file

@ -196,19 +196,25 @@ module Middleman::Cli
sort_order = %w(.png .jpeg .jpg .gif .bmp .svg .svgz .ico .woff .otf .ttf .eot .js .css) sort_order = %w(.png .jpeg .jpg .gif .bmp .svg .svgz .ico .woff .otf .ttf .eot .js .css)
# Pre-request CSS to give Compass a chance to build sprites # Pre-request CSS to give Compass a chance to build sprites
puts "== Prerendering CSS" if @app.logging?
@app.sitemap.resources.select do |resource| @app.sitemap.resources.select do |resource|
resource.ext == ".css" resource.ext == ".css"
end.each do |resource| end.each do |resource|
Middleman::Cli::Build.shared_rack.get(resource.destination_path.gsub(/\s/, "%20")) Middleman::Cli::Build.shared_rack.get(resource.destination_path.gsub(/\s/, "%20"))
end end
puts "== Checking for Compass sprites" if @app.logging?
# Double-check for compass sprites # Double-check for compass sprites
@app.files.reload_path(File.join(@app.source_dir, @app.images_dir)) @app.files.find_new_files(File.join(@app.source_dir, @app.images_dir))
# Sort paths to be built by the above order. This is primarily so Compass can # Sort paths to be built by the above order. This is primarily so Compass can
# find files in the build folder when it needs to generate sprites for the # find files in the build folder when it needs to generate sprites for the
# css files # css files
puts "== Building files" if @app.logging?
resources = @app.sitemap.resources.sort do |a, b| resources = @app.sitemap.resources.sort do |a, b|
a_idx = sort_order.index(a.ext) || 100 a_idx = sort_order.index(a.ext) || 100
b_idx = sort_order.index(b.ext) || 100 b_idx = sort_order.index(b.ext) || 100

View file

@ -103,12 +103,14 @@ module Middleman::CoreExtensions::FileWatcher
# @param [String] path The path to reload # @param [String] path The path to reload
# @return [void] # @return [void]
def reload_path(path) def reload_path(path)
subset = self.known_paths.select { |p| p.match(%r{^#{path}}) } relative_path = path.sub("#{self.instance.root}/", "")
subset = self.known_paths.select { |p| p.match(%r{^#{relative_path}}) }
Find.find(path) do |path| Find.find(path) do |path|
next if File.directory?(path) next if File.directory?(path)
next if Middleman::Watcher.ignore_list.any? { |r| path.match(r) }
relative_path = path.sub("#{self.instance.root}/", "") relative_path = path.sub("#{self.instance.root}/", "")
subset.delete(relative_path) if subset.include?(relative_path) subset.delete(relative_path)
self.did_change(relative_path) self.did_change(relative_path)
end if File.exists?(path) end if File.exists?(path)
@ -116,6 +118,22 @@ module Middleman::CoreExtensions::FileWatcher
self.did_delete(removed_path) self.did_delete(removed_path)
end end
end end
# Like reload_path, but only triggers events on new files
#
# @param [String] path The path to reload
# @return [void]
def find_new_files(path)
relative_path = path.sub("#{self.instance.root}/", "")
subset = self.known_paths.select { |p| p.match(%r{^#{relative_path}}) }
Find.find(path) do |file|
next if File.directory?(file)
next if Middleman::Watcher.ignore_list.any? { |r| path.match(r) }
relative_path = file.sub("#{self.instance.root}/", "")
self.did_change(relative_path) unless subset.include?(relative_path)
end if File.exists?(path)
end
protected protected
# Notify callbacks for a file given an array of callbacks # Notify callbacks for a file given an array of callbacks