From af759b81a1ed2fb2c932b7d10b31f6e8d7397f5b Mon Sep 17 00:00:00 2001 From: aamine Date: Thu, 14 Apr 2005 10:00:52 +0000 Subject: [PATCH] * lib/fileutils.rb (remove_file): ignore exceptions caused by chmod. * lib/fileutils.rb (remove_dir): try to get rights to rmdir. [ruby-Bugs:1502] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++-- lib/fileutils.rb | 33 ++++++++++++++++++++------- test/fileutils/test_fileutils.rb | 39 +++++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 656518facd..02288aba48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Apr 14 18:59:43 2005 Minero Aoki + + * lib/fileutils.rb (remove_file): ignore exceptions caused by + chmod. + + * lib/fileutils.rb (remove_dir): try to get rights to rmdir. + [ruby-Bugs:1502] + Thu Apr 14 18:51:02 2005 Keiju Ishitsuka * lib/irb/ruby-lex.rb, lib/irb/slex.rb: bug fix of [ruby-Bugs-1745] @@ -16,8 +24,7 @@ Thu Apr 14 05:35:45 2005 Keiju Ishitsuka * doc/irb/irb.rd.ja: a lost of release IRB 0.9.5. - * lib/irb/slex.rb: bug fix by [ruby-core :04707]. - + * lib/irb/slex.rb: bug fix by [ruby-core:04707]. Thu Apr 14 00:20:31 2005 Keiju Ishitsuka * bin/irb lib/irb.rb lib/irb/...: IRB 0.9.5. diff --git a/lib/fileutils.rb b/lib/fileutils.rb index 52575e18f1..60a5456e77 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -702,24 +702,30 @@ module FileUtils alias rmtree rm_rf - def remove_file(fname, force = false) #:nodoc: + # Removes a file +path+. + # This method ignores StandardError if +force+ is true. + def remove_file(path, force = false) first_time_p = true begin - File.unlink fname + File.unlink path rescue Errno::ENOENT raise unless force - rescue + rescue => err if first_time_p - # try once more for Windows first_time_p = false - File.chmod 0777, fname - retry + begin + File.chmod 0777, path + retry + rescue SystemCallError + end end - raise unless force + raise err unless force end end - def remove_dir(dir, force = false) #:nodoc: + # Removes a directory +dir+ and its contents recursively. + # This method ignores StandardError if +force+ is true. + def remove_dir(dir, force = false) Dir.foreach(dir) do |file| next if /\A\.\.?\z/ =~ file path = "#{dir}/#{file.untaint}" @@ -731,10 +737,21 @@ module FileUtils remove_file path, force end end + first_time_p = true begin Dir.rmdir dir.sub(%r, '') rescue Errno::ENOENT raise unless force + rescue => err + if first_time_p + first_time_p = false + begin + File.chmod 0777, dir + retry + rescue SystemCallError + end + end + raise err unless force end end diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb index 6ecd25c0f1..b959f04260 100644 --- a/test/fileutils/test_fileutils.rb +++ b/test/fileutils/test_fileutils.rb @@ -89,7 +89,6 @@ class TestFileUtils my_rm_rf 'data'; mymkdir 'data' my_rm_rf 'tmp'; mymkdir 'tmp' prepare_data_file - prepare_time_data end def teardown @@ -146,9 +145,9 @@ class TestFileUtils File.utime t-4, t-4, 'data/newer' end - def each_sample_file - TARGETS.each do |srcpath| - yield srcpath, "tmp/#{File.basename(srcpath)}" + def each_srcdest + TARGETS.each do |path| + yield path, "tmp/#{File.basename(path)}" end end @@ -191,7 +190,7 @@ end end def test_cp - each_sample_file do |srcpath, destpath| + each_srcdest do |srcpath, destpath| cp srcpath, destpath assert_same_file srcpath, destpath @@ -753,7 +752,7 @@ end end def test_copy_entry - each_sample_file do |srcpath, destpath| + each_srcdest do |srcpath, destpath| copy_entry srcpath, destpath assert_same_file srcpath, destpath assert_equal File.stat(srcpath).ftype, File.stat(destpath).ftype @@ -766,7 +765,7 @@ end end def test_copy_file - each_sample_file do |srcpath, destpath| + each_srcdest do |srcpath, destpath| copy_file srcpath, destpath assert_same_file srcpath, destpath end @@ -774,7 +773,7 @@ end def test_copy_stream # IO - each_sample_file do |srcpath, destpath| + each_srcdest do |srcpath, destpath| File.open(srcpath) {|src| File.open(destpath, 'w') {|dest| copy_stream src, dest @@ -786,7 +785,7 @@ end # duck typing test [ruby-dev:25369] rm_rf 'tmp' Dir.mkdir 'tmp' - each_sample_file do |srcpath, destpath| + each_srcdest do |srcpath, destpath| File.open(srcpath) {|src| File.open(destpath, 'w') {|dest| copy_stream Stream.new(src), Stream.new(dest) @@ -797,11 +796,28 @@ end end def test_remove_file - # FIXME + File.open('data/tmp', 'w') {|f| f.puts 'dummy' } + remove_file 'data/tmp' + assert_file_not_exist 'data/tmp' +if have_file_perm? + File.open('data/tmp', 'w') {|f| f.puts 'dummy' } + File.chmod 0, 'data/tmp' + remove_file 'data/tmp' + assert_file_not_exist 'data/tmp' +end end def test_remove_dir - # FIXME + Dir.mkdir 'data/tmpdir' + File.open('data/tmpdir/a', 'w') {|f| f.puts 'dummy' } + remove_dir 'data/tmpdir' + assert_file_not_exist 'data/tmpdir' +if have_file_perm? + Dir.mkdir 'data/tmpdir' + File.chmod 0555, 'data/tmpdir' + remove_dir 'data/tmpdir' + assert_file_not_exist 'data/tmpdir' +end end def test_compare_file @@ -827,6 +843,7 @@ end end def test_uptodate? + prepare_time_data Dir.chdir('data') { assert( uptodate?('newest', %w(old newer notexist)) ) assert( ! uptodate?('newer', %w(old newest notexist)) )