Class: Gem::Commands::CleanupCommand
- Inherits:
-
Gem::Command
- Object
- Gem::Command
- Gem::Commands::CleanupCommand
- Defined in:
- lib/rubygems/commands/cleanup_command.rb
Instance Attribute Summary
Attributes inherited from Gem::Command
#command, #defaults, #options, #program_name, #summary
Instance Method Summary collapse
-
#arguments ⇒ Object
:nodoc:.
- #clean_gems ⇒ Object
-
#defaults_str ⇒ Object
:nodoc:.
-
#description ⇒ Object
:nodoc:.
- #execute ⇒ Object
- #get_candidate_gems ⇒ Object
- #get_gems_to_cleanup ⇒ Object
- #get_primary_gems ⇒ Object
-
#initialize ⇒ CleanupCommand
constructor
A new instance of CleanupCommand.
- #uninstall_dep(spec) ⇒ Object
-
#usage ⇒ Object
:nodoc:.
Methods inherited from Gem::Command
add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, #check_deprecated_options, common_options, #deprecate_option, #deprecated?, extra_args, extra_args=, #extract_gem_name_and_version, #get_all_gem_names, #get_all_gem_names_and_versions, #get_one_gem_name, #get_one_optional_argument, #handle_options, #handles?, #invoke, #invoke_with_build_args, #merge_options, #remove_option, #show_help, #show_lookup_failure, specific_extra_args, specific_extra_args_hash, #when_invoked
Methods included from UserInteraction
#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Methods included from Text
#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text
Constructor Details
#initialize ⇒ CleanupCommand
Returns a new instance of CleanupCommand.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 8 def initialize super "cleanup", "Clean up old versions of installed gems", force: false, install_dir: Gem.dir, check_dev: true add_option("-n", "-d", "--dry-run", "Do not uninstall gems") do |_value, | [:dryrun] = true end add_option(:Deprecated, "--dryrun", "Do not uninstall gems") do |_value, | [:dryrun] = true end deprecate_option("--dryrun", extra_msg: "Use --dry-run instead") add_option("-D", "--[no-]check-development", "Check development dependencies while uninstalling", "(default: true)") do |value, | [:check_dev] = value end add_option("--[no-]user-install", "Cleanup in user's home directory instead", "of GEM_HOME.") do |value, | [:user_install] = value end @candidate_gems = nil @default_gems = [] @full = nil @gems_to_cleanup = nil @primary_gems = nil end |
Instance Method Details
#arguments ⇒ Object
:nodoc:
44 45 46 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 44 def arguments # :nodoc: "GEMNAME name of gem to cleanup" end |
#clean_gems ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 95 def clean_gems get_primary_gems get_candidate_gems get_gems_to_cleanup @full = Gem::DependencyList.from_specs deplist = Gem::DependencyList.new @gems_to_cleanup.each {|spec| deplist.add spec } deps = deplist.strongly_connected_components.flatten deps.reverse_each do |spec| uninstall_dep spec end end |
#defaults_str ⇒ Object
:nodoc:
48 49 50 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 48 def defaults_str # :nodoc: "--no-dry-run" end |
#description ⇒ Object
:nodoc:
52 53 54 55 56 57 58 59 60 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 52 def description # :nodoc: <<-EOF The cleanup command removes old versions of gems from GEM_HOME that are not required to meet a dependency. If a gem is installed elsewhere in GEM_PATH the cleanup command won't delete it. If no gems are named all gems in GEM_HOME are cleaned. EOF end |
#execute ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 66 def execute say "Cleaning up installed gems..." if [:args].empty? done = false last_set = nil until done do clean_gems this_set = @gems_to_cleanup.map(&:full_name).sort done = this_set.empty? || last_set == this_set last_set = this_set end else clean_gems end say "Clean up complete" verbose do skipped = @default_gems.map(&:full_name) "Skipped default gems: #{skipped.join ", "}" end end |
#get_candidate_gems ⇒ Object
112 113 114 115 116 117 118 119 120 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 112 def get_candidate_gems @candidate_gems = if [:args].empty? Gem::Specification.to_a else [:args].flat_map do |gem_name| Gem::Specification.find_all_by_name gem_name end end end |
#get_gems_to_cleanup ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 122 def get_gems_to_cleanup gems_to_cleanup = @candidate_gems.select do |spec| @primary_gems[spec.name].version != spec.version end default_gems, gems_to_cleanup = gems_to_cleanup.partition(&:default_gem?) uninstall_from = [:user_install] ? Gem.user_dir : Gem.dir gems_to_cleanup = gems_to_cleanup.select do |spec| spec.base_dir == uninstall_from end @default_gems += default_gems @default_gems.uniq! @gems_to_cleanup = gems_to_cleanup.uniq end |
#get_primary_gems ⇒ Object
140 141 142 143 144 145 146 147 148 149 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 140 def get_primary_gems @primary_gems = {} Gem::Specification.each do |spec| if @primary_gems[spec.name].nil? || @primary_gems[spec.name].version < spec.version @primary_gems[spec.name] = spec end end end |
#uninstall_dep(spec) ⇒ Object
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 151 def uninstall_dep(spec) return unless @full.ok_to_remove?(spec.full_name, [:check_dev]) if [:dryrun] say "Dry Run Mode: Would uninstall #{spec.full_name}" return end say "Attempting to uninstall #{spec.full_name}" = { executables: false, version: "= #{spec.version}", } [:user_install] = Gem.user_dir == spec.base_dir uninstaller = Gem::Uninstaller.new spec.name, begin uninstaller.uninstall rescue Gem::DependencyRemovalException, Gem::InstallError, Gem::GemNotInHomeException, Gem::FilePermissionError => e say "Unable to uninstall #{spec.full_name}:" say "\t#{e.class}: #{e.}" end end |
#usage ⇒ Object
:nodoc:
62 63 64 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 62 def usage # :nodoc: "#{program_name} [GEMNAME ...]" end |