diff options
Diffstat (limited to 'lib/rubygems/commands/sources_command.rb')
-rw-r--r-- | lib/rubygems/commands/sources_command.rb | 155 |
1 files changed, 85 insertions, 70 deletions
diff --git a/lib/rubygems/commands/sources_command.rb b/lib/rubygems/commands/sources_command.rb index 82bb1f62eb..810b45d7c0 100644 --- a/lib/rubygems/commands/sources_command.rb +++ b/lib/rubygems/commands/sources_command.rb @@ -37,103 +37,118 @@ class Gem::Commands::SourcesCommand < Gem::Command add_proxy_option end - def defaults_str - '--list' - end + def add_source source_uri # :nodoc: + check_rubygems_https source_uri - def execute - options[:list] = !(options[:add] || - options[:clear_all] || - options[:remove] || - options[:update]) + source = Gem::Source.new source_uri - if options[:clear_all] then - path = Gem.spec_cache_dir - FileUtils.rm_rf path - - unless File.exist? path then - say "*** Removed specs cache ***" + begin + if Gem.sources.include? source_uri then + say "source #{source_uri} already present in the cache" else - unless File.writable? path then - say "*** Unable to remove source cache (write protected) ***" - else - say "*** Unable to remove source cache ***" - end + source.load_specs :released + Gem.sources << source + Gem.configuration.write - terminate_interaction 1 + say "#{source_uri} added to sources" end + rescue URI::Error, ArgumentError + say "#{source_uri} is not a URI" + terminate_interaction 1 + rescue Gem::RemoteFetcher::FetchError => e + say "Error fetching #{source_uri}:\n\t#{e.message}" + terminate_interaction 1 end + end - if source_uri = options[:add] then - uri = URI source_uri + def check_rubygems_https source_uri # :nodoc: + uri = URI source_uri - if uri.scheme and uri.scheme.downcase == 'http' and - uri.host.downcase == 'rubygems.org' then - question = <<-QUESTION.chomp + if uri.scheme and uri.scheme.downcase == 'http' and + uri.host.downcase == 'rubygems.org' then + question = <<-QUESTION.chomp https://rubygems.org is recommended for security over #{uri} Do you want to add this insecure source? - QUESTION - - terminate_interaction 1 unless ask_yes_no question - end + QUESTION - source = Gem::Source.new source_uri - - begin - if Gem.sources.include? source_uri then - say "source #{source_uri} already present in the cache" - else - source.load_specs :released - Gem.sources << source - Gem.configuration.write - - say "#{source_uri} added to sources" - end - rescue URI::Error, ArgumentError - say "#{source_uri} is not a URI" - terminate_interaction 1 - rescue Gem::RemoteFetcher::FetchError => e - say "Error fetching #{source_uri}:\n\t#{e.message}" - terminate_interaction 1 - end + terminate_interaction 1 unless ask_yes_no question end + end - if options[:remove] then - source_uri = options[:remove] + def clear_all # :nodoc: + path = Gem.spec_cache_dir + FileUtils.rm_rf path - unless Gem.sources.include? source_uri then - say "source #{source_uri} not present in cache" + unless File.exist? path then + say "*** Removed specs cache ***" + else + unless File.writable? path then + say "*** Unable to remove source cache (write protected) ***" else - Gem.sources.delete source_uri - Gem.configuration.write - - say "#{source_uri} removed from sources" + say "*** Unable to remove source cache ***" end + + terminate_interaction 1 end + end - if options[:update] then - Gem.sources.each_source do |src| - src.load_specs :released - src.load_specs :latest - end + def defaults_str # :nodoc: + '--list' + end + + def list # :nodoc: + say "*** CURRENT SOURCES ***" + say - say "source cache successfully updated" + Gem.sources.each do |src| + say src end + end - if options[:list] then - say "*** CURRENT SOURCES ***" - say + def list? # :nodoc: + !(options[:list] || + options[:add] || + options[:clear_all] || + options[:remove] || + options[:update]) + end - Gem.sources.each do |src| - say src - end + def execute + clear_all if options[:clear_all] + + source_uri = options[:add] + add_source source_uri if source_uri + + source_uri = options[:remove] + remove_source source_uri if source_uri + + update if options[:update] + + list if list? + end + + def remove_source source_uri # :nodoc: + unless Gem.sources.include? source_uri then + say "source #{source_uri} not present in cache" + else + Gem.sources.delete source_uri + Gem.configuration.write + + say "#{source_uri} removed from sources" end end - private + def update # :nodoc: + Gem.sources.each_source do |src| + src.load_specs :released + src.load_specs :latest + end + + say "source cache successfully updated" + end - def remove_cache_file(desc, path) + def remove_cache_file desc, path # :nodoc: FileUtils.rm_rf path if not File.exist?(path) then |