lib/bundler/rubygems_integration.rb in bundler-1.2.5 vs lib/bundler/rubygems_integration.rb in bundler-1.3.0.pre

- old
+ new

@@ -1,12 +1,9 @@ +require 'rubygems' + module Bundler class RubygemsIntegration - def initialize - # Work around a RubyGems bug - configuration - end - def loaded_specs(name) Gem.loaded_specs[name] end def mark_loaded(spec) @@ -88,10 +85,26 @@ def fetch_specs(all, pre, &blk) Gem::SpecFetcher.new.list(all, pre).each(&blk) end + def fetch_all_remote_specs + spec_list = Hash.new { |h,k| h[k] = [] } + begin + # Fetch all specs, minus prerelease specs + spec_list = Gem::SpecFetcher.new.list(true, false) + # Then fetch the prerelease specs + begin + Gem::SpecFetcher.new.list(false, true).each {|k, v| spec_list[k] += v } + rescue Gem::RemoteFetcher::FetchError => e + # ignore if we can't fetch the prerelease specs + end + end + + return spec_list + end + def with_build_args(args) old_args = Gem::Command.build_args begin Gem::Command.build_args = args yield @@ -99,13 +112,25 @@ Gem::Command.build_args = old_args end end def spec_from_gem(path) + require 'rubygems/format' Gem::Format.from_file_by_path(path).spec + rescue Gem::Package::FormatError + raise Bundler::GemspecError, "Could not read gem at #{path}. It may be corrupted." end + def build(spec) + require 'rubygems/builder' + Gem::Builder.new(spec).build + end + + def build_gem(gem_dir, spec) + Dir.chdir(gem_dir) { build(spec) } + end + def download_gem(spec, uri, path) Gem::RemoteFetcher.fetcher.download(spec, uri, path) end def reverse_rubygems_kernel_mixin @@ -159,20 +184,10 @@ true end end - if defined? ::Deprecate - Deprecate = ::Deprecate - elsif defined? Gem::Deprecate - Deprecate = Gem::Deprecate - else - class Deprecate - def skip_during; yield; end - end - end - def stub_source_index137(specs) # Rubygems versions lower than 1.7 use SourceIndex#from_gems_in source_index_class = (class << Gem::SourceIndex ; self ; end) source_index_class.send(:remove_method, :from_gems_in) source_index_class.send(:define_method, :from_gems_in) do |*args| @@ -339,11 +354,11 @@ def stub_rubygems(specs) stub_source_index170(specs) end end - # Rubygems 1.8.5 + # Rubygems ~> 1.8.5 class Modern < RubygemsIntegration def stub_rubygems(specs) Gem::Specification.all = specs Gem.post_reset { @@ -372,12 +387,63 @@ yield Gem.use_paths(old_dir, old_path) end end + # Rubygems 2.0 + class Future < RubygemsIntegration + require 'rubygems/package' + + def stub_rubygems(specs) + Gem::Specification.all = specs + + Gem.post_reset { + Gem::Specification.all = specs + } + end + + def all_specs + Gem::Specification.to_a + end + + def find_name(name) + Gem::Specification.find_all_by_name name + end + + def fetch_all_remote_specs + tuples, errors = Gem::SpecFetcher.new.available_specs(:complete) + # only raise if we don't get any specs back. + # this means we still work if prerelease_specs.4.8.gz + # don't exist but specs.4.8.gz do + if tuples.empty? && error = errors.detect {|e| e.is_a?(Gem::SourceFetchProblem) } + raise Gem::RemoteFetcher::FetchError.new(error.error, error.source) + end + + hash = {} + tuples.each do |source,tuples| + hash[source.uri] = tuples.map { |tuple| tuple.to_a } + end + + hash + end + + def spec_from_gem(path) + Gem::Package.new(path).spec + rescue Gem::Package::FormatError + raise Bundler::GemspecError, "Could not read gem at #{path}. It may be corrupted." + end + + def build(spec) + Gem::Package.build(spec) + end + + end + end - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.5') + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.99.99') + @rubygems = RubygemsIntegration::Future.new + elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.5') @rubygems = RubygemsIntegration::Modern.new elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.0') @rubygems = RubygemsIntegration::AlmostModern.new elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.7.0') @rubygems = RubygemsIntegration::Transitional.new