diff options
Diffstat (limited to 'lib/rubygems/dependency_installer.rb')
-rw-r--r-- | lib/rubygems/dependency_installer.rb | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/lib/rubygems/dependency_installer.rb b/lib/rubygems/dependency_installer.rb index da6994a9be..039d046da2 100644 --- a/lib/rubygems/dependency_installer.rb +++ b/lib/rubygems/dependency_installer.rb @@ -72,6 +72,7 @@ class Gem::DependencyInstaller def initialize options = {} @only_install_dir = !!options[:install_dir] @install_dir = options[:install_dir] || Gem.dir + @build_root = options[:build_root] options = DEFAULT_OPTIONS.merge options @@ -102,7 +103,7 @@ class Gem::DependencyInstaller @cache_dir = options[:cache_dir] || @install_dir - @errors = nil + @errors = [] end ## @@ -157,6 +158,7 @@ class Gem::DependencyInstaller dependency_list.remove_specs_unsatisfied_by dependencies end + ## # Creates an AvailableSet to install from based on +dep_or_name+ and # +version+ @@ -243,9 +245,9 @@ class Gem::DependencyInstaller # FIX if there is a problem talking to the network, we either need to always tell # the user (no really_verbose) or fail hard, not silently tell them that we just # couldn't find their requested gem. - if Gem.configuration.really_verbose then - say "Error fetching remote data:\t\t#{e.message}" - say "Falling back to local-only install" + verbose do + "Error fetching remote data:\t\t#{e.message}\n" \ + "Falling back to local-only install" end @domain = :local end @@ -375,13 +377,16 @@ class Gem::DependencyInstaller options = { :bin_dir => @bin_dir, :build_args => @build_args, + :document => @document, :env_shebang => @env_shebang, :force => @force, :format_executable => @format_executable, :ignore_dependencies => @ignore_dependencies, + :prerelease => @prerelease, :security_policy => @security_policy, :user_install => @user_install, :wrappers => @wrappers, + :build_root => @build_root, :install_as_default => @install_as_default } options[:install_dir] = @install_dir if @only_install_dir @@ -415,25 +420,59 @@ class Gem::DependencyInstaller end def resolve_dependencies dep_or_name, version # :nodoc: - as = available_set_for dep_or_name, version - - request_set = as.to_request_set install_development_deps + request_set = Gem::RequestSet.new + request_set.development = @development + request_set.development_shallow = @dev_shallow request_set.soft_missing = @force + request_set.prerelease = @prerelease request_set.remote = false unless consider_remote? installer_set = Gem::Resolver::InstallerSet.new @domain - installer_set.always_install.concat request_set.always_install installer_set.ignore_installed = @only_install_dir + if consider_local? + if dep_or_name =~ /\.gem$/ and File.file? dep_or_name then + src = Gem::Source::SpecificFile.new dep_or_name + installer_set.add_local dep_or_name, src.spec, src + version = src.spec.version if version == Gem::Requirement.default + elsif dep_or_name =~ /\.gem$/ then + Dir[dep_or_name].each do |name| + begin + src = Gem::Source::SpecificFile.new name + installer_set.add_local dep_or_name, src.spec, src + rescue Gem::Package::FormatError + end + end + # else This is a dependency. InstallerSet handles this case + end + end + + dependency = + if spec = installer_set.local?(dep_or_name) then + Gem::Dependency.new spec.name, version + elsif String === dep_or_name then + Gem::Dependency.new dep_or_name, version + else + dep_or_name + end + + dependency.prerelease = @prerelease + + request_set.import [dependency] + + installer_set.add_always_install dependency + + request_set.always_install = installer_set.always_install + if @ignore_dependencies then installer_set.ignore_dependencies = true request_set.ignore_dependencies = true request_set.soft_missing = true end - composed_set = Gem::Resolver.compose_sets as, installer_set + request_set.resolve installer_set - request_set.resolve composed_set + @errors.concat request_set.errors request_set end |