summaryrefslogtreecommitdiff
path: root/lib/bundler/resolver
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2023-01-31 09:35:54 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2023-01-31 10:49:08 +0900
commitd3822c9a8aa91151bd040d5635b723ff80bc1886 (patch)
tree65239bbe567a43b2f4925196fb20b11c8492179f /lib/bundler/resolver
parent4cbfd87e5a8464db42657ee0019f9bd78c15c05c (diff)
Merge RubyGems/Bundler master.
Pick from https://github.com/rubygems/rubygems/commit/5ace20dbecfeaf09fba5f616193f3cfcff70ba00
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7203
Diffstat (limited to 'lib/bundler/resolver')
-rw-r--r--lib/bundler/resolver/base.rb45
-rw-r--r--lib/bundler/resolver/candidate.rb7
-rw-r--r--lib/bundler/resolver/package.rb13
3 files changed, 51 insertions, 14 deletions
diff --git a/lib/bundler/resolver/base.rb b/lib/bundler/resolver/base.rb
index 78b798f4ec..6921c047a7 100644
--- a/lib/bundler/resolver/base.rb
+++ b/lib/bundler/resolver/base.rb
@@ -1,19 +1,47 @@
# frozen_string_literal: true
+require_relative "package"
+
module Bundler
class Resolver
class Base
- def initialize(base, additional_base_requirements)
+ attr_reader :packages, :requirements, :source_requirements
+
+ def initialize(source_requirements, dependencies, base, platforms, options)
+ @source_requirements = source_requirements
+
@base = base
- @additional_base_requirements = additional_base_requirements
+
+ @packages = Hash.new do |hash, name|
+ hash[name] = Package.new(name, platforms, **options)
+ end
+
+ @requirements = dependencies.map do |dep|
+ dep_platforms = dep.gem_platforms(platforms)
+
+ # Dependencies scoped to external platforms are ignored
+ next if dep_platforms.empty?
+
+ name = dep.name
+
+ @packages[name] = Package.new(name, dep_platforms, **options.merge(:dependency => dep))
+
+ dep
+ end.compact
end
def [](name)
@base[name]
end
- def delete(spec)
- @base.delete(spec)
+ def delete(specs)
+ specs.each do |spec|
+ @base.delete(spec)
+ end
+ end
+
+ def get_package(name)
+ @packages[name]
end
def base_requirements
@@ -24,10 +52,14 @@ module Bundler
names.each do |name|
@base.delete_by_name(name)
- @additional_base_requirements.reject! {|dep| dep.name == name }
+ @base_requirements.delete(name)
end
+ end
- @base_requirements = nil
+ def include_prereleases(names)
+ names.each do |name|
+ get_package(name).consider_prereleases!
+ end
end
private
@@ -38,7 +70,6 @@ module Bundler
req = Gem::Requirement.new(ls.version)
base_requirements[ls.name] = req
end
- @additional_base_requirements.each {|d| base_requirements[d.name] = d.requirement }
base_requirements
end
end
diff --git a/lib/bundler/resolver/candidate.rb b/lib/bundler/resolver/candidate.rb
index 681f9aca73..e695ef08ee 100644
--- a/lib/bundler/resolver/candidate.rb
+++ b/lib/bundler/resolver/candidate.rb
@@ -26,9 +26,8 @@ module Bundler
def initialize(version, specs: [])
@spec_group = Resolver::SpecGroup.new(specs)
- @platforms = specs.map(&:platform).sort_by(&:to_s).uniq
@version = Gem::Version.new(version)
- @ruby_only = @platforms == [Gem::Platform::RUBY]
+ @ruby_only = specs.map(&:platform).uniq == [Gem::Platform::RUBY]
end
def dependencies
@@ -88,9 +87,7 @@ module Bundler
end
def to_s
- return @version.to_s if @platforms.empty? || @ruby_only
-
- "#{@version} (#{@platforms.join(", ")})"
+ @version.to_s
end
end
end
diff --git a/lib/bundler/resolver/package.rb b/lib/bundler/resolver/package.rb
index 7d64632860..7499a75006 100644
--- a/lib/bundler/resolver/package.rb
+++ b/lib/bundler/resolver/package.rb
@@ -15,12 +15,13 @@ module Bundler
class Package
attr_reader :name, :platforms, :dependency, :locked_version
- def initialize(name, platforms, locked_specs, unlock, dependency: nil)
+ def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, dependency: nil)
@name = name
@platforms = platforms
@locked_version = locked_specs[name].first&.version
@unlock = unlock
@dependency = dependency || Dependency.new(name, @locked_version)
+ @prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
end
def to_s
@@ -47,8 +48,16 @@ module Bundler
@unlock.empty? || @unlock.include?(name)
end
+ def ignores_prereleases?
+ @prerelease == :ignore
+ end
+
def prerelease_specified?
- @dependency.prerelease?
+ @prerelease == :consider_first
+ end
+
+ def consider_prereleases!
+ @prerelease = :consider_last
end
def force_ruby_platform?