mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
dd946739dd
commit
0a4801e768
3 changed files with 64 additions and 17 deletions
|
@ -1,3 +1,10 @@
|
|||
Sat Sep 7 13:29:22 2013 Kazuki Tsujimoto <kazuki@callcc.net>
|
||||
|
||||
* lib/find.rb (Find.find): respect the encodings of arguments.
|
||||
[ruby-dev:47530] [Feature #8657]
|
||||
|
||||
* test/test_find.rb: add tests.
|
||||
|
||||
Sat Sep 7 10:40:32 2013 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* ext/socket/mkconstants.rb (TCP_FASTOPEN): Defined for TCP fast open.
|
||||
|
|
40
lib/find.rb
40
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
|
||||
|
||||
#
|
||||
|
|
|
@ -210,6 +210,40 @@ class TestFind < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_encoding_ascii
|
||||
Dir.mktmpdir {|d|
|
||||
File.open("#{d}/a", "w"){}
|
||||
Dir.mkdir("#{d}/b")
|
||||
a = []
|
||||
Find.find(d.encode(Encoding::US_ASCII)) {|f| a << f }
|
||||
a.each do |i|
|
||||
assert(Encoding.compatible?(d.encode(Encoding.find('filesystem')), i))
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def test_encoding_non_ascii
|
||||
Dir.mktmpdir {|d|
|
||||
File.open("#{d}/a", "w"){}
|
||||
Dir.mkdir("#{d}/b")
|
||||
euc_jp = Encoding::EUC_JP
|
||||
win_31j = Encoding::Windows_31J
|
||||
utf_8 = Encoding::UTF_8
|
||||
a = []
|
||||
Find.find(d.encode(euc_jp), d.encode(win_31j), d.encode(utf_8)) {|f| a << [f, f.encoding] }
|
||||
assert_equal([[d, euc_jp], ["#{d}/a", euc_jp], ["#{d}/b", euc_jp],
|
||||
[d, win_31j], ["#{d}/a", win_31j], ["#{d}/b", win_31j],
|
||||
[d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8]],
|
||||
a)
|
||||
if /mswin|mingw/ =~ RUBY_PLATFORM
|
||||
a = []
|
||||
Dir.mkdir("#{d}/\u{2660}")
|
||||
Find.find("#{d}".encode(utf_8)) {|f| a << [f, f.encoding] }
|
||||
assert_equal([[d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8], ["#{d}/\u{2660}", utf_8]], a)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
class TestInclude < Test::Unit::TestCase
|
||||
include Find
|
||||
|
||||
|
|
Loading…
Reference in a new issue