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, #get_platform_from_requirements

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

#initializeUninstallCommand

Returns a new instance of UninstallCommand.



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
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rubygems/commands/uninstall_command.rb', line 16

def initialize
  super "uninstall", "Uninstall gems from the local repository",
        version: Gem::Requirement.default, user_install: true,
        check_dev: false, vendor: 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 executables 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

  add_option("--vendor",
             "Uninstall gem from the vendor directory.",
             "Only for use by gem repackagers.") do |_value, options|
    unless Gem.vendor_dir
      raise Gem::OptionParser::InvalidOption.new "your platform is not supported"
    end

    alert_warning "Use your OS package manager to uninstall vendor gems"
    options[:vendor] = true
    options[:install_dir] = Gem.vendor_dir
  end
end

Instance Method Details

#argumentsObject

:nodoc:



93
94
95
# File 'lib/rubygems/commands/uninstall_command.rb', line 93

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

#check_versionObject

:nodoc:



116
117
118
119
120
121
122
123
# File 'lib/rubygems/commands/uninstall_command.rb', line 116

def check_version # :nodoc:
  if options[:version] != Gem::Requirement.default &&
     get_all_gem_names.size > 1
    alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
                " version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
    terminate_interaction 1
  end
end

#defaults_strObject

:nodoc:



97
98
99
100
# File 'lib/rubygems/commands/uninstall_command.rb', line 97

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

#descriptionObject

:nodoc:



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

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



125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/rubygems/commands/uninstall_command.rb', line 125

def execute
  check_version

  # Consider only gem specifications installed at `--install-dir`
  Gem::Specification.dirs = options[:install_dir] if options[:install_dir]

  if options[:all] && !options[:args].empty?
    uninstall_specific
  elsif options[:all]
    uninstall_all
  else
    uninstall_specific
  end
end

#uninstall(gem_name) ⇒ Object



201
202
203
# File 'lib/rubygems/commands/uninstall_command.rb', line 201

def uninstall(gem_name)
  Gem::Uninstaller.new(gem_name, options).uninstall
end

#uninstall_allObject



140
141
142
143
144
145
146
147
148
149
# File 'lib/rubygems/commands/uninstall_command.rb', line 140

def uninstall_all
  specs = Gem::Specification.reject(&:default_gem?)

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

  alert "Uninstalled all gems in #{options[:install_dir] || Gem.dir}"
end

#uninstall_gem(gem_name) ⇒ Object



187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/rubygems/commands/uninstall_command.rb', line 187

def uninstall_gem(gem_name)
  uninstall(gem_name)
rescue Gem::GemNotInHomeException => e
  spec = e.spec
  alert("In order to remove #{spec.name}, please execute:\n" \
        "\tgem uninstall #{spec.name} --install-dir=#{spec.base_dir}")
rescue Gem::UninstallError => e
  spec = e.spec
  alert_error("Error: unable to successfully uninstall '#{spec.name}' which is " \
        "located at '#{spec.full_gem_path}'. This is most likely because" \
        "the current user does not have the appropriate permissions")
  terminate_interaction 1
end

#uninstall_specificObject



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
178
179
180
181
182
183
184
185
# File 'lib/rubygems/commands/uninstall_command.rb', line 151

def uninstall_specific
  deplist = Gem::DependencyList.new
  original_gem_version = {}

  get_all_gem_names_and_versions.each do |name, version|
    original_gem_version[name] = version || options[:version]

    gem_specs = Gem::Specification.find_all_by_name(name, original_gem_version[name])

    if gem_specs.empty?
      say("Gem '#{name}' is not installed")
    else
      gem_specs.reject!(&:default_gem?) if gem_specs.size > 1

      gem_specs.each do |spec|
        deplist.add spec
      end
    end
  end

  deps = deplist.strongly_connected_components.flatten.reverse

  gems_to_uninstall = {}

  deps.each do |dep|
    if original_gem_version[dep.name] == Gem::Requirement.default
      next if gems_to_uninstall[dep.name]
      gems_to_uninstall[dep.name] = true
    else
      options[:version] = dep.version
    end

    uninstall_gem(dep.name)
  end
end

#usageObject

:nodoc:



112
113
114
# File 'lib/rubygems/commands/uninstall_command.rb', line 112

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