class Bundler::Installer
def self.install(root, definition, options)
def self.install(root, definition, options) new(root, definition).run(options) end
def ambiguous?(dep)
def ambiguous?(dep) dep.version_requirements.requirements.any? { |op,_| op != '=' } end
def cache_source
def cache_source Source::GemCache.new("path" => "#{root}/vendor/cache") end
def dependencies
def dependencies @definition.actual_dependencies end
def index
def index @index ||= begin index = Index.new if File.directory?("#{root}/vendor/cache") index = cache_source.specs.merge(index).freeze end rg_sources = sources.select { |s| s.is_a?(Source::Rubygems) } other_sources = sources.select { |s| !s.is_a?(Source::Rubygems) } other_sources.each do |source| i = source.specs Bundler.ui.debug "Source: Processing index" index = i.merge(index).freeze end index = Index.from_installed_gems.merge(index) rg_sources.each do |source| i = source.specs Bundler.ui.debug "Source: Processing index" index = i.merge(index).freeze end index end end
def local_index
def local_index @local_index ||= begin index = Index.new sources.each do |source| next unless source.respond_to?(:local_specs) index = source.local_specs.merge(index) end if File.directory?("#{root}/vendor/cache") index = cache_source.specs.merge(index).freeze end Index.from_installed_gems.merge(index) end end
def resolve_locally
def resolve_locally # Return unless all the dependencies have = version requirements return if dependencies.any? { |d| ambiguous?(d) } source_requirements = {} dependencies.each do |dep| next unless dep.source && dep.source.respond_to?(:local_specs) source_requirements[dep.name] = dep.source.local_specs end # Run a resolve against the locally available gems specs = Resolver.resolve(dependencies, local_index, source_requirements) # Simple logic for now. Can improve later. specs.length == dependencies.length && specs rescue Bundler::GemNotFound nil raise if ENV["OMG"] end
def resolve_remotely
def resolve_remotely index # trigger building the index Bundler.ui.info "Resolving dependencies" source_requirements = {} dependencies.each do |dep| next unless dep.source source_requirements[dep.name] = dep.source.specs end specs = Resolver.resolve(dependencies, index, source_requirements) specs end
def run(options)
def run(options) if dependencies.empty? Bundler.ui.warn "The Gemfile specifies no dependencies" return end specs.sort_by { |s| s.name }.each do |spec| # unless spec.source.is_a?(Source::SystemGems) Bundler.ui.info "Installing #{spec.name} (#{spec.version}) from #{spec.source} " # end if (spec.groups & options[:without]).any? Bundler.ui.debug " * Not in requested group; skipping." next end spec.source.install(spec) Bundler.ui.info "" end Bundler.ui.confirm "Your bundle is complete!" end
def sources
def sources @definition.sources end
def specs
def specs @specs ||= group_specs(resolve_locally || resolve_remotely) end