Feature #8657 ยป find-respect-encodings.patch
| lib/find.rb | ||
|---|---|---|
|
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
|
||
|
#
|
||