diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bundler/definition.rb | 15 | ||||
-rw-r--r-- | lib/bundler/spec_set.rb | 38 |
2 files changed, 50 insertions, 3 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 72fbae1984..9ef0abed93 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -84,7 +84,7 @@ module Bundler @new_platform = nil @removed_platform = nil - if lockfile && File.exist?(lockfile) + if lockfile_exists? @lockfile_contents = Bundler.read_file(lockfile) @locked_gems = LockfileParser.new(@lockfile_contents) @locked_platforms = @locked_gems.platforms @@ -302,6 +302,10 @@ module Bundler end end + def should_complete_platforms? + !lockfile_exists? && generic_local_platform_is_ruby? && !Bundler.settings[:force_ruby_platform] + end + def spec_git_paths sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact end @@ -491,6 +495,10 @@ module Bundler private + def lockfile_exists? + lockfile && File.exist?(lockfile) + end + def resolver @resolver ||= Resolver.new(resolution_packages, gem_version_promoter) end @@ -567,11 +575,12 @@ module Bundler end def start_resolution - result = resolver.start + result = SpecSet.new(resolver.start) @resolved_bundler_version = result.find {|spec| spec.name == "bundler" }&.version + @platforms = result.complete_platforms!(platforms) if should_complete_platforms? - SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms)) + SpecSet.new(result.for(dependencies, false, @platforms)) end def precompute_source_requirements_for_indirect_dependencies? diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 277824c34f..f4fc005ef2 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -52,6 +52,44 @@ module Bundler specs.uniq end + def complete_platforms!(platforms) + return platforms.concat([Gem::Platform::RUBY]).uniq if @specs.empty? + + new_platforms = @specs.flat_map {|spec| spec.source.specs.search([spec.name, spec.version]).map(&:platform) }.uniq.select do |platform| + next if platforms.include?(platform) + next unless GemHelpers.generic(platform) == Gem::Platform::RUBY + + new_specs = [] + + valid_platform = lookup.all? do |_, specs| + spec = specs.first + matching_specs = spec.source.specs.search([spec.name, spec.version]) + platform_spec = GemHelpers.select_best_platform_match(matching_specs, platform).first + + if platform_spec + new_specs << LazySpecification.from_spec(platform_spec) + true + else + false + end + end + next unless valid_platform + + @specs.concat(new_specs.uniq) + end + return platforms if new_platforms.empty? + + platforms.concat(new_platforms) + + less_specific_platform = new_platforms.find {|platform| platform != Gem::Platform::RUBY && platform === Bundler.local_platform } + platforms.delete(Bundler.local_platform) if less_specific_platform + + @sorted = nil + @lookup = nil + + platforms + end + def [](key) key = key.name if key.respond_to?(:name) lookup[key].reverse |