Handles all the fetching with the rubygems server
# 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 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 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
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
Generated with the Darkfish Rdoc Generator 2.