diff options
Diffstat (limited to 'lib/rake/clean.rb')
-rw-r--r-- | lib/rake/clean.rb | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/rake/clean.rb b/lib/rake/clean.rb index 8001ce569a..a49cd44167 100644 --- a/lib/rake/clean.rb +++ b/lib/rake/clean.rb @@ -31,9 +31,30 @@ module Rake begin rm_r file_name, opts rescue StandardError => ex - puts "Failed to remove #{file_name}: #{ex}" + puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name) end end + + def file_already_gone?(file_name) + return false if File.exist?(file_name) + + path = file_name + prev = nil + + while path = File.dirname(path) + return false if cant_be_deleted?(path) + break if [prev, "."].include?(path) + prev = path + end + true + end + private_class_method :file_already_gone? + + def cant_be_deleted?(path_name) + File.exist?(path_name) && + (!File.readable?(path_name) || !File.executable?(path_name)) + end + private_class_method :cant_be_deleted? end end |