In Files

  • rubygems/commands/cleanup_command.rb

Class/Module Index [+]

Quicksearch

Gem::Commands::CleanupCommand

Public Class Methods

new() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 7
def initialize
  super 'cleanup',
        'Clean up old versions of installed gems in the local repository',
        :force => false, :install_dir => Gem.dir

  add_option('-d', '--dryrun', "") do |value, options|
    options[:dryrun] = true
  end

  @candidate_gems  = nil
  @default_gems    = []
  @full            = nil
  @gems_to_cleanup = nil
  @original_home   = nil
  @original_path   = nil
  @primary_gems    = nil
end
            

Public Instance Methods

clean_gems() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 76
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 do |spec| deplist.add spec end

  deps = deplist.strongly_connected_components.flatten

  @original_home = Gem.dir
  @original_path = Gem.path

  deps.reverse_each do |spec|
    uninstall_dep spec
  end

  Gem::Specification.reset
end
            
execute() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 47
def execute
  say "Cleaning up installed gems..."

  if options[:args].empty? then
    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"

  if Gem.configuration.really_verbose then
    skipped = @default_gems.map { |spec| spec.full_name }

    say "Skipped default gems: #{skipped.join ', '}"
  end
end
            
get_candidate_gems() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 98
def get_candidate_gems
  @candidate_gems = unless options[:args].empty? then
                      options[: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() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 108
def get_gems_to_cleanup
  gems_to_cleanup = @candidate_gems.select { |spec|
    @primary_gems[spec.name].version != spec.version
  }

  default_gems, gems_to_cleanup = gems_to_cleanup.partition { |spec|
    spec.default_gem?
  }

  @default_gems += default_gems
  @default_gems.uniq!
  @gems_to_cleanup = gems_to_cleanup.uniq
end
            
get_primary_gems() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 122
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 then
      @primary_gems[spec.name] = spec
    end
  end
end
            
uninstall_dep(spec) click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 133
def uninstall_dep spec
  return unless @full.ok_to_remove?(spec.full_name)

  if options[:dryrun] then
    say "Dry Run Mode: Would uninstall #{spec.full_name}"
    return
  end

  say "Attempting to uninstall #{spec.full_name}"

  uninstall_options = {
    :executables => false,
    :version => "= #{spec.version}",
  }

  uninstall_options[:user_install] = Gem.user_dir == spec.base_dir

  uninstaller = Gem::Uninstaller.new spec.name, uninstall_options

  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.message}"
  end
ensure
  # Restore path Gem::Uninstaller may have changed
  Gem.use_paths @original_home, *@original_path
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus