PHP 8.2.31
Preview: doctor.rb Size: 3.13 KB
/proc/thread-self/root/opt/alt/ruby40/share/rubygems/rubygems/doctor.rb

# frozen_string_literal: true

require_relative "../rubygems"
require_relative "user_interaction"

##
# 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",            ""],
    ["extensions",     ""],
    ["gems",           ""],
    ["plugins",        ""],
  ].freeze

  missing =
    Gem::REPOSITORY_SUBDIRECTORIES.sort -
    REPOSITORY_EXTENSION_MAP.map {|(k,_)| k }.sort

  raise "Update REPOSITORY_EXTENSION_MAP, missing: #{missing.join ", "}" unless
    missing.empty?

  ##
  # 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 = 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(&:full_name)
  end

  ##
  # Are we doctoring a gem repository?

  def gem_repository?
    !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?
      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 = File.join(@gem_repository, sub_directory)

    Dir.entries(directory).sort.each do |ent|
      next if [".", ".."].include?(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/.match?(basename)
      next if sub_directory == "specifications" && basename == "default"
      next if sub_directory == "plugins" && 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
end

Directory Contents

Dirs: 15 × Files: 70

Name Size Perms Modified Actions
commands DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
core_ext DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
defaults DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
ext DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
package DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
request DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
resolver DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
security DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
source DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
ssl_certs DIR
- drwxr-xr-x 2026-05-21 12:15:17
Edit Download
util DIR
- drwxr-xr-x 2026-06-09 07:03:28
Edit Download
vendor DIR
- drwxr-xr-x 2026-05-21 12:15:16
Edit Download
3.00 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
8.21 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.39 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.71 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
15.80 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.64 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
16.31 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
7.40 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
8.45 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
7.79 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.52 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.26 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.13 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
4.53 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
6.87 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
498 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
11.38 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
394 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.11 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
27.11 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
771 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
323 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
6.96 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.59 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.52 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
125 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
19.51 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.79 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.77 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
12.52 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
874 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
8.50 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
660 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
9.52 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
8.73 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
11.26 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
7.13 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
9.43 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
7.40 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.92 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.04 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
21.69 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.06 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.97 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.24 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
67.53 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
14.64 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.62 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
7.69 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
5.00 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.24 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.07 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
12.07 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
411 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
1.85 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.38 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
846 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
13.06 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.05 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
3.63 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
81 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
233 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
79 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
87 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
228 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
73 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
13.67 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.17 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download
519 B lrw-r--r-- 2026-05-21 12:15:20
Edit Download
2.42 KB lrw-r--r-- 2026-05-21 12:15:20
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).