class Gem::Commands::UpdateCommand - rubygems: Ruby Standard Library Documentation

# class Gem::Commands::UpdateCommand

### Public Class Methods

new() click to toggle source
Calls superclass method `Gem::Command::new`

    # File rubygems/commands/update_command.rb, line 22
    def initialize
      options = {
        force: false,
      }

      options.merge!(install_update_options)

      super "update", "Update installed gems to the latest version", options

      add_install_update_options

      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, opts|
        value ||= true

        opts[:system] = value
      end

      add_local_remote_options
      add_platform_option
      add_prerelease_option "as update targets"

      @updated   = []
      @installer = nil
    end

### Public Instance Methods

execute() click to toggle source

    # File rubygems/commands/update_command.rb, line 97
    def execute
      if options[:system]
        update_rubygems
        return
      end

      gems_to_update = which_to_update(
        highest_installed_gems,
        options[:args].uniq
      )

      if options[: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(&:name)
      not_updated_names = options[: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

preparing_gem_layout_for(version) { || ... } click to toggle source

    # File rubygems/commands/update_command.rb, line 195
    def preparing_gem_layout_for(version)
      if Gem::Version.new(version) >= Gem::Version.new("3.2.a")
        yield
      else
        require "tmpdir"
        Dir.mktmpdir("gem_update") do |tmpdir|
          FileUtils.mv Gem.plugindir, tmpdir

          status = yield

          unless status
            FileUtils.mv File.join(tmpdir, "plugins"), Gem.plugindir
          end

          status
        end
      end
    end

rubygems_target_version() click to toggle source

    # File rubygems/commands/update_command.rb, line 214
    def rubygems_target_version
      version = options[: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

      [target, requirement]
    end

update_gem(name, version = Gem::Requirement.default) click to toggle source

    # File rubygems/commands/update_command.rb, line 238
    def update_gem(name, version = Gem::Requirement.default)
      return if @updated.any? {|spec| spec.name == name }

      update_options = options.dup
      update_options[:prerelease] = version.prerelease?

      @installer = Gem::DependencyInstaller.new update_options

      say "Updating #{name}" unless options[:system]
      begin
        @installer.install name, Gem::Requirement.new(version)
      rescue Gem::InstallError, Gem::DependencyError => e
        alert_error "Error installing #{name}:\n\t#{e.message}"
      end

      @installer.installed_gems.each do |spec|
        @updated << spec
      end
    end

update_gems(gems_to_update) click to toggle source

    # File rubygems/commands/update_command.rb, line 258
    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() click to toggle source

Update RubyGems software to the latest version.

    # File rubygems/commands/update_command.rb, line 269
    def update_rubygems
      if Gem.disable_system_update_message
        alert_error Gem.disable_system_update_message
        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", requirement) if installed_gems.empty? || installed_gems.first.version != version
      return if installed_gems.empty?

      install_rubygems installed_gems.first
    end

which_to_update(highest_installed_gems, gem_names) click to toggle source

    # File 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

### Private Instance Methods

oldest_supported_version() click to toggle source

Oldest version we support downgrading to. This is the version that originally ships with the oldest supported patch version of ruby.

    # File rubygems/commands/update_command.rb, line 322
    def oldest_supported_version
      @oldest_supported_version ||=
        Gem::Version.new("3.3.3")
    end