* {lib,test}/rubygems: set property.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-11-10 08:05:00 +00:00
parent fbf59bdbea
commit f3a250758d

View File

@ -1,183 +1,183 @@
#-- #--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved. # All rights reserved.
# See LICENSE.txt for permissions. # See LICENSE.txt for permissions.
#++ #++
require 'fileutils' require 'fileutils'
require 'rubygems' require 'rubygems'
require 'rubygems/dependency_list' require 'rubygems/dependency_list'
require 'rubygems/doc_manager' require 'rubygems/doc_manager'
require 'rubygems/user_interaction' require 'rubygems/user_interaction'
## ##
# An Uninstaller. # An Uninstaller.
# #
class Gem::Uninstaller class Gem::Uninstaller
include Gem::UserInteraction include Gem::UserInteraction
## ##
# Constructs an Uninstaller instance # Constructs an Uninstaller instance
# #
# gem:: [String] The Gem name to uninstall # gem:: [String] The Gem name to uninstall
# #
def initialize(gem, options) def initialize(gem, options)
@gem = gem @gem = gem
@version = options[:version] || Gem::Requirement.default @version = options[:version] || Gem::Requirement.default
@force_executables = options[:executables] @force_executables = options[:executables]
@force_all = options[:all] @force_all = options[:all]
@force_ignore = options[:ignore] @force_ignore = options[:ignore]
end end
## ##
# Performs the uninstall of the Gem. This removes the spec, the # Performs the uninstall of the Gem. This removes the spec, the
# Gem directory, and the cached .gem file, # Gem directory, and the cached .gem file,
# #
def uninstall def uninstall
list = Gem.source_index.search(/^#{@gem}$/, @version) list = Gem.source_index.search(/^#{@gem}$/, @version)
if list.empty? then if list.empty? then
raise Gem::InstallError, "Unknown gem #{@gem}-#{@version}" raise Gem::InstallError, "Unknown gem #{@gem}-#{@version}"
elsif list.size > 1 && @force_all elsif list.size > 1 && @force_all
remove_all(list.dup) remove_all(list.dup)
remove_executables(list.last) remove_executables(list.last)
elsif list.size > 1 elsif list.size > 1
say say
gem_names = list.collect {|gem| gem.full_name} + ["All versions"] gem_names = list.collect {|gem| gem.full_name} + ["All versions"]
gem_name, index = gem_name, index =
choose_from_list("Select gem to uninstall:", gem_names) choose_from_list("Select gem to uninstall:", gem_names)
if index == list.size if index == list.size
remove_all(list.dup) remove_all(list.dup)
remove_executables(list.last) remove_executables(list.last)
elsif index >= 0 && index < list.size elsif index >= 0 && index < list.size
to_remove = list[index] to_remove = list[index]
remove(to_remove, list) remove(to_remove, list)
remove_executables(to_remove) remove_executables(to_remove)
else else
say "Error: must enter a number [1-#{list.size+1}]" say "Error: must enter a number [1-#{list.size+1}]"
end end
else else
remove(list[0], list.dup) remove(list[0], list.dup)
remove_executables(list.last) remove_executables(list.last)
end end
end end
## ##
# Remove executables and batch files (windows only) for the gem as # Remove executables and batch files (windows only) for the gem as
# it is being installed # it is being installed
# #
# gemspec::[Specification] the gem whose executables need to be removed. # gemspec::[Specification] the gem whose executables need to be removed.
# #
def remove_executables(gemspec) def remove_executables(gemspec)
return if gemspec.nil? return if gemspec.nil?
if(gemspec.executables.size > 0) if(gemspec.executables.size > 0)
raise Gem::FilePermissionError.new(Gem.bindir) unless raise Gem::FilePermissionError.new(Gem.bindir) unless
File.writable?(Gem.bindir) File.writable?(Gem.bindir)
list = Gem.source_index.search(gemspec.name).delete_if { |spec| list = Gem.source_index.search(gemspec.name).delete_if { |spec|
spec.version == gemspec.version spec.version == gemspec.version
} }
executables = gemspec.executables.clone executables = gemspec.executables.clone
list.each do |spec| list.each do |spec|
spec.executables.each do |exe_name| spec.executables.each do |exe_name|
executables.delete(exe_name) executables.delete(exe_name)
end end
end end
return if executables.size == 0 return if executables.size == 0
answer = @force_executables || ask_yes_no( answer = @force_executables || ask_yes_no(
"Remove executables and scripts for\n" + "Remove executables and scripts for\n" +
"'#{gemspec.executables.join(", ")}' in addition to the gem?", "'#{gemspec.executables.join(", ")}' in addition to the gem?",
true) # " # appease ruby-mode - don't ask true) # " # appease ruby-mode - don't ask
unless answer unless answer
say "Executables and scripts will remain installed." say "Executables and scripts will remain installed."
return return
else else
gemspec.executables.each do |exe_name| gemspec.executables.each do |exe_name|
say "Removing #{exe_name}" say "Removing #{exe_name}"
File.unlink File.join(Gem.bindir, exe_name) rescue nil File.unlink File.join(Gem.bindir, exe_name) rescue nil
File.unlink File.join(Gem.bindir, exe_name + ".bat") rescue nil File.unlink File.join(Gem.bindir, exe_name + ".bat") rescue nil
end end
end end
end end
end end
# #
# list:: the list of all gems to remove # list:: the list of all gems to remove
# #
# Warning: this method modifies the +list+ parameter. Once it has # Warning: this method modifies the +list+ parameter. Once it has
# uninstalled a gem, it is removed from that list. # uninstalled a gem, it is removed from that list.
# #
def remove_all(list) def remove_all(list)
list.dup.each { |gem| remove(gem, list) } list.dup.each { |gem| remove(gem, list) }
end end
# #
# spec:: the spec of the gem to be uninstalled # spec:: the spec of the gem to be uninstalled
# list:: the list of all such gems # list:: the list of all such gems
# #
# Warning: this method modifies the +list+ parameter. Once it has # Warning: this method modifies the +list+ parameter. Once it has
# uninstalled a gem, it is removed from that list. # uninstalled a gem, it is removed from that list.
# #
def remove(spec, list) def remove(spec, list)
unless ok_to_remove? spec then unless ok_to_remove? spec then
raise Gem::DependencyRemovalException, raise Gem::DependencyRemovalException,
"Uninstallation aborted due to dependent gem(s)" "Uninstallation aborted due to dependent gem(s)"
end end
raise Gem::FilePermissionError, spec.installation_path unless raise Gem::FilePermissionError, spec.installation_path unless
File.writable?(spec.installation_path) File.writable?(spec.installation_path)
FileUtils.rm_rf spec.full_gem_path FileUtils.rm_rf spec.full_gem_path
original_platform_name = [ original_platform_name = [
spec.name, spec.version, spec.original_platform].join '-' spec.name, spec.version, spec.original_platform].join '-'
spec_dir = File.join spec.installation_path, 'specifications' spec_dir = File.join spec.installation_path, 'specifications'
gemspec = File.join spec_dir, "#{spec.full_name}.gemspec" gemspec = File.join spec_dir, "#{spec.full_name}.gemspec"
unless File.exist? gemspec then unless File.exist? gemspec then
gemspec = File.join spec_dir, "#{original_platform_name}.gemspec" gemspec = File.join spec_dir, "#{original_platform_name}.gemspec"
end end
FileUtils.rm_rf gemspec FileUtils.rm_rf gemspec
cache_dir = File.join spec.installation_path, 'cache' cache_dir = File.join spec.installation_path, 'cache'
gem = File.join cache_dir, "#{spec.full_name}.gem" gem = File.join cache_dir, "#{spec.full_name}.gem"
unless File.exist? gemspec then unless File.exist? gemspec then
gem = File.join cache_dir, "#{original_platform_name}.gem" gem = File.join cache_dir, "#{original_platform_name}.gem"
end end
FileUtils.rm_rf gem FileUtils.rm_rf gem
Gem::DocManager.new(spec).uninstall_doc Gem::DocManager.new(spec).uninstall_doc
say "Successfully uninstalled #{spec.full_name}" say "Successfully uninstalled #{spec.full_name}"
list.delete spec list.delete spec
end end
def ok_to_remove?(spec) def ok_to_remove?(spec)
return true if @force_ignore return true if @force_ignore
srcindex = Gem::SourceIndex.from_installed_gems srcindex = Gem::SourceIndex.from_installed_gems
deplist = Gem::DependencyList.from_source_index srcindex deplist = Gem::DependencyList.from_source_index srcindex
deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec) deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
end end
def ask_if_ok(spec) def ask_if_ok(spec)
msg = [''] msg = ['']
msg << 'You have requested to uninstall the gem:' msg << 'You have requested to uninstall the gem:'
msg << "\t#{spec.full_name}" msg << "\t#{spec.full_name}"
spec.dependent_gems.each do |gem,dep,satlist| spec.dependent_gems.each do |gem,dep,satlist|
msg << msg <<
("#{gem.name}-#{gem.version} depends on " + ("#{gem.name}-#{gem.version} depends on " +
"[#{dep.name} (#{dep.version_requirements})]") "[#{dep.name} (#{dep.version_requirements})]")
end end
msg << 'If you remove this gems, one or more dependencies will not be met.' msg << 'If you remove this gems, one or more dependencies will not be met.'
msg << 'Continue with Uninstall?' msg << 'Continue with Uninstall?'
return ask_yes_no(msg.join("\n"), true) return ask_yes_no(msg.join("\n"), true)
end end
end end