Class: Gem::Commands::PushCommand

Inherits:
Gem::Command show all
Includes:
GemcutterUtilities, LocalRemoteOptions
Defined in:
lib/rubygems/commands/push_command.rb

Instance Attribute Summary

Attributes included from GemcutterUtilities

#host

Attributes inherited from Gem::Command

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

Instance Method Summary collapse

Methods included from GemcutterUtilities

#add_key_option, #api_key, #rubygems_api_request, #sign_in, #verify_api_key, #with_response

Methods included from LocalRemoteOptions

#accept_uri_http, #add_bulk_threshold_option, #add_clear_sources_option, #add_local_remote_options, #add_proxy_option, #add_source_option, #add_update_sources_option, #both?, #local?, #remote?

Methods inherited from Gem::Command

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

#initializePushCommand

Returns a new instance of PushCommand.



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/rubygems/commands/push_command.rb', line 22

def initialize
  super 'push', description
  add_proxy_option
  add_key_option

  add_option('--host HOST',
             'Push to another gemcutter-compatible host') do |value, options|
    options[:host] = value
  end

  @host = nil
end

Instance Method Details

#argumentsObject

:nodoc:



14
15
16
# File 'lib/rubygems/commands/push_command.rb', line 14

def arguments # :nodoc:
  "GEM       built gem to push up"
end

#descriptionObject

:nodoc:



10
11
12
# File 'lib/rubygems/commands/push_command.rb', line 10

def description # :nodoc:
  'Push a gem up to RubyGems.org'
end

#executeObject



35
36
37
38
39
40
41
# File 'lib/rubygems/commands/push_command.rb', line 35

def execute
  @host = options[:host]

   @host

  send_gem get_one_gem_name
end

#send_gem(name) ⇒ Object



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
# File 'lib/rubygems/commands/push_command.rb', line 43

def send_gem name
  args = [:post, "api/v1/gems"]

  latest_rubygems_version = Gem.latest_rubygems_version

  if latest_rubygems_version < Gem.rubygems_version and
       Gem.rubygems_version.prerelease? and
       Gem::Version.new('2.0.0.rc.2') != Gem.rubygems_version then
    alert_error <<-ERROR
You are using a beta release of RubyGems (#{Gem::VERSION}) which is not
allowed to push gems.  Please downgrade or upgrade to a release version.

The latest released RubyGems version is #{latest_rubygems_version}

You can upgrade or downgrade to the latest release version with:

gem update --system=#{latest_rubygems_version}

    ERROR
    terminate_interaction 1
  end

  unless @host then
    if gem_data = Gem::Package.new(name) then
      @host = gem_data.spec.['default_gem_server']
    end
  end

  args << @host if @host

  say "Pushing gem to #{@host || Gem.host}..."

  response = rubygems_api_request(*args) do |request|
    request.body = Gem.read_binary name
    request.add_field "Content-Length", request.body.size
    request.add_field "Content-Type",   "application/octet-stream"
    request.add_field "Authorization",  api_key
  end

  with_response response
end

#usageObject

:nodoc:



18
19
20
# File 'lib/rubygems/commands/push_command.rb', line 18

def usage # :nodoc:
  "#{program_name} GEM"
end