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, #add_otp_option, #api_key, #need_otp?, #rubygems_api_request, #set_api_key, #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, #verbose

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializePushCommand

Returns a new instance of PushCommand.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rubygems/commands/push_command.rb', line 29

def initialize
  super 'push', 'Push a gem up to the gem server', :host => self.host

  @user_defined_host = false

  add_proxy_option
  add_key_option
  add_otp_option

  add_option('--host HOST',
             'Push to another gemcutter-compatible host',
             '  (e.g. https://rubygems.org)') do |value, options|
    options[:host] = value
    @user_defined_host = true
  end

  @host = nil
end

Instance Method Details

#argumentsObject

:nodoc:



21
22
23
# File 'lib/rubygems/commands/push_command.rb', line 21

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

#descriptionObject

:nodoc:



11
12
13
14
15
16
17
18
19
# File 'lib/rubygems/commands/push_command.rb', line 11

def description # :nodoc:
  <<-EOF
The push command uploads a gem to the push server (the default is
https://rubygems.org) and adds it to the index.

The gem can be removed from the index and deleted from the server using the yank
command.  For further discussion see the help for the yank command.
  EOF
end

#executeObject



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

def execute
  gem_name = get_one_gem_name
  default_gem_server, push_host = get_hosts_for(gem_name)

  default_host = nil
  user_defined_host = nil

  if @user_defined_host
    user_defined_host = options[:host]
  else
    default_host = options[:host]
  end

  @host = if user_defined_host
            user_defined_host
          elsif default_gem_server
            default_gem_server
          elsif push_host
            push_host
          else
            default_host
          end

   @host

  send_gem(gem_name)
end

#send_gem(name) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/rubygems/commands/push_command.rb', line 76

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

  gem_data = Gem::Package.new(name)

  unless @host
    @host = gem_data.spec.['default_gem_server']
  end

  push_host = nil

  if gem_data.spec..has_key?('allowed_push_host')
    push_host = gem_data.spec.['allowed_push_host']
  end

  @host ||= push_host

  # Always include @host, even if it's nil
  args += [ @host, push_host ]

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

  response = send_push_request(name, args)

  if need_otp? response
    response = send_push_request(name, args, true)
  end

  with_response response
end

#usageObject

:nodoc:



25
26
27
# File 'lib/rubygems/commands/push_command.rb', line 25

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