1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/rubygems/doctor.rb
drbrain 2d08d23e9c * lib/rubygems/doctor.rb: Process directories in order in case the
filesystem doesn't.  [ruby-trunk - Bug #7618]

  Process specifications before other directories in case of bugs.
* test/rubygems/test_gem_doctor.rb:  Test for above.

* lib/rubygems.rb:  Updated version.

* test/rubygems/test_require.rb:  Fixed double require of benchmark.rb.
  RubyGems bug #420.

* test/rubygems/test_gem_commands_check_command.rb:  Fixed unused
  variable warnings.
* test/rubygems/test_gem_commands_query_command.rb:  ditto
* test/rubygems/test_gem_installer.rb:  ditto


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-04 07:31:57 +00:00

125 lines
2.9 KiB
Ruby

require 'rubygems'
require 'rubygems/user_interaction'
require 'pathname'
##
# Cleans up after a partially-failed uninstall or for an invalid
# Gem::Specification.
#
# If a specification was removed by hand this will remove any remaining files.
#
# If a corrupt specification was installed this will clean up warnings by
# removing the bogus specification.
class Gem::Doctor
include Gem::UserInteraction
##
# Maps a gem subdirectory to the files that are expected to exist in the
# subdirectory.
REPOSITORY_EXTENSION_MAP = [ # :nodoc:
['specifications', '.gemspec'],
['build_info', '.info'],
['cache', '.gem'],
['doc', ''],
['gems', ''],
]
raise 'Update REPOSITORY_EXTENSION_MAP' unless
Gem::REPOSITORY_SUBDIRECTORIES.sort ==
REPOSITORY_EXTENSION_MAP.map { |(k,_)| k }.sort
##
# Creates a new Gem::Doctor that will clean up +gem_repository+. Only one
# gem repository may be cleaned at a time.
#
# If +dry_run+ is true no files or directories will be removed.
def initialize gem_repository, dry_run = false
@gem_repository = Pathname(gem_repository)
@dry_run = dry_run
@installed_specs = nil
end
##
# Specs installed in this gem repository
def installed_specs # :nodoc:
@installed_specs ||= Gem::Specification.map { |s| s.full_name }
end
##
# Are we doctoring a gem repository?
def gem_repository?
not installed_specs.empty?
end
##
# Cleans up uninstalled files and invalid gem specifications
def doctor
@orig_home = Gem.dir
@orig_path = Gem.path
say "Checking #{@gem_repository}"
Gem.use_paths @gem_repository.to_s
unless gem_repository? then
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
##
# Cleans up children of this gem repository
def doctor_children # :nodoc:
REPOSITORY_EXTENSION_MAP.each do |sub_directory, extension|
doctor_child sub_directory, extension
end
end
##
# Removes files in +sub_directory+ with +extension+
def doctor_child sub_directory, extension # :nodoc:
directory = @gem_repository + sub_directory
directory.children.sort.each do |child|
next unless child.exist?
basename = child.basename(extension).to_s
next if installed_specs.include? basename
next if /^rubygems-\d/ =~ basename
next if 'specifications' == sub_directory and 'default' == basename
type = child.directory? ? 'directory' : 'file'
action = if @dry_run then
'Extra'
else
child.rmtree
'Removed'
end
say "#{action} #{type} #{sub_directory}/#{child.basename}"
end
rescue Errno::ENOENT
# ignore
end
end