Parent

Class/Module Index [+]

Quicksearch

Bundler::Fetcher

Handles all the fetching with the rubygems server

Constants

REDIRECT_LIMIT

Attributes

disable_endpoint[RW]
has_api[R]

Public Class Methods

download_gem_from_uri(spec, uri) click to toggle source
# File lib/bundler/fetcher.rb, line 25
def download_gem_from_uri(spec, uri)
  spec.fetch_platform

  download_path = Bundler.requires_sudo? ? Bundler.tmp : Bundler.rubygems.gem_dir
  gem_path = "#{Bundler.rubygems.gem_dir}/cache/#{spec.full_name}.gem"

  FileUtils.mkdir_p("#{download_path}/cache")
  Bundler.rubygems.download_gem(spec, uri, download_path)

  if Bundler.requires_sudo?
    Bundler.mkdir_p "#{Bundler.rubygems.gem_dir}/cache"
    Bundler.sudo "mv #{Bundler.tmp}/cache/#{spec.full_name}.gem #{gem_path}"
  end

  gem_path
end
fetch(spec) click to toggle source
# File lib/bundler/fetcher.rb, line 16
def fetch(spec)
  spec, uri = @@spec_fetch_map[spec.full_name]
  if spec
    path = download_gem_from_uri(spec, uri)
    s = Bundler.rubygems.spec_from_gem(path)
    spec.__swap__(s)
  end
end
new(remote_uri) click to toggle source
# File lib/bundler/fetcher.rb, line 43
def initialize(remote_uri)
  @remote_uri = remote_uri
  @has_api    = true # will be set to false if the rubygems index is ever fetched
  @@connection ||= Net::HTTP::Persistent.new nil, :ENV
end

Public Instance Methods

fetch_remote_specs(gem_names, full_dependency_list = [], last_spec_list = []) click to toggle source

fetch index

# File lib/bundler/fetcher.rb, line 120
def fetch_remote_specs(gem_names, full_dependency_list = [], last_spec_list = [])
  query_list = gem_names - full_dependency_list

  # only display the message on the first run
  if Bundler.ui.debug?
    Bundler.ui.debug "Query List: #{query_list.inspect}"
  else
    Bundler.ui.info ".", false
  end

  return {@remote_uri => last_spec_list} if query_list.empty?

  spec_list, deps_list = fetch_dependency_remote_specs(query_list)
  returned_gems = spec_list.map {|spec| spec.first }.uniq

  fetch_remote_specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
end
fetch_spec(spec) click to toggle source

fetch a gem specification

# File lib/bundler/fetcher.rb, line 50
def fetch_spec(spec)
  spec = spec - [nil, 'ruby', '']
  spec_file_name = "#{spec.join '-'}.gemspec.rz"

  uri = URI.parse("#{@remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}")

  spec_rz = (uri.scheme == "file") ? Gem.read_binary(uri.path) : fetch(uri)
  Marshal.load Gem.inflate(spec_rz)
end
specs(gem_names, source) click to toggle source

return the specs in the bundler format as an index

# File lib/bundler/fetcher.rb, line 61
def specs(gem_names, source)
  index = Index.new

  if !gem_names || @remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
    Bundler.ui.info "Fetching source index from #{strip_user_pass_from_uri(@remote_uri)}"
    specs = fetch_all_remote_specs
  else
    Bundler.ui.info "Fetching gem metadata from #{strip_user_pass_from_uri(@remote_uri)}", Bundler.ui.debug?
    begin
      specs = fetch_remote_specs(gem_names)
    # fall back to the legacy index in the following cases
    # 1. Gemcutter Endpoint doesn't return a 200
    # 2. Marshal blob doesn't load properly
    # 3. One of the YAML gemspecs has the Syck::DefaultKey problem
    rescue HTTPError, TypeError => e
      # new line now that the dots are over
      Bundler.ui.info "" unless Bundler.ui.debug?

      if @remote_uri.to_s.include?("rubygems.org")
        Bundler.ui.info "Error #{e.class} during request to dependency API"
      end
      Bundler.ui.debug e.message
      Bundler.ui.debug e.backtrace

      Bundler.ui.info "Fetching full source index from #{strip_user_pass_from_uri(@remote_uri)}"
      specs = fetch_all_remote_specs
    else
      # new line now that the dots are over
      Bundler.ui.info "" unless Bundler.ui.debug?
    end
  end

  specs[@remote_uri].each do |name, version, platform, dependencies|
    next if name == 'bundler'
    spec = nil
    if dependencies
      spec = EndpointSpecification.new(name, version, platform, dependencies)
    else
      spec = RemoteSpecification.new(name, version, platform, self)
    end
    spec.source = source
    @@spec_fetch_map[spec.full_name] = [spec, @remote_uri]
    index << spec
  end

  index
rescue LoadError => e
  if e.message.include?("cannot load such file -- openssl")
    raise InstallError,
      "\nCould not load OpenSSL."            "\nYou must recompile Ruby with OpenSSL support or change the sources in your"            "\nGemfile from 'https' to 'http'. Instructions for compiling with OpenSSL"            "\nusing RVM are available at rvm.io/packages/openssl."
  else
    raise e
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.