class Gem::Doctor
def doctor
def doctor @orig_home = Gem.dir @orig_path = Gem.path say "Checking #{@gem_repository}" Gem.use_paths @gem_repository.to_s unless gem_repository? say 'This directory does not appear to be a RubyGems repository, ' + 'skipping' say return end doctor_children say ensure Gem.use_paths @orig_home, *@orig_path end
def doctor_child(sub_directory, extension) # :nodoc:
def doctor_child(sub_directory, extension) # :nodoc: directory = File.join(@gem_repository, sub_directory) Dir.entries(directory).sort.each do |ent| next if ent == "." || ent == ".." child = File.join(directory, ent) next unless File.exist?(child) basename = File.basename(child, extension) next if installed_specs.include? basename next if /^rubygems-\d/ =~ basename next if 'specifications' == sub_directory and 'default' == basename next if 'plugins' == sub_directory and Gem.plugin_suffix_regexp =~ basename type = File.directory?(child) ? 'directory' : 'file' action = if @dry_run 'Extra' else FileUtils.rm_r(child) 'Removed' end say "#{action} #{type} #{sub_directory}/#{File.basename(child)}" end rescue Errno::ENOENT # ignore end
def doctor_children # :nodoc:
def doctor_children # :nodoc: REPOSITORY_EXTENSION_MAP.each do |sub_directory, extension| doctor_child sub_directory, extension end end
def gem_repository?
def gem_repository? not installed_specs.empty? end
def initialize(gem_repository, dry_run = false)
def initialize(gem_repository, dry_run = false) @gem_repository = gem_repository @dry_run = dry_run @installed_specs = nil end
def installed_specs # :nodoc:
def installed_specs # :nodoc: @installed_specs ||= Gem::Specification.map {|s| s.full_name } end