diff options
Diffstat (limited to 'lib/rubygems/uninstaller.rb')
-rw-r--r-- | lib/rubygems/uninstaller.rb | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/rubygems/uninstaller.rb b/lib/rubygems/uninstaller.rb index 89f47a45fe..3059099373 100644 --- a/lib/rubygems/uninstaller.rb +++ b/lib/rubygems/uninstaller.rb @@ -213,8 +213,8 @@ class Gem::Uninstaller exe_file = File.join bin_dir, exe_name - FileUtils.rm_f exe_file - FileUtils.rm_f "#{exe_file}.bat" + safe_delete { FileUtils.rm exe_file } + safe_delete { FileUtils.rm "#{exe_file}.bat" } end else say "Executables and scripts will remain installed." @@ -250,26 +250,26 @@ class Gem::Uninstaller raise Gem::FilePermissionError, spec.base_dir unless File.writable?(spec.base_dir) - FileUtils.rm_rf spec.full_gem_path - FileUtils.rm_rf spec.extension_dir + safe_delete { FileUtils.rm_r spec.full_gem_path } + safe_delete { FileUtils.rm_r spec.extension_dir } old_platform_name = spec.original_name - gemspec = spec.spec_file - - unless File.exist? gemspec then - gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec") - end - - FileUtils.rm_rf gemspec gem = spec.cache_file gem = File.join(spec.cache_dir, "#{old_platform_name}.gem") unless File.exist? gem - FileUtils.rm_rf gem + safe_delete { FileUtils.rm_r gem } Gem::RDoc.new(spec).remove + gemspec = spec.spec_file + + unless File.exist? gemspec then + gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec") + end + + safe_delete { FileUtils.rm_r gemspec } say "Successfully uninstalled #{spec.full_name}" Gem::Specification.reset @@ -343,4 +343,15 @@ class Gem::Uninstaller filename end end + + def safe_delete(&block) + block.call + rescue Errno::ENOENT + nil + rescue Errno::EPERM + e = Gem::UninstallError.new + e.spec = @spec + + raise e + end end |