aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/commands/push_command.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/commands/push_command.rb')
-rw-r--r--lib/rubygems/commands/push_command.rb39
1 files changed, 36 insertions, 3 deletions
diff --git a/lib/rubygems/commands/push_command.rb b/lib/rubygems/commands/push_command.rb
index 613c4e6ddf..83c7131afc 100644
--- a/lib/rubygems/commands/push_command.rb
+++ b/lib/rubygems/commands/push_command.rb
@@ -29,6 +29,8 @@ command. For further discussion see the help for the yank command.
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
@@ -36,20 +38,41 @@ command. For further discussion see the help for the yank command.
'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
def execute
- @host = options[:host]
+ 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
sign_in @host
- send_gem get_one_gem_name
+ send_gem(gem_name)
end
- def send_gem name
+ def send_gem(name)
args = [:post, "api/v1/gems"]
latest_rubygems_version = Gem.latest_rubygems_version
@@ -100,5 +123,15 @@ You can upgrade or downgrade to the latest release version with:
with_response response
end
+ private
+
+ def get_hosts_for(name)
+ gem_metadata = Gem::Package.new(name).spec.metadata
+
+ [
+ gem_metadata["default_gem_server"],
+ gem_metadata["allowed_push_host"]
+ ]
+ end
end