summaryrefslogtreecommitdiff
path: root/lib/rake/clean.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rake/clean.rb')
-rw-r--r--lib/rake/clean.rb23
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