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, system = false)
-
#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(version) 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 options for the gem install command. |
::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 | This code is based directly on the |
#truncate_text, #min3 |
Constructor Details
.new ⇒ UpdateCommand
# File 'lib/rubygems/commands/update_command.rb', line 21
def initialize super 'update', 'Update installed gems to the latest version', :document => %w[rdoc ri], :force => false 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 49
def arguments # :nodoc: "GEMNAME name of gem to update" end
#check_latest_rubygems(version)
# File 'lib/rubygems/commands/update_command.rb', line 70
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 77
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 84
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 57
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 91
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 updated_names = updated.map {|spec| spec.name } not_updated_names = [:args].uniq - updated_names if updated.empty? say "Nothing to update" else say "Gems updated: #{updated_names.join(' ')}" say "Gems already up-to-date: #{not_updated_names.join(' ')}" unless not_updated_names.empty? end end
#fetch_remote_gems(spec)
# File 'lib/rubygems/commands/update_command.rb', line 127
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 142
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? or 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 157
def highest_remote_name_tuple(spec) # :nodoc: spec_tuples = fetch_remote_gems spec matching_gems = spec_tuples.select do |g,_| g.name == spec.name and g.match_platform? end highest_remote_gem = matching_gems.max highest_remote_gem ||= [Gem::NameTuple.null] highest_remote_gem.first end
#install_rubygems(version)
# File 'lib/rubygems/commands/update_command.rb', line 171
def install_rubygems(version) # :nodoc: args = update_rubygems_arguments update_dir = File.join Gem.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 331
def oldest_supported_version @oldest_supported_version ||= if 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 187
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 207
def rubygems_target_version version = [:system] update_latest = version == true if update_latest version = Gem::Version.new Gem::VERSION requirement = Gem::Requirement.new ">= #{Gem::VERSION}" else version = Gem::Version.new version requirement = Gem::Requirement.new version end rubygems_update = Gem::Specification.new rubygems_update.name = 'rubygems-update' rubygems_update.version = version hig = { 'rubygems-update' => rubygems_update, } gems_to_update = which_to_update hig, [:args], :system up_ver = gems_to_update.first.version target = if update_latest up_ver else version end return target, requirement end
#update_gem(name, version = Gem::Requirement.default)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 239
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 259
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 270
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 update_gem 'rubygems-update', version installed_gems = Gem::Specification.find_all_by_name 'rubygems-update', requirement version = installed_gems.first.version install_rubygems version end
#update_rubygems_arguments
# File 'lib/rubygems/commands/update_command.rb', line 292
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 or Gem::Version.new( [:system]) >= Gem::Version.new(2) args end
#usage
# File 'lib/rubygems/commands/update_command.rb', line 66
def usage # :nodoc: "#{program_name} GEMNAME [GEMNAME ...]" end
#which_to_update(highest_installed_gems, gem_names, system = false)
[ GitHub ]# File 'lib/rubygems/commands/update_command.rb', line 304
def which_to_update(highest_installed_gems, gem_names, system = false) result = [] highest_installed_gems.each do |l_name, l_spec| next if not gem_names.empty? and gem_names.none? {|name| name == l_spec.name } highest_remote_tup = highest_remote_name_tuple l_spec highest_remote_ver = highest_remote_tup.version highest_installed_ver = l_spec.version if system or (highest_installed_ver < highest_remote_ver) result << Gem::NameTuple.new(l_spec.name, [highest_installed_ver, highest_remote_ver].max, highest_remote_tup.platform) end end result end