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=, #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, 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.
7 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 43 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 7 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 @original_home = nil @original_path = nil @primary_gems = nil end |
Instance Method Details
#arguments ⇒ Object
:nodoc:
45 46 47 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 45 def arguments # :nodoc: "GEMNAME name of gem to cleanup" end |
#clean_gems ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 96 def clean_gems @original_home = Gem.dir @original_path = Gem.path 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 Gem::Specification.reset end |
#defaults_str ⇒ Object
:nodoc:
49 50 51 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 49 def defaults_str # :nodoc: "--no-dry-run" end |
#description ⇒ Object
:nodoc:
53 54 55 56 57 58 59 60 61 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 53 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
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 94 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 67 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 {|spec| spec.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 {|spec| spec.full_name } "Skipped default gems: #{skipped.join ', '}" end end |
#get_candidate_gems ⇒ Object
118 119 120 121 122 123 124 125 126 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 118 def get_candidate_gems @candidate_gems = unless [:args].empty? [:args].map do |gem_name| Gem::Specification.find_all_by_name gem_name end.flatten else Gem::Specification.to_a end end |
#get_gems_to_cleanup ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 128 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 do |spec| spec.default_gem? end uninstall_from = [:user_install] ? Gem.user_dir : @original_home 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
148 149 150 151 152 153 154 155 156 157 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 148 def get_primary_gems @primary_gems = {} Gem::Specification.each do |spec| if @primary_gems[spec.name].nil? or @primary_gems[spec.name].version < spec.version @primary_gems[spec.name] = spec end end end |
#uninstall_dep(spec) ⇒ Object
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 159 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 ensure # Restore path Gem::Uninstaller may have changed Gem.use_paths @original_home, *@original_path end |
#usage ⇒ Object
:nodoc:
63 64 65 |
# File 'lib/rubygems/commands/cleanup_command.rb', line 63 def usage # :nodoc: "#{program_name} [GEMNAME ...]" end |