Class: Gem::Commands::UninstallCommand

Inherits:
Gem::Command show all
Includes:
VersionOption
Defined in:
lib/rubygems/commands/uninstall_command.rb

Overview

Gem uninstaller command line tool

See ‘gem help uninstall`

Instance Attribute Summary

Attributes inherited from Gem::Command

#command, #defaults, #options, #program_name, #summary

Instance Method Summary collapse

Methods included from VersionOption

#add_platform_option, #add_prerelease_option, #add_version_option

Methods inherited from Gem::Command

add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, common_options, 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, #when_invoked

Methods included from UserInteraction

#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializeUninstallCommand

Returns a new instance of UninstallCommand.



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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rubygems/commands/uninstall_command.rb', line 15

def initialize
  super 'uninstall', 'Uninstall gems from the local repository',
        :version => Gem::Requirement.default, :user_install => true,
        :check_dev => false

  add_option('-a', '--[no-]all',
    'Uninstall all matching versions'
    ) do |value, options|
    options[:all] = value
  end

  add_option('-I', '--[no-]ignore-dependencies',
             'Ignore dependency requirements while',
             'uninstalling') do |value, options|
    options[:ignore] = value
  end

  add_option('-D', '--[no-]-check-development',
             'Check development dependencies while uninstalling',
             '(default: false)') do |value, options|
    options[:check_dev] = value
  end

  add_option('-x', '--[no-]executables',
               'Uninstall applicable executables without',
               'confirmation') do |value, options|
    options[:executables] = value
  end

  add_option('-i', '--install-dir DIR',
             'Directory to uninstall gem from') do |value, options|
    options[:install_dir] = File.expand_path(value)
  end

  add_option('-n', '--bindir DIR',
             'Directory to remove binaries from') do |value, options|
    options[:bin_dir] = File.expand_path(value)
  end

  add_option('--[no-]user-install',
             'Uninstall from user\'s home directory',
             'in addition to GEM_HOME.') do |value, options|
    options[:user_install] = value
  end

  add_option('--[no-]format-executable',
             'Assume executable names match Ruby\'s prefix and suffix.') do |value, options|
    options[:format_executable] = value
  end

  add_option('--[no-]force',
             'Uninstall all versions of the named gems',
             'ignoring dependencies') do |value, options|
    options[:force] = value
  end

  add_option('--[no-]abort-on-dependent',
             'Prevent uninstalling gems that are',
             'depended on by other gems.') do |value, options|
    options[:abort_on_dependent] = value
  end

  add_version_option
  add_platform_option
end

Instance Method Details

#argumentsObject

:nodoc:



81
82
83
# File 'lib/rubygems/commands/uninstall_command.rb', line 81

def arguments # :nodoc:
  "GEMNAME       name of gem to uninstall"
end

#defaults_strObject

:nodoc:



85
86
87
88
# File 'lib/rubygems/commands/uninstall_command.rb', line 85

def defaults_str # :nodoc:
  "--version '#{Gem::Requirement.default}' --no-force " +
  "--user-install"
end

#descriptionObject

:nodoc:



90
91
92
93
94
95
96
97
98
# File 'lib/rubygems/commands/uninstall_command.rb', line 90

def description # :nodoc:
  <<-EOF
The uninstall command removes a previously installed gem.

RubyGems will ask for confirmation if you are attempting to uninstall a gem
that is a dependency of an existing gem.  You can use the
--ignore-dependencies option to skip this check.
  EOF
end

#executeObject



104
105
106
107
108
109
110
111
112
# File 'lib/rubygems/commands/uninstall_command.rb', line 104

def execute
  if options[:all] and not options[:args].empty? then
    uninstall_specific
  elsif options[:all] then
    uninstall_all
  else
    uninstall_specific
  end
end

#uninstall_allObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rubygems/commands/uninstall_command.rb', line 114

def uninstall_all
  _, specs = Gem::Specification.partition { |spec| spec.default_gem? }

  specs.each do |spec|
    options[:version] = spec.version

    begin
      Gem::Uninstaller.new(spec.name, options).uninstall
    rescue Gem::InstallError
    end
  end

  alert "Uninstalled all gems in #{options[:install_dir]}"
end

#uninstall_specificObject



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/rubygems/commands/uninstall_command.rb', line 129

def uninstall_specific
  deplist = Gem::DependencyList.new

  get_all_gem_names.uniq.each do |name|
    Gem::Specification.find_all_by_name(name).each do |spec|
      deplist.add spec
    end
  end

  deps = deplist.strongly_connected_components.flatten.reverse

  deps.map(&:name).uniq.each do |gem_name|
    begin
      Gem::Uninstaller.new(gem_name, options).uninstall
    rescue Gem::GemNotInHomeException => e
      spec = e.spec
      alert("In order to remove #{spec.name}, please execute:\n" +
            "\tgem uninstall #{spec.name} --install-dir=#{spec.installation_path}")
    end
  end
end

#usageObject

:nodoc:



100
101
102
# File 'lib/rubygems/commands/uninstall_command.rb', line 100

def usage # :nodoc:
  "#{program_name} GEMNAME [GEMNAME ...]"
end