In Files

  • rubygems/commands/cleanup_command.rb

Parent

Methods

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
end
            

Public Instance Methods

execute() click to toggle source
 
               # File rubygems/commands/cleanup_command.rb, line 36
def execute
  say "Cleaning up installed 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

  gems_to_cleanup = 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

  gems_to_cleanup = gems_to_cleanup.select { |spec|
    primary_gems[spec.name].version != spec.version
  }

  deplist = Gem::DependencyList.new
  gems_to_cleanup.uniq.each do |spec| deplist.add spec end

  deps = deplist.strongly_connected_components.flatten.reverse

  original_path = Gem.path

  deps.each do |spec|
    if options[:dryrun] then
      say "Dry Run Mode: Would uninstall #{spec.full_name}"
    else
      say "Attempting to uninstall #{spec.full_name}"

      options[:args] = [spec.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
    end

    # Restore path Gem::Uninstaller may have change
    Gem.use_paths(*original_path)
  end

  say "Clean Up Complete"
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