Class: Gem::Commands::UpdateCommand
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::Gem::Command
|
|
Instance Chain:
|
|
Inherits: |
Gem::Command
|
Defined in: | lib/rubygems/commands/update_command.rb |
Constant Summary
::Gem::Command
- Inherited
Class Attribute Summary
::Gem::Command
- Inherited
.build_args | Arguments used when building gems. |
.build_args=, .extra_args, .extra_args= |
Class Method Summary
- .new ⇒ UpdateCommand constructor
::Gem::Command
- Inherited
.add_common_option, | |
.add_specific_extra_args | Add a list of extra arguments for the given command. |
.common_options, | |
.new | Initializes a generic gem command named |
.specific_extra_args | Return an array of extra arguments for the command. |
.specific_extra_args_hash | Accessor for the specific extra args hash (self initializing). |
Instance Attribute Summary
- #installer readonly Internal use only
- #updated readonly Internal use only
::Gem::LocalRemoteOptions
- Included
#both? | Is fetching of local and remote information enabled? |
#local? | Is local fetching enabled? |
#remote? | Is remote fetching enabled? |
::Gem::Command
- Inherited
#command | The name of the command. |
#defaults | The default options for the command. |
#deprecated?, | |
#options | The options for the command. |
#program_name | The name of the command for command-line invocation. |
#summary | A short description of the command. |
::Gem::DefaultUserInteraction
- Included
Instance Method Summary
- #execute
- #preparing_gem_layout_for(version)
- #rubygems_target_version
- #update_gem(name, version = Gem::Requirement.default)
- #update_gems(gems_to_update)
-
#update_rubygems
Update RubyGems software to the latest version.
- #which_to_update(highest_installed_gems, gem_names)
-
#oldest_supported_version
private
Oldest version we support downgrading to.
- #arguments Internal use only
- #check_latest_rubygems(version) Internal use only
- #check_oldest_rubygems(version) Internal use only
- #check_update_arguments Internal use only
- #defaults_str Internal use only
- #description Internal use only
- #fetch_remote_gems(spec) Internal use only
- #highest_installed_gems Internal use only
- #highest_remote_name_tuple(spec) Internal use only
- #install_rubygems(spec) Internal use only
- #update_rubygems_arguments Internal use only
- #usage Internal use only
::Gem::VersionOption
- Included
#add_platform_option | Add the –platform option to the option parser. |
#add_prerelease_option | Add the –prerelease option to the option parser. |
#add_version_option | Add the –version option to the option parser. |
#get_platform_from_requirements | Extract platform given on the command line. |
::Gem::LocalRemoteOptions
- Included
#accept_uri_http | Allows |
#add_bulk_threshold_option | Add the –bulk-threshold option. |
#add_clear_sources_option | Add the –clear-sources option. |
#add_local_remote_options | Add local/remote options to the command line parser. |
#add_proxy_option | Add the –http-proxy option. |
#add_source_option | Add the –source option. |
#add_update_sources_option | Add the –update-sources option. |
::Gem::InstallUpdateOptions
- Included
#add_install_update_options | Add the install/update options to the option parser. |
#install_update_defaults_str | Default description for the gem install and update commands. |
#install_update_options | Default options for the gem install and update commands. |
::Gem::SecurityOption
- Included
::Gem::Command
- Inherited
#add_extra_args | Adds extra args from ~/.gemrc. |
#add_option | Add a command-line option and handler to the command. |
#arguments | Override to provide details of the arguments a command takes. |
#begins? | True if |
#check_deprecated_options, | |
#defaults_str | Override to display the default values of the command options. |
#deprecate_option | Mark a command-line option as deprecated, and optionally specify a deprecation horizon. |
#description | Override to display a longer description of what this command does. |
#execute | Override to provide command handling. |
#get_all_gem_names | Get all gem names from the command line. |
#get_all_gem_names_and_versions | Get all [gem, version] from the command line. |
#get_one_gem_name | Get a single gem name from the command line. |
#get_one_optional_argument | Get a single optional argument from the command line. |
#handle_options | Handle the given list of arguments by parsing them and recording the results. |
#handles? | True if the command handles the given argument list. |
#invoke | Invoke the command with the given list of arguments. |
#invoke_with_build_args | Invoke the command with the given list of normal arguments and additional build arguments. |
#merge_options | Merge a set of command options with the set of default options (without modifying the default option hash). |
#remove_option | Remove previously defined command-line argument |
#show_help | Display the help message for the command. |
#show_lookup_failure | Display to the user that a gem couldn’t be found and reasons why –. |
#usage | Override to display the usage for an individual gem command. |
#when_invoked | Call the given block when invoked. |
#add_parser_run_info | Adds a section with |
#configure_options, | |
#create_option_parser | Creates an option parser and fills it in with the help info for the command. |
#option_is_deprecated?, | |
#parser | Create on demand parser. |
#wrap | Wraps |
#add_parser_description, #add_parser_options, #add_parser_summary |
::Gem::UserInteraction
- Included
#alert | Displays an alert |
#alert_error | Displays an error |
#alert_warning | Displays a warning |
#ask | Asks a |
#ask_for_password | Asks for a password with a |
#ask_yes_no | Asks a yes or no |
#choose_from_list | Asks the user to answer |
#say | Displays the given |
#terminate_interaction | Terminates the RubyGems process with the given |
#verbose | Calls |
::Gem::DefaultUserInteraction
- Included
::Gem::Text
- Included
#clean_text | Remove any non-printable characters and make the text suitable for printing. |
#format_text | Wraps |
#levenshtein_distance | Returns a value representing the “cost” of transforming str1 into str2 Vendored version of |
#truncate_text, #min3 |
Constructor Details
.new ⇒ UpdateCommand
# File 'lib/rubygems/commands/update_command.rb', line 21
def initialize = { :force => false, } .merge!( ) super "update", "Update installed gems to the latest version", Gem::OptionParser.accept Gem::Version do |value| Gem::Version.new value value end add_option("--system [VERSION]", Gem::Version, "Update the RubyGems system software") do |value, | value = true unless value [:system] = value end add_platform_option add_prerelease_option "as update targets" @updated = [] @installer = nil end
Instance Attribute Details
#installer (readonly)
# File 'lib/rubygems/commands/update_command.rb', line 17
attr_reader :installer # :nodoc:
#updated (readonly)
# File 'lib/rubygems/commands/update_command.rb', line 19
attr_reader :updated # :nodoc:
Instance Method Details
#arguments
# File 'lib/rubygems/commands/update_command.rb', line 53
def arguments # :nodoc: "GEMNAME name of gem to update" end
#check_latest_rubygems(version)
# File 'lib/rubygems/commands/update_command.rb', line 75
def check_latest_rubygems(version) # :nodoc: if Gem.rubygems_version == version say "Latest version already installed. Done." terminate_interaction end end
#check_oldest_rubygems(version)
# File 'lib/rubygems/commands/update_command.rb', line 82
def check_oldest_rubygems(version) # :nodoc: if oldest_supported_version > version alert_error "rubygems #{version} is not supported on #{RUBY_VERSION}. The oldest version supported by this ruby is #{oldest_supported_version}" terminate_interaction 1 end end
#check_update_arguments
# File 'lib/rubygems/commands/update_command.rb', line 89
def check_update_arguments # :nodoc: unless [:args].empty? alert_error "Gem names are not allowed with the --system option" terminate_interaction 1 end end
#defaults_str
#description
# File 'lib/rubygems/commands/update_command.rb', line 62
def description # :nodoc: <<-EOF The update command will update your gems to the latest version. The update command does not remove the previous version. Use the cleanup command to remove old versions. EOF end
#execute
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 96
def execute if [:system] update_rubygems return end gems_to_update = which_to_update( highest_installed_gems, [:args].uniq ) if [:explain] say "Gems to update:" gems_to_update.each do |name_tuple| say " #{name_tuple.full_name}" end return end say "Updating installed gems" updated = update_gems gems_to_update installed_names = highest_installed_gems.keys updated_names = updated.map {|spec| spec.name } not_updated_names = [:args].uniq - updated_names not_installed_names = not_updated_names - installed_names up_to_date_names = not_updated_names - not_installed_names if updated.empty? say "Nothing to update" else say "Gems updated: #{updated_names.join(' ')}" end say "Gems already up-to-date: #{up_to_date_names.join(' ')}" unless up_to_date_names.empty? say "Gems not currently installed: #{not_installed_names.join(' ')}" unless not_installed_names.empty? end
#fetch_remote_gems(spec)
# File 'lib/rubygems/commands/update_command.rb', line 136
def fetch_remote_gems(spec) # :nodoc: dependency = Gem::Dependency.new spec.name, "> #{spec.version}" dependency.prerelease = [:prerelease] fetcher = Gem::SpecFetcher.fetcher spec_tuples, errors = fetcher.search_for_dependency dependency error = errors.find {|e| e.respond_to? :exception } raise error if error spec_tuples end
#highest_installed_gems
# File 'lib/rubygems/commands/update_command.rb', line 151
def highest_installed_gems # :nodoc: hig = {} # highest installed gems # Get only gem specifications installed as --user-install Gem::Specification.dirs = Gem.user_dir if [:user_install] Gem::Specification.each do |spec| if hig[spec.name].nil? || hig[spec.name].version < spec.version hig[spec.name] = spec end end hig end
#highest_remote_name_tuple(spec)
# File 'lib/rubygems/commands/update_command.rb', line 166
def highest_remote_name_tuple(spec) # :nodoc: spec_tuples = fetch_remote_gems spec highest_remote_gem = spec_tuples.max return unless highest_remote_gem highest_remote_gem.first end
#install_rubygems(spec)
# File 'lib/rubygems/commands/update_command.rb', line 175
def install_rubygems(spec) # :nodoc: args = update_rubygems_arguments version = spec.version update_dir = File.join spec.base_dir, "gems", "rubygems-update-#{version}" Dir.chdir update_dir do say "Installing RubyGems #{version}" unless [:silent] installed = preparing_gem_layout_for(version) do system Gem.ruby, "--disable-gems", "setup.rb", *args end say "RubyGems system software updated" if installed unless [:silent] end end
#oldest_supported_version (private)
Oldest version we support downgrading to. This is the version that originally ships with the first patch version of each ruby, because we never test each ruby against older rubygems, so we can’t really guarantee it works. ::Gem::Version
list can be checked here: stdgems.org/rubygems
# File 'lib/rubygems/commands/update_command.rb', line 324
def oldest_supported_version @oldest_supported_version ||= if Gem.ruby_version > Gem::Version.new("3.1.a") Gem::Version.new("3.3.3") elsif Gem.ruby_version > Gem::Version.new("3.0.a") Gem::Version.new("3.2.3") elsif Gem.ruby_version > Gem::Version.new("2.7.a") Gem::Version.new("3.1.2") elsif Gem.ruby_version > Gem::Version.new("2.6.a") Gem::Version.new("3.0.1") elsif Gem.ruby_version > Gem::Version.new("2.5.a") Gem::Version.new("2.7.3") elsif Gem.ruby_version > Gem::Version.new("2.4.a") Gem::Version.new("2.6.8") else Gem::Version.new("2.5.2") end end
#preparing_gem_layout_for(version)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 192
def preparing_gem_layout_for(version) if Gem::Version.new(version) >= Gem::Version.new("3.2.a") yield else require "tmpdir" tmpdir = Dir.mktmpdir FileUtils.mv Gem.plugindir, tmpdir status = yield if status FileUtils.rm_rf tmpdir else FileUtils.mv File.join(tmpdir, "plugins"), Gem.plugindir end status end end
#rubygems_target_version
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 212
def rubygems_target_version version = [:system] update_latest = version == true unless update_latest version = Gem::Version.new version requirement = Gem::Requirement.new version return version, requirement end version = Gem::Version.new Gem::VERSION requirement = Gem::Requirement.new ">= #{Gem::VERSION}" rubygems_update = Gem::Specification.new rubygems_update.name = "rubygems-update" rubygems_update.version = version highest_remote_tup = highest_remote_name_tuple(rubygems_update) target = highest_remote_tup ? highest_remote_tup.version : version return target, requirement end
#update_gem(name, version = Gem::Requirement.default)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 236
def update_gem(name, version = Gem::Requirement.default) return if @updated.any? {|spec| spec.name == name } = .dup [:prerelease] = version.prerelease? @installer = Gem::DependencyInstaller.new say "Updating #{name}" unless [:system] && [:silent] begin @installer.install name, Gem::Requirement.new(version) rescue Gem::InstallError, Gem::DependencyError => e alert_error "Error installing #{name}:\n\t#{e.}" end @installer.installed_gems.each do |spec| @updated << spec end end
#update_gems(gems_to_update)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 256
def update_gems(gems_to_update) gems_to_update.uniq.sort.each do |name_tuple| update_gem name_tuple.name, name_tuple.version end @updated end
#update_rubygems
Update RubyGems software to the latest version.
# File 'lib/rubygems/commands/update_command.rb', line 267
def update_rubygems if Gem. alert_error Gem. terminate_interaction 1 end check_update_arguments version, requirement = rubygems_target_version check_latest_rubygems version check_oldest_rubygems version installed_gems = Gem::Specification.find_all_by_name "rubygems-update", requirement installed_gems = update_gem("rubygems-update", version) if installed_gems.empty? || installed_gems.first.version != version return if installed_gems.empty? install_rubygems installed_gems.first end
#update_rubygems_arguments
# File 'lib/rubygems/commands/update_command.rb', line 288
def update_rubygems_arguments # :nodoc: args = [] args << "--silent" if [:silent] args << "--prefix" << Gem.prefix if Gem.prefix args << "--no-document" unless [:document].include?("rdoc") || [:document].include?("ri") args << "--no-format-executable" if [:no_format_executable] args << "--previous-version" << Gem::VERSION if [:system] == true || Gem::Version.new( [:system]) >= Gem::Version.new(2) args end
#usage
# File 'lib/rubygems/commands/update_command.rb', line 71
def usage # :nodoc: "#{program_name} GEMNAME [GEMNAME ...]" end
#which_to_update(highest_installed_gems, gem_names)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 300
def which_to_update(highest_installed_gems, gem_names) result = [] highest_installed_gems.each do |l_name, l_spec| next if !gem_names.empty? && gem_names.none? {|name| name == l_spec.name } highest_remote_tup = highest_remote_name_tuple l_spec next unless highest_remote_tup result << highest_remote_tup end result end