aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/definition.rb15
-rw-r--r--lib/bundler/spec_set.rb38
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