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:

: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:

: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:

:nodoc:
def installed_specs # :nodoc:
  @installed_specs ||= Gem::Specification.map {|s| s.full_name }
end