summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler.rb12
-rw-r--r--lib/bundler/cli.rb2
-rw-r--r--lib/bundler/cli/outdated.rb4
-rw-r--r--lib/bundler/definition.rb21
-rw-r--r--lib/bundler/dependency.rb4
-rw-r--r--lib/bundler/lazy_specification.rb16
-rw-r--r--lib/bundler/resolver.rb49
-rw-r--r--lib/bundler/resolver/spec_group.rb14
-rw-r--r--lib/bundler/rubygems_integration.rb1
-rw-r--r--lib/bundler/stub_specification.rb2
-rw-r--r--lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb9
-rw-r--r--lib/bundler/version.rb2
-rw-r--r--lib/rubygems.rb2
-rw-r--r--lib/rubygems/resolver/api_set.rb2
-rw-r--r--lib/rubygems/source.rb1
15 files changed, 77 insertions, 64 deletions
diff --git a/lib/bundler.rb b/lib/bundler.rb
index 0ddd2c7f88..7a01de5ddb 100644
--- a/lib/bundler.rb
+++ b/lib/bundler.rb
@@ -212,6 +212,15 @@ module Bundler
end
end
+ def locked_bundler_version
+ return nil unless defined?(@definition) && @definition
+
+ locked_gems = definition.locked_gems
+ return nil unless locked_gems
+
+ locked_gems.bundler_version
+ end
+
def ruby_scope
"#{Bundler.rubygems.ruby_engine}/#{RbConfig::CONFIG["ruby_version"]}"
end
@@ -602,8 +611,9 @@ EOF
reset_rubygems!
end
- def reset_settings!
+ def reset_settings_and_root!
@settings = nil
+ @root = nil
end
def reset_paths!
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb
index e2dceb98d5..2f495d427d 100644
--- a/lib/bundler/cli.rb
+++ b/lib/bundler/cli.rb
@@ -57,7 +57,7 @@ module Bundler
custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
if custom_gemfile && !custom_gemfile.empty?
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
- Bundler.reset_settings!
+ Bundler.reset_settings_and_root!
end
Bundler.settings.set_command_option_if_given :retry, options[:retry]
diff --git a/lib/bundler/cli/outdated.rb b/lib/bundler/cli/outdated.rb
index b8d9be20b6..6a1789e235 100644
--- a/lib/bundler/cli/outdated.rb
+++ b/lib/bundler/cli/outdated.rb
@@ -76,6 +76,8 @@ module Bundler
next unless gems.empty? || gems.include?(current_spec.name)
active_spec = retrieve_active_spec(definition, current_spec)
+ next unless active_spec
+
next unless filter_options_patch.empty? || update_present_via_semver_portions(current_spec, active_spec, options)
gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
@@ -229,8 +231,6 @@ module Bundler
end
def update_present_via_semver_portions(current_spec, active_spec, options)
- return false if active_spec.nil?
-
current_major = current_spec.version.segments.first
active_major = active_spec.version.segments.first
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 4cf4f76084..fdd093fbb3 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -269,7 +269,9 @@ module Bundler
else
# Run a resolve against the locally available gems
Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
- last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
+ platforms_for_resolve = platforms.one? {|p| generic(p) == Gem::Platform::RUBY } ? platforms : platforms.reject{|p| p == Gem::Platform::RUBY }
+ expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, @remote, platforms_for_resolve.map {|p| generic(p) })
+ last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms_for_resolve)
end
# filter out gems that _can_ be installed on multiple platforms, but don't need
@@ -548,11 +550,7 @@ module Bundler
private
def add_current_platform
- current_platforms.each {|platform| add_platform(platform) }
- end
-
- def current_platforms
- [local_platform, generic_local_platform].uniq
+ add_platform(local_platform)
end
def change_reason
@@ -847,14 +845,6 @@ module Bundler
@locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
end
- # This list of dependencies is only used in #resolve, so it's OK to add
- # the metadata dependencies here
- def expanded_dependencies
- @expanded_dependencies ||= begin
- expand_dependencies(dependencies + metadata_dependencies, @remote)
- end
- end
-
def metadata_dependencies
@metadata_dependencies ||= begin
ruby_versions = ruby_version_requirements(@ruby_version)
@@ -881,7 +871,8 @@ module Bundler
end
end
- def expand_dependencies(dependencies, remote = false)
+ def expand_dependencies(dependencies, remote = false, platforms = nil)
+ platforms ||= @platforms
deps = []
dependencies.each do |dep|
dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
diff --git a/lib/bundler/dependency.rb b/lib/bundler/dependency.rb
index 26e5f3d1a5..af07e8bc36 100644
--- a/lib/bundler/dependency.rb
+++ b/lib/bundler/dependency.rb
@@ -96,9 +96,11 @@ module Bundler
def gem_platforms(valid_platforms)
return valid_platforms if @platforms.empty?
+ valid_generic_platforms = valid_platforms.map {|p| [p, GemHelpers.generic(p)] }.to_h
@gem_platforms ||= expanded_platforms.compact.uniq
- valid_platforms & @gem_platforms
+ filtered_generic_platforms = valid_generic_platforms.values & @gem_platforms
+ valid_generic_platforms.select {|_, v| filtered_generic_platforms.include?(v) }.keys
end
def expanded_platforms
diff --git a/lib/bundler/lazy_specification.rb b/lib/bundler/lazy_specification.rb
index 22bf0f3f6f..7b1d28b0c3 100644
--- a/lib/bundler/lazy_specification.rb
+++ b/lib/bundler/lazy_specification.rb
@@ -82,7 +82,7 @@ module Bundler
search_object = if source.is_a?(Source::Path)
Dependency.new(name, version)
else
- self
+ ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version)
end
platform_object = Gem::Platform.new(platform)
candidates = source.specs.search(search_object)
@@ -129,5 +129,19 @@ module Bundler
@specification.send(method, *args, &blk)
end
+
+ #
+ # Bundler 2.2.0 was the first version that records the full resolution
+ # including platform specific gems in the lockfile, which means that if a
+ # gem with RUBY platform is recorded, the RUBY platform version of the gem
+ # should be installed. Previously bundler would record only generic versions
+ # in the lockfile and then install the most specific platform variant if
+ # available.
+ #
+ def ruby_platform_materializes_to_ruby_platform?
+ locked_bundler_version = Bundler.locked_bundler_version
+
+ locked_bundler_version.nil? || Gem::Version.new(locked_bundler_version) >= Gem::Version.new("2.2.0")
+ end
end
end
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index 327c170fbe..4bbcbd1162 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -75,7 +75,7 @@ module Bundler
return unless debug?
debug_info = yield
debug_info = debug_info.inspect unless debug_info.is_a?(String)
- warn debug_info.split("\n").map {|s| "BUNDLER: " + " " * depth + s }
+ puts debug_info.split("\n").map {|s| "BUNDLER: " + " " * depth + s }
end
def debug?
@@ -106,18 +106,19 @@ module Bundler
specification.dependencies_for_activated_platforms
end
- def search_for(dependency)
- platform = dependency.__platform
- dependency = dependency.dep unless dependency.is_a? Gem::Dependency
- search = @search_for[dependency] ||= begin
+ def search_for(dependency_proxy)
+ platform = dependency_proxy.__platform
+ dependency = dependency_proxy.dep
+ @search_for[dependency_proxy] ||= begin
+ name = dependency.name
index = index_for(dependency)
- results = index.search(dependency, @base[dependency.name])
+ results = index.search(dependency, @base[name])
- if vertex = @base_dg.vertex_named(dependency.name)
+ if vertex = @base_dg.vertex_named(name)
locked_requirement = vertex.payload.requirement
end
- if !@prerelease_specified[dependency.name] && (!@use_gvp || locked_requirement.nil?)
+ if !@prerelease_specified[name] && (!@use_gvp || locked_requirement.nil?)
# Move prereleases to the beginning of the list, so they're considered
# last during resolution.
pre, results = results.partition {|spec| spec.version.prerelease? }
@@ -145,31 +146,25 @@ module Bundler
end
# GVP handles major itself, but it's still a bit risky to trust it with it
# until we get it settled with new behavior. For 2.x it can take over all cases.
- if !@use_gvp
+ search = if !@use_gvp
spec_groups
else
@gem_version_promoter.sort_versions(dependency, spec_groups)
end
- end
- selected_sgs = []
- search.each do |sg|
- next unless sg.for?(platform)
- # Add a spec group for "non platform specific spec" as the fallback
- # spec group.
- sg_ruby = sg.copy_for(Gem::Platform::RUBY)
- selected_sgs << sg_ruby if sg_ruby
- sg_all_platforms = nil
- all_platforms = @platforms + [platform]
- self.class.sort_platforms(all_platforms).reverse_each do |other_platform|
- if sg_all_platforms.nil?
- sg_all_platforms = sg.copy_for(other_platform)
- else
- sg_all_platforms.activate_platform!(other_platform)
- end
+ selected_sgs = []
+ search.each do |sg|
+ next unless sg.for?(platform)
+ sg_all_platforms = sg.copy_for(self.class.sort_platforms(@platforms).reverse)
+ selected_sgs << sg_all_platforms
+
+ next if sg_all_platforms.activated_platforms == [Gem::Platform::RUBY]
+ # Add a spec group for "non platform specific spec" as the fallback
+ # spec group.
+ sg_ruby = sg.copy_for([Gem::Platform::RUBY])
+ selected_sgs.insert(-2, sg_ruby) if sg_ruby
end
- selected_sgs << sg_all_platforms
+ selected_sgs
end
- selected_sgs
end
def index_for(dependency)
diff --git a/lib/bundler/resolver/spec_group.rb b/lib/bundler/resolver/spec_group.rb
index 8b5759cfad..38dc175ff9 100644
--- a/lib/bundler/resolver/spec_group.rb
+++ b/lib/bundler/resolver/spec_group.rb
@@ -6,7 +6,7 @@ module Bundler
include GemHelpers
attr_accessor :name, :version, :source
- attr_accessor :ignores_bundler_dependencies
+ attr_accessor :ignores_bundler_dependencies, :activated_platforms
def initialize(all_specs)
@all_specs = all_specs
@@ -32,17 +32,13 @@ module Bundler
end.compact.uniq
end
- def activate_platform!(platform)
- return unless for?(platform)
- return if @activated_platforms.include?(platform)
- @activated_platforms << platform
- end
+ def copy_for(platforms)
+ platforms.select! {|p| for?(p) }
+ return unless platforms.any?
- def copy_for(platform)
copied_sg = self.class.new(@all_specs)
copied_sg.ignores_bundler_dependencies = @ignores_bundler_dependencies
- return nil unless copied_sg.for?(platform)
- copied_sg.activate_platform!(platform)
+ copied_sg.activated_platforms = platforms
copied_sg
end
diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb
index 9125a24172..c577001043 100644
--- a/lib/bundler/rubygems_integration.rb
+++ b/lib/bundler/rubygems_integration.rb
@@ -565,7 +565,6 @@ module Bundler
end
def all_specs
- require_relative "remote_specification"
Gem::Specification.stubs.map do |stub|
StubSpecification.from_stub(stub)
end
diff --git a/lib/bundler/stub_specification.rb b/lib/bundler/stub_specification.rb
index a45e28b8a7..2456d268da 100644
--- a/lib/bundler/stub_specification.rb
+++ b/lib/bundler/stub_specification.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative "remote_specification"
-
module Bundler
class StubSpecification < RemoteSpecification
def self.from_stub(stub)
diff --git a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
index d0ab956faf..beff6d658b 100644
--- a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
+++ b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
@@ -159,7 +159,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
# limits (typically windows).
if Process.const_defined? :RLIMIT_NOFILE
- DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
+ open_file_limits = Process.getrlimit(Process::RLIMIT_NOFILE)
+
+ # Under JRuby on Windows Process responds to `getrlimit` but returns something that does not match docs
+ if open_file_limits.respond_to?(:first)
+ DEFAULT_POOL_SIZE = open_file_limits.first / 4
+ else
+ DEFAULT_POOL_SIZE = 256
+ end
else
DEFAULT_POOL_SIZE = 256
end
diff --git a/lib/bundler/version.rb b/lib/bundler/version.rb
index c865621acb..b8b331d85e 100644
--- a/lib/bundler/version.rb
+++ b/lib/bundler/version.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: false
module Bundler
- VERSION = "2.2.0".freeze
+ VERSION = "2.2.1".freeze
def self.bundler_major_version
@bundler_major_version ||= VERSION.split(".").first.to_i
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index e6a3c63c60..7596585482 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -8,7 +8,7 @@
require 'rbconfig'
module Gem
- VERSION = "3.2.0".freeze
+ VERSION = "3.2.1".freeze
end
# Must be first since it unloads the prelude from 1.9.2
diff --git a/lib/rubygems/resolver/api_set.rb b/lib/rubygems/resolver/api_set.rb
index 19c59a315b..cafcd5b472 100644
--- a/lib/rubygems/resolver/api_set.rb
+++ b/lib/rubygems/resolver/api_set.rb
@@ -52,7 +52,7 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
end
versions(req.name).each do |ver|
- if req.dependency.match? req.name, ver[:number]
+ if req.dependency.match? req.name, ver[:number], @prerelease
res << Gem::Resolver::APISpecification.new(self, ver)
end
end
diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb
index 891cc3e644..a2848112e7 100644
--- a/lib/rubygems/source.rb
+++ b/lib/rubygems/source.rb
@@ -148,6 +148,7 @@ class Gem::Source
spec = Gem::Util.inflate spec
if update_cache?
+ require "fileutils"
FileUtils.mkdir_p cache_dir
File.open local_spec, 'wb' do |io|