diff options
author | ktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-09-07 04:34:27 +0000 |
---|---|---|
committer | ktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-09-07 04:34:27 +0000 |
commit | 0a4801e768cd93c79666f32460306f132009aa9d (patch) | |
tree | 41f623a2805d42f52d14e61aaf7f04935b27bb1e /lib/find.rb | |
parent | dd946739dd5cf4c6e9f6e1d31dfbcccc937e9d4f (diff) | |
download | ruby-0a4801e768cd93c79666f32460306f132009aa9d.tar.gz |
* lib/find.rb (Find.find): respect the encodings of arguments.
[ruby-dev:47530] [Feature #8657]
* test/test_find.rb: add tests.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42866 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/find.rb')
-rw-r--r-- | lib/find.rb | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/lib/find.rb b/lib/find.rb index 571609cdef..6f3e4282ed 100644 --- a/lib/find.rb +++ b/lib/find.rb @@ -37,30 +37,36 @@ module Find def find(*paths) # :yield: path block_given? or return enum_for(__method__, *paths) - paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup} - while file = paths.shift - catch(:prune) do - yield file.dup.taint - begin - s = File.lstat(file) - rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG - next - end - if s.directory? then + fs_encoding = Encoding.find("filesystem") + + paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}.each do |path| + enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding + ps = [path] + while file = ps.shift + catch(:prune) do + yield file.dup.taint begin - fs = Dir.entries(file) + s = File.lstat(file) rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG next end - fs.sort! - fs.reverse_each {|f| - next if f == "." or f == ".." - f = File.join(file, f) - paths.unshift f.untaint - } + if s.directory? then + begin + fs = Dir.entries(file, encoding: enc) + rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG + next + end + fs.sort! + fs.reverse_each {|f| + next if f == "." or f == ".." + f = File.join(file, f) + ps.unshift f.untaint + } + end end end end + nil end # |