mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
find.rb: add ignore_error
* lib/find.rb (Find#find): add "ignore_error" keyword argument defaulted to true. [ruby-core:51025] [Feature #7596] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45241 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2bb8811484
commit
aad895181e
3 changed files with 29 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Sun Mar 2 11:15:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/find.rb (Find#find): add "ignore_error" keyword argument
|
||||||
|
defaulted to true. [ruby-core:51025] [Feature #7596]
|
||||||
|
|
||||||
Sun Mar 2 11:13:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Sun Mar 2 11:13:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* ext/readline/extconf.rb (rl_hook_func_t): define as Function for
|
* ext/readline/extconf.rb (rl_hook_func_t): define as Function for
|
||||||
|
|
|
@ -34,7 +34,7 @@ module Find
|
||||||
#
|
#
|
||||||
# See the +Find+ module documentation for an example.
|
# See the +Find+ module documentation for an example.
|
||||||
#
|
#
|
||||||
def find(*paths) # :yield: path
|
def find(*paths, ignore_error: true) # :yield: path
|
||||||
block_given? or return enum_for(__method__, *paths)
|
block_given? or return enum_for(__method__, *paths)
|
||||||
|
|
||||||
fs_encoding = Encoding.find("filesystem")
|
fs_encoding = Encoding.find("filesystem")
|
||||||
|
@ -48,12 +48,14 @@ module Find
|
||||||
begin
|
begin
|
||||||
s = File.lstat(file)
|
s = File.lstat(file)
|
||||||
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
|
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
|
||||||
|
raise unless ignore_error
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
if s.directory? then
|
if s.directory? then
|
||||||
begin
|
begin
|
||||||
fs = Dir.entries(file, encoding: enc)
|
fs = Dir.entries(file, encoding: enc)
|
||||||
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
|
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
|
||||||
|
raise unless ignore_error
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
fs.sort!
|
fs.sort!
|
||||||
|
|
|
@ -100,6 +100,16 @@ class TestFind < Test::Unit::TestCase
|
||||||
a = []
|
a = []
|
||||||
Find.find(d) {|f| a << f }
|
Find.find(d) {|f| a << f }
|
||||||
assert_equal([d, dir], a)
|
assert_equal([d, dir], a)
|
||||||
|
|
||||||
|
a = []
|
||||||
|
Find.find(d, ignore_error: true) {|f| a << f }
|
||||||
|
assert_equal([d, dir], a)
|
||||||
|
|
||||||
|
a = []
|
||||||
|
assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(dir)}/) do
|
||||||
|
Find.find(d, ignore_error: false) {|f| a << f }
|
||||||
|
end
|
||||||
|
assert_equal([d, dir], a)
|
||||||
ensure
|
ensure
|
||||||
File.chmod(0700, dir)
|
File.chmod(0700, dir)
|
||||||
end
|
end
|
||||||
|
@ -115,6 +125,17 @@ class TestFind < Test::Unit::TestCase
|
||||||
a = []
|
a = []
|
||||||
Find.find(d) {|f| a << f }
|
Find.find(d) {|f| a << f }
|
||||||
assert_equal([d, dir, file], a)
|
assert_equal([d, dir, file], a)
|
||||||
|
|
||||||
|
a = []
|
||||||
|
Find.find(d, ignore_error: true) {|f| a << f }
|
||||||
|
assert_equal([d, dir, file], a)
|
||||||
|
|
||||||
|
a = []
|
||||||
|
assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(file)}/) do
|
||||||
|
Find.find(d, ignore_error: false) {|f| a << f }
|
||||||
|
end
|
||||||
|
assert_equal([d, dir, file], a)
|
||||||
|
|
||||||
skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM
|
skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM
|
||||||
assert_raise(Errno::EACCES) { File.lstat(file) }
|
assert_raise(Errno::EACCES) { File.lstat(file) }
|
||||||
ensure
|
ensure
|
||||||
|
|
Loading…
Add table
Reference in a new issue