diff options
Diffstat (limited to 'lib/rubygems/commands/install_command.rb')
-rw-r--r-- | lib/rubygems/commands/install_command.rb | 125 |
1 files changed, 78 insertions, 47 deletions
diff --git a/lib/rubygems/commands/install_command.rb b/lib/rubygems/commands/install_command.rb index 5e2ffcdff3..f02b12906d 100644 --- a/lib/rubygems/commands/install_command.rb +++ b/lib/rubygems/commands/install_command.rb @@ -113,7 +113,44 @@ to write the specification by hand. For example: "#{program_name} GEMNAME [GEMNAME ...] [options] -- --build-flags" end - def install_from_gemdeps(gf) + def check_install_dir # :nodoc: + if options[:install_dir] and options[:user_install] then + alert_error "Use --install-dir or --user-install but not both" + terminate_interaction 1 + end + end + + def check_version # :nodoc: + if options[:version] != Gem::Requirement.default and + get_all_gem_names.size > 1 then + alert_error "Can't use --version w/ multiple gems. Use name:ver instead." + terminate_interaction 1 + end + end + + def execute + if gf = options[:gemdeps] then + install_from_gemdeps gf + return + end + + @installed_specs = [] + + ENV.delete 'GEM_PATH' if options[:install_dir].nil? and RUBY_VERSION > '1.9' + + check_install_dir + check_version + + load_hooks + + exit_code = install_gems + + show_installed + + raise Gem::SystemExitException, exit_code + end + + def install_from_gemdeps gf # :nodoc: require 'rubygems/request_set' rs = Gem::RequestSet.new rs.load_gemdeps gf @@ -135,58 +172,26 @@ to write the specification by hand. For example: raise Gem::SystemExitException, 0 end - def execute - if gf = options[:gemdeps] then - install_from_gemdeps gf - return - end + def install_gem name, version # :nodoc: + return if options[:conservative] and + not Gem::Dependency.new(name, version).matching_specs.empty? - @installed_specs = [] + inst = Gem::DependencyInstaller.new options + inst.install name, Gem::Requirement.create(version) - ENV.delete 'GEM_PATH' if options[:install_dir].nil? and RUBY_VERSION > '1.9' + @installed_specs.push(*inst.installed_gems) - if options[:install_dir] and options[:user_install] - alert_error "Use --install-dir or --user-install but not both" - terminate_interaction 1 - end + show_install_errors inst.errors + end + def install_gems # :nodoc: exit_code = 0 - if options[:version] != Gem::Requirement.default && - get_all_gem_names.size > 1 then - alert_error "Can't use --version w/ multiple gems. Use name:ver instead." - terminate_interaction 1 - end - - # load post-install hooks appropriate to options - if options[:install_as_default] - require 'rubygems/install_default_message' - else - require 'rubygems/install_message' - end - require 'rubygems/rdoc' - get_all_gem_names_and_versions.each do |gem_name, gem_version| gem_version ||= options[:version] begin - next if options[:conservative] and - not Gem::Dependency.new(gem_name, gem_version).matching_specs.empty? - - inst = Gem::DependencyInstaller.new options - inst.install gem_name, Gem::Requirement.create(gem_version) - - @installed_specs.push(*inst.installed_gems) - - next unless errs = inst.errors - - errs.each do |x| - next unless Gem::SourceFetchProblem === x - - msg = "Unable to pull data from '#{x.source.uri}': #{x.error.message}" - - alert_warning msg - end + install_gem gem_name, gem_version rescue Gem::InstallError => e alert_error "Error installing #{gem_name}:\n\t#{e.message}" exit_code |= 1 @@ -197,12 +202,38 @@ to write the specification by hand. For example: end end - unless @installed_specs.empty? then - gems = @installed_specs.length == 1 ? 'gem' : 'gems' - say "#{@installed_specs.length} #{gems} installed" + exit_code + end + + ## + # Loads post-install hooks + + def load_hooks # :nodoc: + if options[:install_as_default] + require 'rubygems/install_default_message' + else + require 'rubygems/install_message' + end + require 'rubygems/rdoc' + end + + def show_install_errors errors # :nodoc: + return unless errors + + errors.each do |x| + return unless Gem::SourceFetchProblem === x + + msg = "Unable to pull data from '#{x.source.uri}': #{x.error.message}" + + alert_warning msg end + end - raise Gem::SystemExitException, exit_code + def show_installed # :nodoc: + return if @installed_specs.empty? + + gems = @installed_specs.length == 1 ? 'gem' : 'gems' + say "#{@installed_specs.length} #{gems} installed" end end |