2018-11-03 02:07:56 +03:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2023-11-08 07:35:44 +03:00
|
|
|
require "rubygems" unless defined?(Gem)
|
|
|
|
|
2022-03-16 14:52:46 +03:00
|
|
|
# We can't let `Gem::Source` be autoloaded in the `Gem::Specification#source`
|
|
|
|
# redefinition below, so we need to load it upfront. The reason is that if
|
|
|
|
# Bundler monkeypatches are loaded before RubyGems activates an executable (for
|
|
|
|
# example, through `ruby -rbundler -S irb`), gem activation might end up calling
|
|
|
|
# the redefined `Gem::Specification#source` and triggering the `Gem::Source`
|
|
|
|
# autoload. That would result in requiring "rubygems/source" inside another
|
|
|
|
# require, which would trigger a monitor error and cause the `autoload` to
|
|
|
|
# eventually fail. A better solution is probably to completely avoid autoloading
|
|
|
|
# `Gem::Source` from the redefined `Gem::Specification#source`.
|
|
|
|
require "rubygems/source"
|
|
|
|
|
2022-07-29 08:59:56 +03:00
|
|
|
# Cherry-pick fixes to `Gem.ruby_version` to be useful for modern Bundler
|
|
|
|
# versions and ignore patchlevels
|
|
|
|
# (https://github.com/rubygems/rubygems/pull/5472,
|
|
|
|
# https://github.com/rubygems/rubygems/pull/5486). May be removed once RubyGems
|
|
|
|
# 3.3.12 support is dropped.
|
|
|
|
unless Gem.ruby_version.to_s == RUBY_VERSION || RUBY_PATCHLEVEL == -1
|
|
|
|
Gem.instance_variable_set(:@ruby_version, Gem::Version.new(RUBY_VERSION))
|
|
|
|
end
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
module Gem
|
2024-05-13 13:04:59 +03:00
|
|
|
# Can be removed once RubyGems 3.5.11 support is dropped
|
|
|
|
unless Gem.respond_to?(:freebsd_platform?)
|
|
|
|
def self.freebsd_platform?
|
|
|
|
RbConfig::CONFIG["host_os"].to_s.include?("bsd")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-07-05 17:20:01 +03:00
|
|
|
# Can be removed once RubyGems 3.5.14 support is dropped
|
|
|
|
unless Gem.respond_to?(:open_file_with_flock)
|
|
|
|
def self.open_file_with_flock(path, &block)
|
|
|
|
flags = File.exist?(path) ? "r+" : "a+"
|
|
|
|
|
|
|
|
File.open(path, flags) do |io|
|
|
|
|
begin
|
|
|
|
io.flock(File::LOCK_EX)
|
|
|
|
rescue Errno::ENOSYS, Errno::ENOTSUP
|
|
|
|
end
|
|
|
|
yield io
|
|
|
|
rescue Errno::ENOLCK # NFS
|
|
|
|
if Thread.main != Thread.current
|
|
|
|
raise
|
|
|
|
else
|
|
|
|
File.open(path, flags, &block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-10 17:11:51 +03:00
|
|
|
require "rubygems/specification"
|
|
|
|
|
2024-05-31 22:24:53 +03:00
|
|
|
# Can be removed once RubyGems 3.5.15 support is dropped
|
|
|
|
VALIDATES_FOR_RESOLUTION = Specification.new.respond_to?(:validate_for_resolution).freeze
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
class Specification
|
2024-05-10 17:11:51 +03:00
|
|
|
require_relative "match_metadata"
|
|
|
|
require_relative "match_platform"
|
|
|
|
|
2022-08-22 05:52:51 +03:00
|
|
|
include ::Bundler::MatchMetadata
|
2022-02-28 04:32:28 +03:00
|
|
|
include ::Bundler::MatchPlatform
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
attr_accessor :remote, :location, :relative_loaded_from
|
|
|
|
|
2019-06-01 12:49:40 +03:00
|
|
|
remove_method :source
|
|
|
|
attr_writer :source
|
|
|
|
def source
|
|
|
|
(defined?(@source) && @source) || Gem::Source::Installed.new
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
alias_method :rg_full_gem_path, :full_gem_path
|
|
|
|
alias_method :rg_loaded_from, :loaded_from
|
|
|
|
|
|
|
|
def full_gem_path
|
2022-03-16 14:52:46 +03:00
|
|
|
if source.respond_to?(:root)
|
2024-05-13 16:02:43 +03:00
|
|
|
File.expand_path(File.dirname(loaded_from), source.root)
|
2018-11-03 02:07:56 +03:00
|
|
|
else
|
|
|
|
rg_full_gem_path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def loaded_from
|
|
|
|
if relative_loaded_from
|
|
|
|
source.path.join(relative_loaded_from).to_s
|
|
|
|
else
|
|
|
|
rg_loaded_from
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def load_paths
|
2019-06-01 12:49:40 +03:00
|
|
|
full_require_paths
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|
|
|
|
|
2020-05-21 15:05:07 +03:00
|
|
|
alias_method :rg_extension_dir, :extension_dir
|
|
|
|
def extension_dir
|
2023-03-24 23:00:40 +03:00
|
|
|
# following instance variable is already used in original method
|
|
|
|
# and that is the reason to prefix it with bundler_ and add rubocop exception
|
|
|
|
@bundler_extension_dir ||= if source.respond_to?(:extension_dir_name) # rubocop:disable Naming/MemoizedInstanceVariableName
|
2020-05-21 15:05:07 +03:00
|
|
|
unique_extension_dir = [source.extension_dir_name, File.basename(full_gem_path)].uniq.join("-")
|
|
|
|
File.expand_path(File.join(extensions_dir, unique_extension_dir))
|
|
|
|
else
|
|
|
|
rg_extension_dir
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-10-26 23:12:02 +03:00
|
|
|
remove_method :gem_dir
|
2018-11-03 02:07:56 +03:00
|
|
|
def gem_dir
|
|
|
|
full_gem_path
|
|
|
|
end
|
|
|
|
|
2022-04-28 11:15:43 +03:00
|
|
|
unless const_defined?(:LATEST_RUBY_WITHOUT_PATCH_VERSIONS)
|
|
|
|
LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1")
|
|
|
|
|
|
|
|
alias_method :rg_required_ruby_version=, :required_ruby_version=
|
|
|
|
def required_ruby_version=(req)
|
|
|
|
self.rg_required_ruby_version = req
|
|
|
|
|
|
|
|
@required_ruby_version.requirements.map! do |op, v|
|
|
|
|
if v >= LATEST_RUBY_WITHOUT_PATCH_VERSIONS && v.release.segments.size == 4
|
|
|
|
[op == "~>" ? "=" : op, Gem::Version.new(v.segments.tap {|s| s.delete_at(3) }.join("."))]
|
|
|
|
else
|
|
|
|
[op, v]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
def groups
|
|
|
|
@groups ||= []
|
|
|
|
end
|
|
|
|
|
|
|
|
def git_version
|
|
|
|
return unless loaded_from && source.is_a?(Bundler::Source::Git)
|
|
|
|
" #{source.revision[0..6]}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_gemfile(path = nil)
|
|
|
|
gemfile = String.new("source 'https://rubygems.org'\n")
|
|
|
|
gemfile << dependencies_to_gemfile(nondevelopment_dependencies)
|
|
|
|
unless development_dependencies.empty?
|
|
|
|
gemfile << "\n"
|
|
|
|
gemfile << dependencies_to_gemfile(development_dependencies, :development)
|
|
|
|
end
|
|
|
|
gemfile
|
|
|
|
end
|
|
|
|
|
|
|
|
def nondevelopment_dependencies
|
|
|
|
dependencies - development_dependencies
|
|
|
|
end
|
|
|
|
|
2021-10-09 14:42:05 +03:00
|
|
|
def deleted_gem?
|
|
|
|
!default_gem? && !File.directory?(full_gem_path)
|
|
|
|
end
|
|
|
|
|
2024-05-31 22:24:53 +03:00
|
|
|
unless VALIDATES_FOR_RESOLUTION
|
|
|
|
def validate_for_resolution
|
|
|
|
SpecificationPolicy.new(self).validate_for_resolution
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-10-15 07:20:25 +03:00
|
|
|
private
|
2018-11-03 02:07:56 +03:00
|
|
|
|
|
|
|
def dependencies_to_gemfile(dependencies, group = nil)
|
|
|
|
gemfile = String.new
|
|
|
|
if dependencies.any?
|
|
|
|
gemfile << "group :#{group} do\n" if group
|
|
|
|
dependencies.each do |dependency|
|
|
|
|
gemfile << " " if group
|
|
|
|
gemfile << %(gem "#{dependency.name}")
|
|
|
|
req = dependency.requirements_list.first
|
|
|
|
gemfile << %(, "#{req}") if req
|
|
|
|
gemfile << "\n"
|
|
|
|
end
|
|
|
|
gemfile << "end\n" if group
|
|
|
|
end
|
|
|
|
gemfile
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-31 22:24:53 +03:00
|
|
|
unless VALIDATES_FOR_RESOLUTION
|
|
|
|
class SpecificationPolicy
|
|
|
|
def validate_for_resolution
|
|
|
|
validate_required!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-04-23 21:15:30 +03:00
|
|
|
module BetterPermissionError
|
|
|
|
def data
|
2024-05-13 16:03:13 +03:00
|
|
|
super
|
|
|
|
rescue Errno::EACCES
|
|
|
|
raise Bundler::PermissionError.new(loaded_from, :read)
|
2024-04-23 21:15:30 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-10 17:11:51 +03:00
|
|
|
require "rubygems/stub_specification"
|
|
|
|
|
2024-04-23 21:15:30 +03:00
|
|
|
class StubSpecification
|
|
|
|
prepend BetterPermissionError
|
|
|
|
end
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
class Dependency
|
2024-05-10 17:11:51 +03:00
|
|
|
require_relative "force_platform"
|
|
|
|
|
2022-12-22 02:20:23 +03:00
|
|
|
include ::Bundler::ForcePlatform
|
|
|
|
|
2021-05-28 13:47:49 +03:00
|
|
|
attr_accessor :source, :groups
|
2018-11-03 02:07:56 +03:00
|
|
|
|
|
|
|
alias_method :eql?, :==
|
|
|
|
|
2022-07-23 12:58:53 +03:00
|
|
|
def force_ruby_platform
|
2022-12-22 02:20:23 +03:00
|
|
|
return @force_ruby_platform if defined?(@force_ruby_platform) && !@force_ruby_platform.nil?
|
|
|
|
|
|
|
|
@force_ruby_platform = default_force_ruby_platform
|
2022-07-23 12:58:53 +03:00
|
|
|
end
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
def encode_with(coder)
|
|
|
|
to_yaml_properties.each do |ivar|
|
|
|
|
coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_yaml_properties
|
2021-05-28 13:47:49 +03:00
|
|
|
instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def to_lock
|
|
|
|
out = String.new(" #{name}")
|
|
|
|
unless requirement.none?
|
|
|
|
reqs = requirement.requirements.map {|o, v| "#{o} #{v}" }.sort.reverse
|
|
|
|
out << " (#{reqs.join(", ")})"
|
|
|
|
end
|
|
|
|
out
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-12-12 22:49:25 +03:00
|
|
|
# Requirements using lambda operator differentiate trailing zeros since rubygems 3.2.6
|
2021-02-01 18:17:16 +03:00
|
|
|
if Gem::Requirement.new("~> 2.0").hash == Gem::Requirement.new("~> 2.0.0").hash
|
|
|
|
class Requirement
|
|
|
|
module CorrectHashForLambdaOperator
|
|
|
|
def hash
|
|
|
|
if requirements.any? {|r| r.first == "~>" }
|
|
|
|
requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
|
|
|
|
else
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CorrectHashForLambdaOperator
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-07-13 14:58:08 +03:00
|
|
|
require "rubygems/platform"
|
|
|
|
|
2018-11-03 02:07:56 +03:00
|
|
|
class Platform
|
2022-07-13 06:56:36 +03:00
|
|
|
JAVA = Gem::Platform.new("java")
|
|
|
|
MSWIN = Gem::Platform.new("mswin32")
|
|
|
|
MSWIN64 = Gem::Platform.new("mswin64")
|
|
|
|
MINGW = Gem::Platform.new("x86-mingw32")
|
|
|
|
X64_MINGW = [Gem::Platform.new("x64-mingw32"),
|
|
|
|
Gem::Platform.new("x64-mingw-ucrt")].freeze
|
2022-08-28 16:40:02 +03:00
|
|
|
WINDOWS = [MSWIN, MSWIN64, MINGW, X64_MINGW].flatten.freeze
|
[rubygems/rubygems] Fix resolution hanging on musl platforms
After recent musl support was added, Bundler started hanging in musl
platforms. I identified the issue where valid candidates were being
filtered out because their platform was specified as a string, and thus
`Gem::Platform.match_spec?` which under the hood ends up calling
`Gem::Platform#===` would return `nil`, because it does not support
comparing platforms to strings.
In particular, `Bundler::EndpointSpecification`'s platform coming from
the API was not instantiated as a `Gem::Platform`, hence the issue.
Also, this spec surfaced another issue where a bug corrected in
`Gem::Platform#match_platforms` had not been yet backported to Bundler.
So this commit also backports that to get the spec green across RubyGems
versions.
Finally, the fix in `Bundler::EndpointSpecification` made a realworld
spec start failing. This spec was faking out `rails-4.2.7.1` requirement
on Bundler in the `Gemfile.lock` file to be `>= 1.17, < 3` when the real
requirement is `>= 1.17, < 2`. Due to the bug in
`Bundler::EndpointSpecification`, the real requirement provided by the
compact index API (recorded with VCR) was being ignored, and the
`Gemfile.lock` fake requirement was being used, which made the spec
pass. This is all expected, and to fix the issue I changed the spec to
be really realworld and don't fake any Bundler requirements.
https://github.com/rubygems/rubygems/commit/faf4ef46bc
2022-05-09 11:40:23 +03:00
|
|
|
X64_LINUX = Gem::Platform.new("x86_64-linux")
|
|
|
|
X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl")
|
2022-08-04 14:03:29 +03:00
|
|
|
|
[rubygems/rubygems] Fix resolution hanging on musl platforms
After recent musl support was added, Bundler started hanging in musl
platforms. I identified the issue where valid candidates were being
filtered out because their platform was specified as a string, and thus
`Gem::Platform.match_spec?` which under the hood ends up calling
`Gem::Platform#===` would return `nil`, because it does not support
comparing platforms to strings.
In particular, `Bundler::EndpointSpecification`'s platform coming from
the API was not instantiated as a `Gem::Platform`, hence the issue.
Also, this spec surfaced another issue where a bug corrected in
`Gem::Platform#match_platforms` had not been yet backported to Bundler.
So this commit also backports that to get the spec green across RubyGems
versions.
Finally, the fix in `Bundler::EndpointSpecification` made a realworld
spec start failing. This spec was faking out `rails-4.2.7.1` requirement
on Bundler in the `Gemfile.lock` file to be `>= 1.17, < 3` when the real
requirement is `>= 1.17, < 2`. Due to the bug in
`Bundler::EndpointSpecification`, the real requirement provided by the
compact index API (recorded with VCR) was being ignored, and the
`Gemfile.lock` fake requirement was being used, which made the spec
pass. This is all expected, and to fix the issue I changed the spec to
be really realworld and don't fake any Bundler requirements.
https://github.com/rubygems/rubygems/commit/faf4ef46bc
2022-05-09 11:40:23 +03:00
|
|
|
if X64_LINUX === X64_LINUX_MUSL
|
2022-08-04 14:03:29 +03:00
|
|
|
remove_method :===
|
|
|
|
|
|
|
|
def ===(other)
|
|
|
|
return nil unless Gem::Platform === other
|
|
|
|
|
|
|
|
# universal-mingw32 matches x64-mingw-ucrt
|
|
|
|
return true if (@cpu == "universal" || other.cpu == "universal") &&
|
|
|
|
@os.start_with?("mingw") && other.os.start_with?("mingw")
|
|
|
|
|
|
|
|
# cpu
|
|
|
|
([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
|
2024-07-03 21:19:25 +03:00
|
|
|
(@cpu == "arm" && other.cpu.start_with?("armv"))) &&
|
2022-08-04 14:03:29 +03:00
|
|
|
|
|
|
|
# os
|
|
|
|
@os == other.os &&
|
|
|
|
|
|
|
|
# version
|
|
|
|
(
|
|
|
|
(@os != "linux" && (@version.nil? || other.version.nil?)) ||
|
2022-09-29 21:31:23 +03:00
|
|
|
(@os == "linux" && (normalized_linux_version_ext == other.normalized_linux_version_ext || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
|
2022-08-04 14:03:29 +03:00
|
|
|
@version == other.version
|
|
|
|
)
|
|
|
|
end
|
2022-09-28 11:57:54 +03:00
|
|
|
|
|
|
|
# This is a copy of RubyGems 3.3.23 or higher `normalized_linux_method`.
|
|
|
|
# Once only 3.3.23 is supported, we can use the method in RubyGems.
|
|
|
|
def normalized_linux_version_ext
|
|
|
|
return nil unless @version
|
|
|
|
|
2022-09-29 21:31:23 +03:00
|
|
|
without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
|
2022-09-28 13:12:13 +03:00
|
|
|
return nil if without_gnu_nor_abi_modifiers.empty?
|
2022-09-28 11:57:54 +03:00
|
|
|
|
2022-09-28 13:12:13 +03:00
|
|
|
without_gnu_nor_abi_modifiers
|
2022-09-28 11:57:54 +03:00
|
|
|
end
|
2022-08-04 14:03:29 +03:00
|
|
|
end
|
2022-12-22 02:20:23 +03:00
|
|
|
|
|
|
|
if RUBY_ENGINE == "truffleruby" && !defined?(REUSE_AS_BINARY_ON_TRUFFLERUBY)
|
|
|
|
REUSE_AS_BINARY_ON_TRUFFLERUBY = %w[libv8 libv8-node sorbet-static].freeze
|
|
|
|
end
|
2022-07-26 07:43:48 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
Platform.singleton_class.module_eval do
|
|
|
|
unless Platform.singleton_methods.include?(:match_spec?)
|
|
|
|
def match_spec?(spec)
|
|
|
|
match_gem?(spec.platform, spec.name)
|
|
|
|
end
|
|
|
|
|
|
|
|
def match_gem?(platform, gem_name)
|
|
|
|
match_platforms?(platform, Gem.platforms)
|
|
|
|
end
|
[rubygems/rubygems] Fix resolution hanging on musl platforms
After recent musl support was added, Bundler started hanging in musl
platforms. I identified the issue where valid candidates were being
filtered out because their platform was specified as a string, and thus
`Gem::Platform.match_spec?` which under the hood ends up calling
`Gem::Platform#===` would return `nil`, because it does not support
comparing platforms to strings.
In particular, `Bundler::EndpointSpecification`'s platform coming from
the API was not instantiated as a `Gem::Platform`, hence the issue.
Also, this spec surfaced another issue where a bug corrected in
`Gem::Platform#match_platforms` had not been yet backported to Bundler.
So this commit also backports that to get the spec green across RubyGems
versions.
Finally, the fix in `Bundler::EndpointSpecification` made a realworld
spec start failing. This spec was faking out `rails-4.2.7.1` requirement
on Bundler in the `Gemfile.lock` file to be `>= 1.17, < 3` when the real
requirement is `>= 1.17, < 2`. Due to the bug in
`Bundler::EndpointSpecification`, the real requirement provided by the
compact index API (recorded with VCR) was being ignored, and the
`Gemfile.lock` fake requirement was being used, which made the spec
pass. This is all expected, and to fix the issue I changed the spec to
be really realworld and don't fake any Bundler requirements.
https://github.com/rubygems/rubygems/commit/faf4ef46bc
2022-05-09 11:40:23 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
match_platforms_defined = Gem::Platform.respond_to?(:match_platforms?, true)
|
|
|
|
|
|
|
|
if !match_platforms_defined || Gem::Platform.send(:match_platforms?, Gem::Platform::X64_LINUX_MUSL, [Gem::Platform::X64_LINUX])
|
2022-07-26 07:43:48 +03:00
|
|
|
|
|
|
|
private
|
2022-07-13 06:56:36 +03:00
|
|
|
|
[rubygems/rubygems] Fix resolution hanging on musl platforms
After recent musl support was added, Bundler started hanging in musl
platforms. I identified the issue where valid candidates were being
filtered out because their platform was specified as a string, and thus
`Gem::Platform.match_spec?` which under the hood ends up calling
`Gem::Platform#===` would return `nil`, because it does not support
comparing platforms to strings.
In particular, `Bundler::EndpointSpecification`'s platform coming from
the API was not instantiated as a `Gem::Platform`, hence the issue.
Also, this spec surfaced another issue where a bug corrected in
`Gem::Platform#match_platforms` had not been yet backported to Bundler.
So this commit also backports that to get the spec green across RubyGems
versions.
Finally, the fix in `Bundler::EndpointSpecification` made a realworld
spec start failing. This spec was faking out `rails-4.2.7.1` requirement
on Bundler in the `Gemfile.lock` file to be `>= 1.17, < 3` when the real
requirement is `>= 1.17, < 2`. Due to the bug in
`Bundler::EndpointSpecification`, the real requirement provided by the
compact index API (recorded with VCR) was being ignored, and the
`Gemfile.lock` fake requirement was being used, which made the spec
pass. This is all expected, and to fix the issue I changed the spec to
be really realworld and don't fake any Bundler requirements.
https://github.com/rubygems/rubygems/commit/faf4ef46bc
2022-05-09 11:40:23 +03:00
|
|
|
remove_method :match_platforms? if match_platforms_defined
|
|
|
|
|
2022-07-26 07:43:48 +03:00
|
|
|
def match_platforms?(platform, platforms)
|
|
|
|
platforms.any? do |local_platform|
|
|
|
|
platform.nil? ||
|
|
|
|
local_platform == platform ||
|
[rubygems/rubygems] Fix resolution hanging on musl platforms
After recent musl support was added, Bundler started hanging in musl
platforms. I identified the issue where valid candidates were being
filtered out because their platform was specified as a string, and thus
`Gem::Platform.match_spec?` which under the hood ends up calling
`Gem::Platform#===` would return `nil`, because it does not support
comparing platforms to strings.
In particular, `Bundler::EndpointSpecification`'s platform coming from
the API was not instantiated as a `Gem::Platform`, hence the issue.
Also, this spec surfaced another issue where a bug corrected in
`Gem::Platform#match_platforms` had not been yet backported to Bundler.
So this commit also backports that to get the spec green across RubyGems
versions.
Finally, the fix in `Bundler::EndpointSpecification` made a realworld
spec start failing. This spec was faking out `rails-4.2.7.1` requirement
on Bundler in the `Gemfile.lock` file to be `>= 1.17, < 3` when the real
requirement is `>= 1.17, < 2`. Due to the bug in
`Bundler::EndpointSpecification`, the real requirement provided by the
compact index API (recorded with VCR) was being ignored, and the
`Gemfile.lock` fake requirement was being used, which made the spec
pass. This is all expected, and to fix the issue I changed the spec to
be really realworld and don't fake any Bundler requirements.
https://github.com/rubygems/rubygems/commit/faf4ef46bc
2022-05-09 11:40:23 +03:00
|
|
|
(local_platform != Gem::Platform::RUBY && platform =~ local_platform)
|
2022-07-26 07:43:48 +03:00
|
|
|
end
|
|
|
|
end
|
2021-07-13 14:58:08 +03:00
|
|
|
end
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|
2020-10-15 07:20:25 +03:00
|
|
|
|
2022-10-12 16:08:35 +03:00
|
|
|
# On universal Rubies, resolve the "universal" arch to the real CPU arch, without changing the extension directory.
|
2023-11-01 06:58:31 +03:00
|
|
|
class BasicSpecification
|
2024-02-08 07:51:40 +03:00
|
|
|
if /^universal\.(?<arch>.*?)-/ =~ (CROSS_COMPILING || RUBY_PLATFORM)
|
2022-10-12 16:08:35 +03:00
|
|
|
local_platform = Platform.local
|
|
|
|
if local_platform.cpu == "universal"
|
|
|
|
ORIGINAL_LOCAL_PLATFORM = local_platform.to_s.freeze
|
|
|
|
|
|
|
|
local_platform.cpu = if arch == "arm64e" # arm64e is only permitted for Apple system binaries
|
|
|
|
"arm64"
|
|
|
|
else
|
|
|
|
arch
|
|
|
|
end
|
|
|
|
|
|
|
|
def extensions_dir
|
2022-12-30 15:34:16 +03:00
|
|
|
@extensions_dir ||=
|
|
|
|
Gem.default_ext_dir_for(base_dir) || File.join(base_dir, "extensions", ORIGINAL_LOCAL_PLATFORM, Gem.extension_api_version)
|
2022-10-12 16:08:35 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-09-02 01:15:49 +03:00
|
|
|
require "rubygems/name_tuple"
|
|
|
|
|
|
|
|
class NameTuple
|
2023-12-08 23:13:49 +03:00
|
|
|
# Versions of RubyGems before about 3.5.0 don't to_s the platform.
|
|
|
|
unless Gem::NameTuple.new("a", Gem::Version.new("1"), Gem::Platform.new("x86_64-linux")).platform.is_a?(String)
|
|
|
|
alias_method :initialize_with_platform, :initialize
|
|
|
|
|
|
|
|
def initialize(name, version, platform=Gem::Platform::RUBY)
|
|
|
|
if Gem::Platform === platform
|
|
|
|
initialize_with_platform(name, version, platform.to_s)
|
|
|
|
else
|
|
|
|
initialize_with_platform(name, version, platform)
|
|
|
|
end
|
2023-09-02 01:15:49 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def lock_name
|
2023-12-08 07:18:09 +03:00
|
|
|
if platform == Gem::Platform::RUBY
|
|
|
|
"#{name} (#{version})"
|
|
|
|
else
|
|
|
|
"#{name} (#{version}-#{platform})"
|
|
|
|
end
|
2023-09-02 01:15:49 +03:00
|
|
|
end
|
|
|
|
end
|
2018-11-03 02:07:56 +03:00
|
|
|
end
|