Normalize file path string encoding on darwin. For #1506

This commit is contained in:
Thomas Reynolds 2015-05-17 12:25:17 -07:00
parent f7ba4ada20
commit a25e9c6382
9 changed files with 47 additions and 9 deletions

View file

@ -57,7 +57,9 @@ module Middleman
# Root project directory (overwritten in middleman build/server) # Root project directory (overwritten in middleman build/server)
# @return [String] # @return [String]
def self.root def self.root
ENV['MM_ROOT'] || Dir.pwd r = ENV['MM_ROOT'] ? ENV['MM_ROOT'].dup : ::Middleman::Util.current_directory
r.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
r
end end
delegate :root, to: :"self.class" delegate :root, to: :"self.class"

View file

@ -138,7 +138,9 @@ module Middleman::Cli
base.remove_file f, force: true base.remove_file f, force: true
end end
Dir[@build_dir.join('**', '*')].select { |d| File.directory?(d) }.each do |d| ::Middleman::Util.glob_directory(@build_dir.join('**', '*'))
.select { |d| File.directory?(d) }
.each do |d|
base.remove_file d, force: true if directory_empty? d base.remove_file d, force: true if directory_empty? d
end end
end end

View file

@ -62,7 +62,7 @@ module Middleman::Cli
unless ENV['MM_ROOT'] unless ENV['MM_ROOT']
puts '== Could not find a Middleman project config.rb' puts '== Could not find a Middleman project config.rb'
puts '== Treating directory as a static site to be served' puts '== Treating directory as a static site to be served'
ENV['MM_ROOT'] = Dir.pwd ENV['MM_ROOT'] = ::Middleman::Util.current_directory
ENV['MM_SOURCE'] = '' ENV['MM_SOURCE'] = ''
end end

View file

@ -19,7 +19,8 @@ module Middleman
helpers_path = File.join(root, config[:helpers_dir]) helpers_path = File.join(root, config[:helpers_dir])
next unless File.exist?(helpers_path) next unless File.exist?(helpers_path)
Dir[File.join(helpers_path, config[:helpers_filename_glob])].each do |filename| glob = File.join(helpers_path, config[:helpers_filename_glob])
::Middleman::Util.glob_directory(glob).each do |filename|
module_name = config[:helpers_filename_to_module_name_proc].call(filename) module_name = config[:helpers_filename_to_module_name_proc].call(filename)
next unless module_name next unless module_name

View file

@ -95,6 +95,8 @@ module Middleman
# @param [Pathname] path The file that changed # @param [Pathname] path The file that changed
# @return [void] # @return [void]
def did_change(path) def did_change(path)
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
path = Pathname(path) path = Pathname(path)
logger.debug "== File Change: #{path}" logger.debug "== File Change: #{path}"
@known_paths << path @known_paths << path
@ -106,6 +108,8 @@ module Middleman
# @param [Pathname] path The file that was deleted # @param [Pathname] path The file that was deleted
# @return [void] # @return [void]
def did_delete(path) def did_delete(path)
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
path = Pathname(path) path = Pathname(path)
logger.debug "== File Deletion: #{path}" logger.debug "== File Deletion: #{path}"
@known_paths.delete(path) @known_paths.delete(path)
@ -146,7 +150,10 @@ module Middleman
end end
def exists?(path) def exists?(path)
path = path.to_s.encode!('UTF-8', 'UTF-8-MAC') if RUBY_PLATFORM =~ /darwin/
p = Pathname(path) p = Pathname(path)
p = p.relative_path_from(Pathname(@app.root)) unless p.relative? p = p.relative_path_from(Pathname(@app.root)) unless p.relative?
@known_paths.include?(p) @known_paths.include?(p)
end end

View file

@ -503,7 +503,7 @@ module Middleman
found_path = nil found_path = nil
search_paths.each do |path_with_ext| search_paths.each do |path_with_ext|
found_path = Dir[path_with_ext].find do |path| found_path = ::Middleman::Util.glob_directory(path_with_ext).find do |path|
::Tilt[path] ::Tilt[path]
end end

View file

@ -144,7 +144,7 @@ module Middleman
options = { force_polling: @options[:force_polling] } options = { force_polling: @options[:force_polling] }
options[:latency] = @options[:latency] if @options[:latency] options[:latency] = @options[:latency] if @options[:latency]
@listener = Listen.to(Dir.pwd, options) do |modified, added, removed| @listener = Listen.to(::Middleman::Util.current_directory, options) do |modified, added, removed|
added_and_modified = (modified + added) added_and_modified = (modified + added)
# See if the changed file is config.rb or lib/*.rb # See if the changed file is config.rb or lib/*.rb
@ -152,14 +152,16 @@ module Middleman
$mm_reload = true $mm_reload = true
@webrick.stop @webrick.stop
else else
wd = Pathname(::Middleman::Util.current_directory)
added_and_modified.each do |path| added_and_modified.each do |path|
relative_path = Pathname(path).relative_path_from(Pathname(Dir.pwd)).to_s relative_path = Pathname(path).relative_path_from(wd).to_s
next if app.files.ignored?(relative_path) next if app.files.ignored?(relative_path)
app.files.did_change(relative_path) app.files.did_change(relative_path)
end end
removed.each do |path| removed.each do |path|
relative_path = Pathname(path).relative_path_from(Pathname(Dir.pwd)).to_s relative_path = Pathname(path).relative_path_from(wd).to_s
next if app.files.ignored?(relative_path) next if app.files.ignored?(relative_path)
app.files.did_delete(relative_path) app.files.did_delete(relative_path)
end end

View file

@ -222,6 +222,30 @@ module Middleman
end end
end end
# Glob a directory and try to keep path encoding consistent.
#
# @param [String] path The glob path.
# @return [Array<String>]
def glob_directory(path)
results = ::Dir[path]
return results unless RUBY_PLATFORM =~ /darwin/
results.map { |r| r.encode('UTF-8', 'UTF-8-MAC') }
end
# Get the PWD and try to keep path encoding consistent.
#
# @param [String] path The glob path.
# @return [Array<String>]
def current_directory
result = ::Dir.pwd
return result unless RUBY_PLATFORM =~ /darwin/
result.encode('UTF-8', 'UTF-8-MAC')
end
private private
# Is mime type known to be non-binary? # Is mime type known to be non-binary?

View file

@ -133,7 +133,7 @@ class Middleman::CoreExtensions::Internationalization < ::Middleman::Extension
end end
def configure_i18n def configure_i18n
::I18n.load_path += Dir[File.join(app.root, @locales_glob)] ::I18n.load_path += ::Middleman::Util.glob_directory(File.join(app.root, @locales_glob))
::I18n.reload! ::I18n.reload!
::I18n.default_locale = @mount_at_root ::I18n.default_locale = @mount_at_root