lib/bundler/definition.rb in bundler-1.16.0.pre.2 vs lib/bundler/definition.rb in bundler-1.16.0.pre.3

- old
+ new

@@ -263,13 +263,12 @@ def index @index ||= Index.build do |idx| dependency_names = @dependencies.map(&:name) sources.all_sources.each do |source| - source.dependency_names = dependency_names.dup + source.dependency_names = dependency_names - pinned_spec_names(source) idx.add_source source.specs - dependency_names -= pinned_spec_names(source.specs) dependency_names.concat(source.unmet_deps).uniq! end double_check_for_index(idx, dependency_names) end @@ -279,25 +278,29 @@ # sources A and B. At this point, the API request will have found all the versions of Bar in source A, # but will not have found any versions of Bar from source B, which is a problem if the requested version # of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for # each spec we found, we add all possible versions from all sources to the index. def double_check_for_index(idx, dependency_names) + pinned_names = pinned_spec_names loop do idxcount = idx.size + + names = :names # do this so we only have to traverse to get dependency_names from the index once + unmet_dependency_names = lambda do + return names unless names == :names + new_names = sources.all_sources.map(&:dependency_names_to_double_check) + return names = nil if new_names.compact! + names = new_names.flatten(1).concat(dependency_names) + names.uniq! + names -= pinned_names + names + end + sources.all_sources.each do |source| - names = :names # do this so we only have to traverse to get dependency_names from the index once - unmet_dependency_names = proc do - break names unless names == :names - names = if idx.size > Source::Rubygems::API_REQUEST_LIMIT - new_names = idx.dependency_names_if_available - new_names && dependency_names.+(new_names).uniq - else - dependency_names.+(idx.dependency_names).uniq - end - end source.double_check_for(unmet_dependency_names, :override_dupes) end + break if idxcount == idx.size end end private :double_check_for_index @@ -914,21 +917,18 @@ end source_requirements["bundler"] = sources.metadata_source # needs to come last to override source_requirements end - def pinned_spec_names(specs) - names = [] - specs.each do |s| - # TODO: when two sources without blocks is an error, we can change - # this check to !s.source.is_a?(Source::LocalRubygems). For now, - # we need to ask every RubyGems for every gem name. - if s.source.is_a?(Source::Git) || s.source.is_a?(Source::Path) - names << s.name - end + def pinned_spec_names(skip = nil) + pinned_names = [] + default = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? && sources.default_source + @dependencies.each do |dep| + next unless dep_source = dep.source || default + next if dep_source == skip + pinned_names << dep.name end - names.uniq! - names + pinned_names end def requested_groups groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with] end