Compare commits
8 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4048f893da | ||
|
|
487c4a5aea | ||
|
|
c4f29640fb | ||
|
|
326061cec0 | ||
|
|
0011494aa4 | ||
|
|
c3d060db68 | ||
|
|
86c35ad5cf | ||
|
|
6eb6060e48 |
37 changed files with 2638 additions and 2194 deletions
|
|
@ -1 +0,0 @@
|
|||
1
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,6 +1,3 @@
|
|||
/*/
|
||||
/ruby-*.tar.xz
|
||||
/rexml-*.gem
|
||||
/*.rpm
|
||||
|
||||
!/plans/
|
||||
|
|
|
|||
|
|
@ -2,55 +2,14 @@
|
|||
%gem_dir %{_datadir}/gems
|
||||
%gem_archdir %{_libdir}/gems
|
||||
|
||||
# %gem_prerelease - Provides prerelease string if available.
|
||||
#
|
||||
# Usage: %gem_prerelease [custom_gem_name]
|
||||
#
|
||||
# If avilable, prints prerelease string, which is a %prerelease macro by
|
||||
# default. When [custom_gem_name] is provided, the custom_gem_name is used to
|
||||
# derive %custom_gem_name_prerelease macro, which can be predefined.
|
||||
#
|
||||
# Please note that for the prerelease macros are the dashes in
|
||||
# [custom_gem_name] replaced by underscores.
|
||||
#
|
||||
%gem_prerelease() %{?1:%{expand:%%{?%{gsub %{1} - _}_prerelease}}}%{!?1:%{?prerelease}}
|
||||
|
||||
# %gem_version - Provides version string (including prerelease if available).
|
||||
#
|
||||
# Usage: %gem_version [custom_gem_name]
|
||||
#
|
||||
# Prints version (including prerelease string), that is %version macro by
|
||||
# default. When [custom_gem_name] is provided, the custom_gem_name is used to
|
||||
# derive %custom_gem_name_version macro which needs to be predefined.
|
||||
#
|
||||
# Please note that for the version macros are the dashes in [custom_gem_name]
|
||||
# replaced by underscores.
|
||||
#
|
||||
%gem_version() %{?1:%{expand:%{%{gsub %{1} - _}_version}}}%{!?1:%{version}}%{gem_prerelease %{?1}}
|
||||
|
||||
# %gem_name_version - Provides gem_name-version string.
|
||||
#
|
||||
# Usage: %gem_name_version [custom_gem_name]
|
||||
#
|
||||
# Prints gem_name-version string, by default joining %gem_name, %version and
|
||||
# %prerelease macros. When [custom_gem_name] is provided, the
|
||||
# custom_gem_name is joined with version as provided by %gem_version macro.
|
||||
#
|
||||
%gem_name_version() %{?1}%{!?1:%{gem_name}}-%{gem_version %{?1}}
|
||||
|
||||
# Common gem locations and files.
|
||||
#
|
||||
# These macros leverages %gem_name_version macro and accepts custom gem_name.
|
||||
#
|
||||
# -d Use default gem install location.
|
||||
#
|
||||
%gem_instdir() %{gem_dir}/gems/%{gem_name_version %{?1}}
|
||||
%gem_extdir_mri() %{gem_archdir}/%{name}/%{gem_name_version %{?1}}
|
||||
%gem_libdir() %{gem_instdir %{?1}}/lib
|
||||
%gem_cache() %{gem_dir}/cache/%{gem_name_version %{?1}}.gem
|
||||
%gem_spec(d) %{gem_dir}/specifications%{?-d:/default}/%{gem_name_version %{?1}}.gemspec
|
||||
%gem_docdir() %{gem_dir}/doc/%{gem_name_version %{?1}}
|
||||
%gem_plugin() %{gem_dir}/plugins/%{?1}%{!?1:%{gem_name}}_plugin.rb
|
||||
%gem_instdir %{gem_dir}/gems/%{gem_name}-%{version}%{?prerelease}
|
||||
%gem_extdir_mri %{gem_archdir}/%{name}/%{gem_name}-%{version}%{?prerelease}
|
||||
%gem_libdir %{gem_instdir}/lib
|
||||
%gem_cache %{gem_dir}/cache/%{gem_name}-%{version}%{?prerelease}.gem
|
||||
%gem_spec %{gem_dir}/specifications/%{gem_name}-%{version}%{?prerelease}.gemspec
|
||||
%gem_docdir %{gem_dir}/doc/%{gem_name}-%{version}%{?prerelease}
|
||||
%gem_plugin %{gem_dir}/plugins/%{gem_name}_plugin.rb
|
||||
|
||||
|
||||
# %gem_install - Install gem into appropriate directory.
|
||||
|
|
|
|||
|
|
@ -87,51 +87,41 @@ module Gem
|
|||
# Remove methods we are going to override. This avoids "method redefined;"
|
||||
# warnings otherwise issued by Ruby.
|
||||
|
||||
remove_method :operating_system_defaults if method_defined? :operating_system_defaults
|
||||
remove_method :default_dir if method_defined? :default_dir
|
||||
remove_method :default_specifications_dir if method_defined? :default_specifications_dir
|
||||
remove_method :default_path if method_defined? :default_path
|
||||
remove_method :default_bindir if method_defined? :default_bindir
|
||||
remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
|
||||
|
||||
##
|
||||
# Regular user installs into user directory, root manages /usr/local.
|
||||
|
||||
def operating_system_defaults
|
||||
unless opt_build_root?
|
||||
options = if Process.uid == 0
|
||||
"--install-dir=#{Gem.default_dirs[:local][:gem_dir]} --bindir #{Gem.default_dirs[:local][:bin_dir]}"
|
||||
else
|
||||
"--user-install --bindir #{File.join [Dir.home, 'bin']}"
|
||||
end
|
||||
|
||||
{"gem" => options}
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# RubyGems default overrides.
|
||||
|
||||
def default_dir
|
||||
if opt_build_root?
|
||||
Gem.default_dirs[:system][:gem_dir]
|
||||
elsif Process.uid == 0
|
||||
Gem.default_dirs[:local][:gem_dir]
|
||||
else
|
||||
Gem.user_dir
|
||||
end
|
||||
Gem.default_dirs[:system][:gem_dir]
|
||||
end
|
||||
|
||||
##
|
||||
# Path to specification files of default gems.
|
||||
|
||||
def default_specifications_dir
|
||||
@default_specifications_dir ||= File.join(Gem.default_dirs[:system][:gem_dir], "specifications", "default")
|
||||
end
|
||||
|
||||
##
|
||||
# Default gem load path
|
||||
|
||||
def default_path
|
||||
path = default_dirs.collect {|location, paths| paths[:gem_dir]}
|
||||
path.unshift Gem.user_dir if File.exist? Gem.user_home
|
||||
path
|
||||
end
|
||||
|
||||
def default_bindir
|
||||
if opt_build_root?
|
||||
Gem.default_dirs[:system][:bin_dir]
|
||||
elsif Process.uid == 0
|
||||
Gem.default_dirs[:local][:bin_dir]
|
||||
else
|
||||
File.join [Dir.home, 'bin']
|
||||
end
|
||||
end
|
||||
|
||||
def default_ext_dir_for base_dir
|
||||
dir = if rpmbuild?
|
||||
build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
summary: Test plan with all Fedora tests
|
||||
discover:
|
||||
how: fmf
|
||||
url: https://src.fedoraproject.org/tests/ruby.git
|
||||
execute:
|
||||
how: tmt
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From 994ee4c17fb8c217ab0335df55620c6bdb5d5cbe Mon Sep 17 00:00:00 2001
|
||||
From: tompng <tomoyapenguin@gmail.com>
|
||||
Date: Fri, 26 Dec 2025 04:57:12 +0900
|
||||
Subject: [PATCH] Fix comment_location for merged ClassModule
|
||||
|
||||
---
|
||||
lib/rdoc/code_object/class_module.rb | 7 ++++++-
|
||||
test/rdoc/code_object/class_module_test.rb | 6 ++++++
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rdoc/code_object/class_module.rb b/lib/rdoc/code_object/class_module.rb
|
||||
index b6bed352a2..d7ee36f950 100644
|
||||
--- a/lib/rdoc/code_object/class_module.rb
|
||||
+++ b/lib/rdoc/code_object/class_module.rb
|
||||
@@ -477,7 +477,12 @@ def merge(class_module)
|
||||
document = document.merge other_document
|
||||
|
||||
@comment = RDoc::Comment.from_document(document)
|
||||
- @comment_location = document
|
||||
+
|
||||
+ @comment_location = if document.parts.first.is_a?(RDoc::Markup::Document)
|
||||
+ document.parts.map { |doc| [doc, doc.file] }
|
||||
+ else
|
||||
+ [[document, document.file]]
|
||||
+ end
|
||||
end
|
||||
|
||||
cm = class_module
|
||||
|
|
@ -1,166 +0,0 @@
|
|||
require 'tmpdir'
|
||||
require 'tempfile'
|
||||
require 'fileutils'
|
||||
# Available in Ruby upstream sources under tool/lib/envutil.rb
|
||||
# Required for finding and setting up the built ruby binary.
|
||||
require 'envutil'
|
||||
|
||||
module RPMTestHelper
|
||||
def setup
|
||||
@tmpdir = Dir.mktmpdir
|
||||
@tempfiles = []
|
||||
end
|
||||
|
||||
def teardown
|
||||
@tempfiles.each do |file|
|
||||
file.close
|
||||
file.unlink
|
||||
end
|
||||
|
||||
FileUtils.rmtree(@tmpdir)
|
||||
end
|
||||
|
||||
GENERATOR_SCRIPT = ENV['GENERATOR_SCRIPT'].clone.freeze
|
||||
if GENERATOR_SCRIPT.nil? || GENERATOR_SCRIPT == ''
|
||||
raise "GENERATOR_SCRIPT is not specified." \
|
||||
"Specify the ENV variable with absolute path to the generator."
|
||||
end
|
||||
|
||||
Dependency = Struct.new('Dependency', :name, :requirements) do
|
||||
def to_rpm_str
|
||||
"rubygem(#{self.name})"
|
||||
end
|
||||
end
|
||||
|
||||
def make_gemspec(gem_info)
|
||||
file = Tempfile.new('req_gemspec', @tmpdir)
|
||||
# Fake gemspec with enough to pass most checks
|
||||
# Rubygems uses to validate the format.
|
||||
gemspec_contents = <<~EOF
|
||||
# -*- encoding: utf-8 -*-
|
||||
# stub: #{gem_info.name} #{gem_info.version} ruby lib
|
||||
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "#{gem_info.name}".freeze
|
||||
s.version = "#{gem_info.version}"
|
||||
|
||||
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
||||
s.require_paths = ["lib".freeze]
|
||||
s.authors = ["John Doe".freeze]
|
||||
s.bindir = "bin".freeze
|
||||
s.date = "2023-12-15"
|
||||
s.description = "Fake gemspec helper for testing Rubygem Generators".freeze
|
||||
s.email = ["example@example.com".freeze]
|
||||
s.files = ["LICENSE.txt".freeze, "lib/#{gem_info.name}.rb".freeze, "#{gem_info.name}.gemspec".freeze]
|
||||
s.homepage = "https://pkgs.fedoraproject.org/rpms/ruby".freeze
|
||||
s.licenses = ["MIT".freeze]
|
||||
s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
|
||||
s.rubygems_version = "3.3.5".freeze
|
||||
s.summary = "Fake gemspec for testing Rubygem Generators".freeze
|
||||
|
||||
if s.respond_to? :specification_version then
|
||||
s.specification_version = 4
|
||||
end
|
||||
|
||||
if s.respond_to? :add_runtime_dependency then
|
||||
#{gem_info.gemspec_runtime_dep_str}
|
||||
else
|
||||
#{gem_info.gemspec_dep_str}
|
||||
end
|
||||
end
|
||||
EOF
|
||||
|
||||
file.write gemspec_contents
|
||||
file.rewind
|
||||
@tempfiles << file
|
||||
file
|
||||
end
|
||||
|
||||
# Caller is expected to close subprocess stdin via #close_write
|
||||
# in order to let subprocess proceed if the process is reading
|
||||
# from STDIN in a loop.
|
||||
def rb_subprocess(*args)
|
||||
args = [GENERATOR_SCRIPT] if args.empty?
|
||||
ruby = EnvUtil.rubybin
|
||||
f = IO.popen([ruby] + args, 'r+') #, external_encoding: external_encoding)
|
||||
yield(f)
|
||||
ensure
|
||||
f.close unless !f || f.closed?
|
||||
end
|
||||
|
||||
def run_generator_single_file(gem_info)
|
||||
lines = []
|
||||
gemspec_f = make_gemspec(gem_info)
|
||||
|
||||
rb_subprocess do |io|
|
||||
io.write gemspec_f.path
|
||||
io.close_write
|
||||
lines = io.readlines
|
||||
end
|
||||
|
||||
lines
|
||||
end
|
||||
|
||||
def helper_rubygems_dependency
|
||||
"ruby(rubygems)"
|
||||
end
|
||||
|
||||
class GemInfo
|
||||
attr_accessor :name, :version, :dependencies
|
||||
|
||||
def initialize(name: 'foo', version: '1.2.3', dependencies: [])
|
||||
@name = name
|
||||
@version = version
|
||||
@dependencies = dependencies
|
||||
end
|
||||
|
||||
def dependencies=(other)
|
||||
raise ArgumentError, "#{self.class.name}##{__method__.to_s}: Expected array of `Dependency' elements" \
|
||||
unless other.is_a?(Array) && other.all? { |elem| elem.respond_to?(:name) && elem.respond_to?(:requirements) }
|
||||
|
||||
@dependencies = other
|
||||
end
|
||||
|
||||
def to_rpm_str
|
||||
"rubygem(#{self.name})"
|
||||
end
|
||||
|
||||
def gemspec_dep_str
|
||||
return '' if self.dependencies.nil? || self.dependencies.empty?
|
||||
@dependencies.inject("") do |memo, dep|
|
||||
memo += if dep.requirements && !dep.requirements.empty?
|
||||
%Q|s.add_dependency(%q<#{dep.name}>.freeze, #{handle_dep_requirements(dep.requirements)})|
|
||||
else
|
||||
%Q|s.add_dependency(%q<#{dep.name}>.freeze)|
|
||||
end
|
||||
|
||||
memo += "\n"
|
||||
end
|
||||
end
|
||||
|
||||
def gemspec_runtime_dep_str
|
||||
return '' if self.dependencies.nil? || self.dependencies.empty?
|
||||
|
||||
@dependencies.inject("") do |memo, dep|
|
||||
memo += if dep.requirements && !dep.requirements.empty?
|
||||
%Q|s.add_runtime_dependency(%q<#{dep.name}>.freeze, #{handle_dep_requirements(dep.requirements)})|
|
||||
else
|
||||
%Q|s.add_runtime_dependency(%q<#{dep.name}>.freeze)|
|
||||
end
|
||||
|
||||
memo += "\n"
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def handle_dep_requirements(reqs)
|
||||
raise ArgumentError, "#{self.class.name}##{__method__.to_s}: Reqs must be an array." \
|
||||
unless reqs.is_a? Array
|
||||
raise ArgumentError, "#{self.class.name}##{__method__.to_s}: Reqs must not be empty for this method." \
|
||||
if reqs.empty?
|
||||
|
||||
'[ "' + reqs.join('", "') + '" ]'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
From e1293f665128b0d9c5bfa0b5beeab4afebf07e6a Mon Sep 17 00:00:00 2001
|
||||
From 07c666ba5c3360dd6f43605a8ac7c85c99c1721f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 1 Oct 2013 12:22:40 +0200
|
||||
Subject: [PATCH] Allow to configure libruby.so placement.
|
||||
|
|
@ -8,10 +8,10 @@ Subject: [PATCH] Allow to configure libruby.so placement.
|
|||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index a64358fada..b3bdfad1eb 100644
|
||||
index d261ea57b5..3c13076b82 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3556,6 +3556,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
@@ -3381,6 +3381,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
])
|
||||
|
||||
archlibdir='${libdir}/${arch}'
|
||||
|
|
@ -23,3 +23,6 @@ index a64358fada..b3bdfad1eb 100644
|
|||
sitearchlibdir='${libdir}/${sitearch}'
|
||||
archincludedir='${includedir}/${arch}'
|
||||
sitearchincludedir='${includedir}/${sitearch}'
|
||||
--
|
||||
2.22.0
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
From 6062f4976c5b51f8b952b9f6745175be7b1c5ff9 Mon Sep 17 00:00:00 2001
|
||||
From e24d97c938c481450ed80ec83e5399595946c1ae Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 8 Feb 2013 22:48:41 +0100
|
||||
Subject: [PATCH] Prevent duplicated paths when empty version string is
|
||||
|
|
@ -11,10 +11,10 @@ Subject: [PATCH] Prevent duplicated paths when empty version string is
|
|||
3 files changed, 15 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 2bc5153141..a64358fada 100644
|
||||
index c42436c23d..d261ea57b5 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4472,7 +4472,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
@@ -4039,7 +4039,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
|
||||
if test -z "${ruby_version_dir_name}"; then
|
||||
|
|
@ -25,7 +25,7 @@ index 2bc5153141..a64358fada 100644
|
|||
|
||||
rubylibdir='${rubylibprefix}'${ruby_version_dir}
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index b8969e6998..bbfd4daa78 100644
|
||||
index 9160031..0d4d953 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -65,21 +65,33 @@ const char ruby_initial_load_paths[] =
|
||||
|
|
@ -63,10 +63,10 @@ index b8969e6998..bbfd4daa78 100644
|
|||
|
||||
RUBY_LIB "\0"
|
||||
diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
|
||||
index db74115730..2b01796abf 100755
|
||||
index 07076d4..35e6c3c 100755
|
||||
--- a/tool/mkconfig.rb
|
||||
+++ b/tool/mkconfig.rb
|
||||
@@ -114,7 +114,7 @@
|
||||
@@ -115,7 +115,7 @@
|
||||
val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
|
||||
case name
|
||||
when /^prefix$/
|
||||
|
|
@ -75,3 +75,6 @@ index db74115730..2b01796abf 100755
|
|||
when /^ARCH_FLAG$/
|
||||
val = "arch_flag || #{val}" if universal
|
||||
when /^UNIVERSAL_ARCHNAMES$/
|
||||
--
|
||||
1.9.0
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
From 9e70f6e4b8771965a30ecfb6d1c6015df350ca55 Mon Sep 17 00:00:00 2001
|
||||
From 2089cab72b38d6d5e7ba2b596e41014209acad30 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 19 Nov 2012 14:37:28 +0100
|
||||
Subject: [PATCH] Always use i386.
|
||||
|
|
@ -8,10 +8,10 @@ Subject: [PATCH] Always use i386.
|
|||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index b3bdfad1eb..411322a27f 100644
|
||||
index 3c13076b82..93af30321d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4536,6 +4536,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
@@ -4103,6 +4103,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
|
||||
|
|
@ -20,3 +20,6 @@ index b3bdfad1eb..411322a27f 100644
|
|||
AS_IF([test "${universal_binary-no}" = yes ], [
|
||||
arch="universal-${target_os}"
|
||||
AS_IF([test "${rb_cv_architecture_available}" = yes], [
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
From c7952996ac9738a14bea0a1a971fea13460a6c94 Mon Sep 17 00:00:00 2001
|
||||
From 94da59aafacc6a9efe829529eb51385588d6f149 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 11 Nov 2011 13:14:45 +0100
|
||||
Subject: [PATCH] Allow to install RubyGems into custom location, outside of
|
||||
|
|
@ -12,10 +12,10 @@ Subject: [PATCH] Allow to install RubyGems into custom location, outside of
|
|||
4 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 411322a27f..b5f842a512 100644
|
||||
index 93af30321d..bc13397e0e 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4508,6 +4508,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
@@ -4075,6 +4075,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
[vendorarchdir=$withval],
|
||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
|
|
@ -26,7 +26,7 @@ index 411322a27f..b5f842a512 100644
|
|||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
RUBY_EXEC_PREFIX=''
|
||||
@@ -4532,6 +4536,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
@@ -4099,6 +4104,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
AC_SUBST(vendordir)dnl
|
||||
AC_SUBST(vendorlibdir)dnl
|
||||
AC_SUBST(vendorarchdir)dnl
|
||||
|
|
@ -35,7 +35,7 @@ index 411322a27f..b5f842a512 100644
|
|||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index bbfd4daa78..69677a9297 100644
|
||||
index 623dc9d..74c5d9e 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -94,6 +94,10 @@ const char ruby_initial_load_paths[] =
|
||||
|
|
@ -50,7 +50,7 @@ index bbfd4daa78..69677a9297 100644
|
|||
#ifdef RUBY_THINARCH
|
||||
RUBY_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
diff --git a/template/verconf.h.tmpl b/template/verconf.h.tmpl
|
||||
index 9ba2bd6de5..4ec4ce9353 100644
|
||||
index 79c003e..34f2382 100644
|
||||
--- a/template/verconf.h.tmpl
|
||||
+++ b/template/verconf.h.tmpl
|
||||
@@ -36,6 +36,9 @@
|
||||
|
|
@ -64,10 +64,10 @@ index 9ba2bd6de5..4ec4ce9353 100644
|
|||
% R = {}
|
||||
% R["ruby_version"] = '"RUBY_LIB_VERSION"'
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index a9e6365b27..7117e65e82 100755
|
||||
index e9110a17ca..76a1f0a315 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -393,6 +393,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
@@ -359,6 +359,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
vendorlibdir = CONFIG["vendorlibdir"]
|
||||
vendorarchlibdir = CONFIG["vendorarchdir"]
|
||||
end
|
||||
|
|
@ -75,7 +75,7 @@ index a9e6365b27..7117e65e82 100755
|
|||
mandir = CONFIG["mandir", true]
|
||||
docdir = CONFIG["docdir", true]
|
||||
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
||||
@@ -1082,7 +1083,16 @@ def (bins = []).add(name)
|
||||
@@ -590,7 +591,16 @@ def stub
|
||||
install?(:local, :comm, :lib) do
|
||||
prepare "library scripts", rubylibdir
|
||||
noinst = %w[*.txt *.rdoc *.gemspec]
|
||||
|
|
@ -92,3 +92,6 @@ index a9e6365b27..7117e65e82 100755
|
|||
end
|
||||
|
||||
install?(:local, :comm, :hdr, :'comm-hdr') do
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
From f833e213596b0bcfad8264a555eb5093303fb5f2 Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Thu, 25 Sep 2025 12:26:39 +0200
|
||||
Subject: [PATCH] Add ruby_version_dir_name support for RDoc.
|
||||
|
||||
---
|
||||
lib/rdoc/ri/paths.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb
|
||||
index 8e89b04e..731f9e36 100644
|
||||
--- a/lib/rdoc/ri/paths.rb
|
||||
+++ b/lib/rdoc/ri/paths.rb
|
||||
@@ -10,7 +10,7 @@ module RDoc::RI::Paths
|
||||
#:stopdoc:
|
||||
require 'rbconfig'
|
||||
|
||||
- version = RbConfig::CONFIG['ruby_version']
|
||||
+ version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
BASE = File.join RbConfig::CONFIG['ridir'], version
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
From 5406ea4b4b13db747e5c1f8341bb257b4da04435 Mon Sep 17 00:00:00 2001
|
||||
From 4fc1be3af3f58621bb751c9e63c208b15c0e8d16 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:21:04 +0200
|
||||
Subject: [PATCH 1/4] Use ruby_version_dir_name for versioned directories.
|
||||
|
|
@ -12,15 +12,15 @@ ruby_version_dir_name now specifies custom version string for versioned
|
|||
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
||||
string.
|
||||
---
|
||||
configure.ac | 66 ++++++++++++++++++++++++---------------------
|
||||
configure.ac | 64 ++++++++++++++++++++++++---------------------
|
||||
template/ruby.pc.in | 1 +
|
||||
2 files changed, 36 insertions(+), 31 deletions(-)
|
||||
2 files changed, 35 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 2bbce78fd0..9d8662369c 100644
|
||||
index 80b137e380..63cd3b4f8b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4422,9 +4422,6 @@ AS_CASE(["$target_os"],
|
||||
@@ -3990,9 +3990,6 @@ AS_CASE(["$target_os"],
|
||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||
])
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ index 2bbce78fd0..9d8662369c 100644
|
|||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||
AC_ARG_WITH(rubyarchprefix,
|
||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||
@@ -4447,57 +4444,63 @@ AC_ARG_WITH(ridir,
|
||||
@@ -4015,56 +4015,62 @@ AC_ARG_WITH(ridir,
|
||||
AC_SUBST(ridir)
|
||||
AC_SUBST(RI_BASE_NAME)
|
||||
|
||||
|
|
@ -46,7 +46,6 @@ index 2bbce78fd0..9d8662369c 100644
|
|||
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
|
||||
- {
|
||||
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
- echo '@%:@include "confdefs.h"'
|
||||
- echo '#define STRINGIZE(x) x'
|
||||
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
- echo '#include "version.h"'
|
||||
|
|
@ -62,7 +61,6 @@ index 2bbce78fd0..9d8662369c 100644
|
|||
+RUBY_LIB_VERSION_STYLE='3 /* full */'
|
||||
+{
|
||||
+echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
+echo '@%:@include "confdefs.h"'
|
||||
+echo '#define STRINGIZE(x) x'
|
||||
+test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
+echo '#include "version.h"'
|
||||
|
|
@ -122,7 +120,7 @@ index 2bbce78fd0..9d8662369c 100644
|
|||
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
@@ -4514,6 +4517,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
@@ -4081,6 +4081,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
AC_SUBST(ruby_version)dnl
|
||||
|
|
@ -131,7 +129,7 @@ index 2bbce78fd0..9d8662369c 100644
|
|||
AC_SUBST(rubyarchdir)dnl
|
||||
AC_SUBST(sitedir)dnl
|
||||
diff --git a/template/ruby.pc.in b/template/ruby.pc.in
|
||||
index 6901ec2320..9b7b787208 100644
|
||||
index 8a2c066..c81b211 100644
|
||||
--- a/template/ruby.pc.in
|
||||
+++ b/template/ruby.pc.in
|
||||
@@ -2,6 +2,7 @@ MAJOR=@MAJOR@
|
||||
|
|
@ -142,21 +140,38 @@ index 6901ec2320..9b7b787208 100644
|
|||
RUBY_API_VERSION=@RUBY_API_VERSION@
|
||||
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
|
||||
arch=@arch@
|
||||
--
|
||||
2.1.0
|
||||
|
||||
From baff562149499973123d2187620201be641c6538 Mon Sep 17 00:00:00 2001
|
||||
|
||||
From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:26 +0200
|
||||
Subject: [PATCH 2/4] Add ruby_version_dir_name support for RDoc.
|
||||
|
||||
---
|
||||
tool/rbinstall.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
lib/rdoc/ri/paths.rb | 2 +-
|
||||
tool/rbinstall.rb | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb
|
||||
index 970cb91..5bf8230 100644
|
||||
--- a/lib/rdoc/ri/paths.rb
|
||||
+++ b/lib/rdoc/ri/paths.rb
|
||||
@@ -10,7 +10,7 @@ module RDoc::RI::Paths
|
||||
#:stopdoc:
|
||||
require 'rbconfig'
|
||||
|
||||
- version = RbConfig::CONFIG['ruby_version']
|
||||
+ version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
BASE = File.join RbConfig::CONFIG['ridir'], version
|
||||
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index 874c3ef1d9..a9e6365b27 100755
|
||||
index d4c110e..d39c9a6 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -1053,7 +1053,7 @@ def (bins = []).add(name)
|
||||
@@ -448,7 +448,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
|
||||
install?(:doc, :rdoc) do
|
||||
if $rdocdir
|
||||
|
|
@ -165,8 +180,11 @@ index 874c3ef1d9..a9e6365b27 100755
|
|||
prepare "rdoc", ridatadir
|
||||
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
||||
end
|
||||
--
|
||||
2.23.0
|
||||
|
||||
From 7cf872a9a34f38d71cd2ca04ac114b4ea85cc56c Mon Sep 17 00:00:00 2001
|
||||
|
||||
From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:44 +0200
|
||||
Subject: [PATCH 3/4] Add ruby_version_dir_name support for RubyGems.
|
||||
|
|
@ -177,10 +195,10 @@ Subject: [PATCH 3/4] Add ruby_version_dir_name support for RubyGems.
|
|||
2 files changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
|
||||
index 90f09fc191..f6b8a03b95 100644
|
||||
index d4ff4a262c..3f9a5bf590 100644
|
||||
--- a/lib/rubygems/defaults.rb
|
||||
+++ b/lib/rubygems/defaults.rb
|
||||
@@ -35,7 +35,7 @@ def self.default_spec_cache_dir
|
||||
@@ -34,7 +34,7 @@ def self.default_spec_cache_dir
|
||||
# specified in the environment
|
||||
|
||||
def self.default_dir
|
||||
|
|
@ -189,7 +207,7 @@ index 90f09fc191..f6b8a03b95 100644
|
|||
end
|
||||
|
||||
##
|
||||
@@ -104,7 +104,8 @@ def self.user_dir
|
||||
@@ -103,7 +103,8 @@ def self.user_dir
|
||||
gem_dir = File.join(Gem.user_home, ".gem")
|
||||
gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir)
|
||||
parts = [gem_dir, ruby_engine]
|
||||
|
|
@ -199,7 +217,7 @@ index 90f09fc191..f6b8a03b95 100644
|
|||
File.join parts
|
||||
end
|
||||
|
||||
@@ -265,7 +266,7 @@ def self.vendor_dir # :nodoc:
|
||||
@@ -234,7 +235,7 @@ def self.vendor_dir # :nodoc:
|
||||
return nil unless RbConfig::CONFIG.key? "vendordir"
|
||||
|
||||
File.join RbConfig::CONFIG["vendordir"], "gems",
|
||||
|
|
@ -209,10 +227,10 @@ index 90f09fc191..f6b8a03b95 100644
|
|||
|
||||
##
|
||||
diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
|
||||
index 74c8953904..1f3bd91d51 100644
|
||||
index b25068405d..e9fef4a311 100644
|
||||
--- a/test/rubygems/test_gem.rb
|
||||
+++ b/test/rubygems/test_gem.rb
|
||||
@@ -1339,7 +1339,8 @@ def test_self_use_paths
|
||||
@@ -1395,7 +1395,8 @@ def test_self_use_paths
|
||||
|
||||
def test_self_user_dir
|
||||
parts = [@userhome, ".gem", Gem.ruby_engine]
|
||||
|
|
@ -222,7 +240,7 @@ index 74c8953904..1f3bd91d51 100644
|
|||
|
||||
FileUtils.mkdir_p File.join(parts)
|
||||
|
||||
@@ -1415,7 +1416,7 @@ def test_self_vendor_dir
|
||||
@@ -1471,7 +1472,7 @@ def test_self_vendor_dir
|
||||
vendordir(File.join(@tempdir, "vendor")) do
|
||||
expected =
|
||||
File.join RbConfig::CONFIG["vendordir"], "gems",
|
||||
|
|
@ -231,8 +249,11 @@ index 74c8953904..1f3bd91d51 100644
|
|||
|
||||
assert_equal expected, Gem.vendor_dir
|
||||
end
|
||||
--
|
||||
2.1.0
|
||||
|
||||
From 17cb98b7b78f8bfc511feffbe061747f676055b1 Mon Sep 17 00:00:00 2001
|
||||
|
||||
From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Wed, 1 Apr 2015 14:55:37 +0200
|
||||
Subject: [PATCH 4/4] Let headers directories follow the configured version
|
||||
|
|
@ -243,10 +264,10 @@ Subject: [PATCH 4/4] Let headers directories follow the configured version
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 9d8662369c..2bc5153141 100644
|
||||
index a00f2b6776..999e2d6d5d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -151,7 +151,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||
@@ -115,7 +115,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
||||
AC_SUBST(RUBY_BASE_NAME)
|
||||
AC_SUBST(RUBYW_BASE_NAME)
|
||||
|
|
@ -255,3 +276,6 @@ index 9d8662369c..2bc5153141 100644
|
|||
|
||||
dnl checks for alternative programs
|
||||
AC_CANONICAL_BUILD
|
||||
--
|
||||
2.1.0
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
From 03b44a86b574dc0b63fd57c5f9b52b56ad3ced37 Mon Sep 17 00:00:00 2001
|
||||
From eca084e4079c77c061045df9c21b219175b05228 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 6 Jan 2020 13:56:04 +0100
|
||||
Subject: [PATCH] Initialize ABRT hook.
|
||||
|
|
@ -15,16 +15,15 @@ To keep the things simple for now, load the ABRT hook via C.
|
|||
[4]: https://github.com/ruby/ruby/pull/2735
|
||||
[5]: https://lists.fedoraproject.org/archives/list/ruby-sig@lists.fedoraproject.org/message/LH6L6YJOYQT4Y5ZNOO4SLIPTUWZ5V45Q/
|
||||
---
|
||||
abrt.c | 12 ++++++++++++
|
||||
common.mk | 1 +
|
||||
ruby.c | 4 ++++
|
||||
spec/ruby/core/kernel/require_spec.rb | 2 ++
|
||||
4 files changed, 19 insertions(+)
|
||||
abrt.c | 12 ++++++++++++
|
||||
common.mk | 3 ++-
|
||||
ruby.c | 4 ++++
|
||||
3 files changed, 18 insertions(+), 1 deletion(-)
|
||||
create mode 100644 abrt.c
|
||||
|
||||
diff --git a/abrt.c b/abrt.c
|
||||
new file mode 100644
|
||||
index 0000000000..e99cb432e6
|
||||
index 0000000000..74b0bd5c0f
|
||||
--- /dev/null
|
||||
+++ b/abrt.c
|
||||
@@ -0,0 +1,12 @@
|
||||
|
|
@ -41,22 +40,24 @@ index 0000000000..e99cb432e6
|
|||
+ );
|
||||
+}
|
||||
diff --git a/common.mk b/common.mk
|
||||
index 08fee9119a..dae7d9dc00 100644
|
||||
index b2e5b2b6d0..f39f81da5c 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -116,6 +116,7 @@ PRISM_FILES = prism/api_node.$(OBJEXT) \
|
||||
prism_init.$(OBJEXT)
|
||||
@@ -82,7 +82,8 @@ ENC_MK = enc.mk
|
||||
MAKE_ENC = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \
|
||||
RUBY="$(BOOTSTRAPRUBY)" MINIRUBY="$(BOOTSTRAPRUBY)" $(mflags)
|
||||
|
||||
COMMONOBJS = \
|
||||
+ abrt.$(OBJEXT) \
|
||||
array.$(OBJEXT) \
|
||||
-COMMONOBJS = array.$(OBJEXT) \
|
||||
+COMMONOBJS = abrt.$(OBJEXT) \
|
||||
+ array.$(OBJEXT) \
|
||||
ast.$(OBJEXT) \
|
||||
bignum.$(OBJEXT) \
|
||||
class.$(OBJEXT) \
|
||||
diff --git a/ruby.c b/ruby.c
|
||||
index b00fc1502d..32b88f7496 100644
|
||||
index 60c57d6259..1eec16f2c8 100644
|
||||
--- a/ruby.c
|
||||
+++ b/ruby.c
|
||||
@@ -1773,10 +1773,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
||||
@@ -1623,10 +1623,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
||||
|
||||
void Init_builtin_features(void);
|
||||
|
||||
|
|
@ -68,19 +69,9 @@ index b00fc1502d..32b88f7496 100644
|
|||
{
|
||||
Init_builtin_features();
|
||||
+ Init_abrt();
|
||||
rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
|
||||
}
|
||||
|
||||
void rb_call_builtin_inits(void);
|
||||
diff --git a/spec/ruby/core/kernel/require_spec.rb b/spec/ruby/core/kernel/require_spec.rb
|
||||
index 60d17242fe..a8f93b0db4 100644
|
||||
--- a/spec/ruby/core/kernel/require_spec.rb
|
||||
+++ b/spec/ruby/core/kernel/require_spec.rb
|
||||
@@ -26,6 +26,8 @@
|
||||
out = ruby_exe("puts $LOADED_FEATURES", options: '--disable-gems --disable-did-you-mean')
|
||||
features = out.lines.map { |line| File.basename(line.chomp, '.*') }
|
||||
|
||||
+ # Ignore ABRT
|
||||
+ features -= %w[abrt]
|
||||
# Ignore CRuby internals
|
||||
features -= %w[encdb transdb windows_1252 windows_31j]
|
||||
features.reject! { |feature| feature.end_with?('-fake') }
|
||||
--
|
||||
2.24.1
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
From 9b42fce32bff25e0569581f76f532b9d57865aef Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 27 Jul 2020 14:56:05 +0200
|
||||
Subject: [PATCH] Timeout the test_bug_reporter_add witout raising error.
|
||||
|
||||
While timeouting the threads might be still good idea, it does not seems
|
||||
the timeout impacts the TestBugReporter#test_bug_reporter_add result,
|
||||
because the output of the child process has been already collected
|
||||
earlier.
|
||||
|
||||
It seems that when the system is under heavy load, the thread might not
|
||||
be sheduled to finish its processing. Even finishing the child process
|
||||
might take tens of seconds and therefore the test case finish might take
|
||||
a while.
|
||||
---
|
||||
test/-ext-/bug_reporter/test_bug_reporter.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/test/-ext-/bug_reporter/test_bug_reporter.rb b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
index 628fcd0340..2c677cc8a7 100644
|
||||
--- a/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
+++ b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
@@ -22,7 +22,7 @@ def test_bug_reporter_add
|
||||
args = ["--disable-gems", "-r-test-/bug_reporter",
|
||||
"-C", tmpdir]
|
||||
stdin = "register_sample_bug_reporter(12345); Process.kill :SEGV, $$"
|
||||
- assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT")
|
||||
+ assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT", timeout_error: nil)
|
||||
ensure
|
||||
FileUtils.rm_rf(tmpdir) if tmpdir
|
||||
end
|
||||
--
|
||||
2.27.0
|
||||
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
From 0ade5611df9f981005eed32b369d1e699e520221 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Thu, 10 Feb 2022 13:26:44 +0100
|
||||
Subject: [PATCH] Don't query `RubyVM::FrozenCore` for class path.
|
||||
|
||||
The `RubyVM::FrozenCore` class path is corrupted during GC cycle and
|
||||
returns random garbage, which might result in segfault.
|
||||
|
||||
But since it is easy to detect the `RubyVM::FrozenCore`, just provide
|
||||
the class path explicitly as a workaround.
|
||||
|
||||
Other possibility would be to ignore `RubyVM::FrozenCore` simlarly as
|
||||
TracePoint API does:
|
||||
|
||||
https://github.com/ruby/ruby/blob/46f6575157d4c2f6bbd5693896e26a65037e5552/vm_trace.c#L411
|
||||
---
|
||||
vm.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/vm.c b/vm.c
|
||||
index 8ce8b279d4..3d189fa63a 100644
|
||||
--- a/vm.c
|
||||
+++ b/vm.c
|
||||
@@ -479,7 +479,15 @@ rb_dtrace_setup(rb_execution_context_t *ec, VALUE klass, ID id,
|
||||
}
|
||||
type = BUILTIN_TYPE(klass);
|
||||
if (type == T_CLASS || type == T_ICLASS || type == T_MODULE) {
|
||||
- VALUE name = rb_class_path(klass);
|
||||
+ VALUE name = Qnil;
|
||||
+ /*
|
||||
+ * Special treatment for rb_mRubyVMFrozenCore wchi is broken by GC.
|
||||
+ * https://bugs.ruby-lang.org/issues/18257
|
||||
+ */
|
||||
+ if (klass == rb_mRubyVMFrozenCore)
|
||||
+ name = rb_str_new_cstr("RubyVM::FrozenCore");
|
||||
+ else
|
||||
+ name = rb_class_path(klass);
|
||||
const char *classname, *filename;
|
||||
const char *methodname = rb_id2name(id);
|
||||
if (methodname && (filename = rb_source_location_cstr(&args->line_no)) != 0) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
From bffadcd6d46ccfccade79ce0efb60ced8eac4483 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zhu <peter@peterzhu.ca>
|
||||
Date: Thu, 6 Apr 2023 13:35:25 -0400
|
||||
Subject: [PATCH] Add guard to compaction test in WeakMap
|
||||
|
||||
Some platforms don't support compaction, so we should skip this test.
|
||||
---
|
||||
test/ruby/test_weakmap.rb | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/test/ruby/test_weakmap.rb b/test/ruby/test_weakmap.rb
|
||||
index c72e7310db101..7fc956dfae474 100644
|
||||
--- a/test/ruby/test_weakmap.rb
|
||||
+++ b/test/ruby/test_weakmap.rb
|
||||
@@ -178,6 +178,8 @@ def test_no_memory_leak
|
||||
end
|
||||
|
||||
def test_compaction_bug_19529
|
||||
+ omit "compaction is not supported on this platform" unless GC.respond_to?(:compact)
|
||||
+
|
||||
obj = Object.new
|
||||
100.times do |i|
|
||||
GC.compact
|
||||
291
ruby-3.2.0-Detect-compaction-support-during-runtime.patch
Normal file
291
ruby-3.2.0-Detect-compaction-support-during-runtime.patch
Normal file
|
|
@ -0,0 +1,291 @@
|
|||
From 4d9cc9afa47981520d991d19fd78b322f1ba9f2a Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Wed, 22 Jun 2022 01:03:49 +0200
|
||||
Subject: [PATCH] Detect compaction support during runtime.
|
||||
|
||||
The patch is created by backporting 3 commits from
|
||||
the upstream Ruby master branch in the chronological order below.
|
||||
|
||||
https://github.com/ruby/ruby/commit/52d42e702375446746164a0251e1a10bce813b78
|
||||
https://github.com/ruby/ruby/commit/79eaaf2d0b641710613f16525e4b4c439dfe854e
|
||||
https://github.com/ruby/ruby/commit/2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
||||
|
||||
== How to create this patch ==
|
||||
|
||||
Download Ruby source code.
|
||||
```
|
||||
$ git clone https://github.com/ruby/ruby.git
|
||||
$ cd ruby
|
||||
```
|
||||
|
||||
First create a commit squashed from the 3 commits above.
|
||||
Checkout the second commmit above, and create a temporary branch.
|
||||
```
|
||||
$ git checkout 79eaaf2d0b641710613f16525e4b4c439dfe854e
|
||||
$ git checkout -b wip/detect-compaction-runtime-tmp
|
||||
```
|
||||
|
||||
Cherry pick the third commit on the second commit.
|
||||
```
|
||||
$ git cherry-pick 2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
||||
```
|
||||
|
||||
Squash the last 3 commits on the branch.
|
||||
```
|
||||
$ git rebase -i 2223eb082afa6d05321b69df783d4133b9aacba6
|
||||
```
|
||||
|
||||
Then checkout Ruby 3.1.2 branch.
|
||||
Create a new branch.
|
||||
Merge the Fedora Ruby's
|
||||
ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch.
|
||||
```
|
||||
$ git checkout v3_1_2
|
||||
$ git checkout -b wip/detect-compaction-runtime
|
||||
$ patch -p1 <
|
||||
~/fed/ruby/ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch
|
||||
$ git add gc.c gc.rb test/ruby/test_gc_compact.rb
|
||||
$ git commit
|
||||
```
|
||||
|
||||
Merge the squashed one commit on the
|
||||
`wip/detect-compaction-runtime-tmp` branch
|
||||
into the `wip/detect-compaction-runtime` branch.
|
||||
```
|
||||
$ git cherry-pick <the squashed commit above>
|
||||
```
|
||||
|
||||
Fix conflicts seeing the difference by `git show <the squashed commit
|
||||
above>`
|
||||
on another terminal.
|
||||
```
|
||||
$ vi gc.c
|
||||
$ git add gc.c
|
||||
$ git commit
|
||||
```
|
||||
|
||||
== Notes for the patch ==
|
||||
|
||||
```
|
||||
+# define GC_COMPACTION_SUPPORTED (GC_CAN_COMPILE_COMPACTION && USE_MMAP_ALIGNED_ALLOC)
|
||||
```
|
||||
|
||||
We use the USE_MMAP_ALIGNED_ALLOC instead of HEAP_PAGE_ALLOC_USE_MMAP on
|
||||
the line above. Because while the Ruby on the master branch replaced the
|
||||
USE_MMAP_ALIGNED_ALLOC with HEAP_PAGE_ALLOC_USE_MMAP, Ruby 3.1.2 doesn't.
|
||||
See <https://github.com/ruby/ruby/commit/fe21b7794af0cdb7ebd502e2c0da38c68fd89839>.
|
||||
|
||||
```
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
```
|
||||
|
||||
We added the line in the case that GC_COMPACTION_SUPPORTED is true.
|
||||
Because while the Ruby on the master branch defines the
|
||||
GC.verify_compaction_references in the gc.rb in
|
||||
the case that GC_COMPACTION_SUPPORTED is true, Ruby 3.1.2
|
||||
doesn't define it in the gc.rb.
|
||||
See <https://github.com/ruby/ruby/commit/b96a3a6fd2093e1dbea5491c002da515652dd347>.
|
||||
|
||||
```
|
||||
+ OPT(GC_COMPACTION_SUPPORTED);
|
||||
```
|
||||
|
||||
We added the line to expose the C macro to Ruby level.
|
||||
In Ruby the macro existance can then be checked like so:
|
||||
```Ruby
|
||||
GC::OPTS.include?("GC_COMPACTION_SUPPORTED")
|
||||
```
|
||||
It will return `true` if the GC_COMPACTION_SUPPORTED evaluates to `true` on the
|
||||
C level, `false` otherwise.
|
||||
See <https://github.com/ruby/ruby/blob/b96a3a6fd2093e1dbea5491c002da515652dd347/gc.c#L14091>
|
||||
|
||||
== Original commit messages ==
|
||||
|
||||
This is a combination of 3 commits.
|
||||
This is the 1st commit message:
|
||||
~~~
|
||||
Rename GC_COMPACTION_SUPPORTED
|
||||
|
||||
Naming this macro GC_COMPACTION_SUPPORTED is misleading because it
|
||||
only checks whether compaction is supported at compile time.
|
||||
|
||||
[Bug #18829]
|
||||
~~~
|
||||
|
||||
This is the commit message #2:
|
||||
~~~
|
||||
Include runtime checks for compaction support
|
||||
|
||||
Commit 0c36ba53192c5a0d245c9b626e4346a32d7d144e changed GC compaction
|
||||
methods to not be implemented when not supported. However, that commit
|
||||
only does compile time checks (which currently only checks for WASM),
|
||||
but there are additional compaction support checks during run time.
|
||||
|
||||
This commit changes it so that GC compaction methods aren't defined
|
||||
during run time if the platform does not support GC compaction.
|
||||
|
||||
[Bug #18829]
|
||||
~~~
|
||||
|
||||
This is the commit message #3:
|
||||
~~~
|
||||
Suppress code unused unless GC_CAN_COMPILE_COMPACTION
|
||||
~~~
|
||||
---
|
||||
gc.c | 63 +++++++++++++++++++++++++++++++++++++++++-------------------
|
||||
1 file changed, 43 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index 1c35856c44..bff0666a17 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -4985,6 +4985,23 @@ gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap)
|
||||
static void gc_update_references(rb_objspace_t * objspace);
|
||||
static void invalidate_moved_page(rb_objspace_t *objspace, struct heap_page *page);
|
||||
|
||||
+#ifndef GC_CAN_COMPILE_COMPACTION
|
||||
+#if defined(__wasi__) /* WebAssembly doesn't support signals */
|
||||
+# define GC_CAN_COMPILE_COMPACTION 0
|
||||
+#else
|
||||
+# define GC_CAN_COMPILE_COMPACTION 1
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
+#if defined(__MINGW32__) || defined(_WIN32)
|
||||
+# define GC_COMPACTION_SUPPORTED 1
|
||||
+#else
|
||||
+/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
+ * the read barrier, so we must disable compaction. */
|
||||
+# define GC_COMPACTION_SUPPORTED (GC_CAN_COMPILE_COMPACTION && USE_MMAP_ALIGNED_ALLOC)
|
||||
+#endif
|
||||
+
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static void
|
||||
read_barrier_handler(uintptr_t address)
|
||||
{
|
||||
@@ -5005,6 +5022,7 @@ read_barrier_handler(uintptr_t address)
|
||||
}
|
||||
RB_VM_LOCK_LEAVE();
|
||||
}
|
||||
+#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
static LPTOP_LEVEL_EXCEPTION_FILTER old_handler;
|
||||
@@ -9268,13 +9286,7 @@ gc_start_internal(rb_execution_context_t *ec, VALUE self, VALUE full_mark, VALUE
|
||||
|
||||
/* For now, compact implies full mark / sweep, so ignore other flags */
|
||||
if (RTEST(compact)) {
|
||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
- * the read barrier, so we must disable compaction. */
|
||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
||||
- rb_raise(rb_eNotImpError, "Compaction isn't available on this platform");
|
||||
- }
|
||||
-#endif
|
||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
||||
|
||||
reason |= GPR_FLAG_COMPACT;
|
||||
}
|
||||
@@ -9439,7 +9451,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
||||
return (VALUE)src;
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static int
|
||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
||||
{
|
||||
@@ -10167,7 +10179,7 @@ gc_update_references(rb_objspace_t *objspace)
|
||||
gc_update_table_refs(objspace, finalizer_table);
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
@@ -10208,7 +10220,7 @@ gc_compact_stats(VALUE self)
|
||||
# define gc_compact_stats rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
static void
|
||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
||||
{
|
||||
@@ -10287,7 +10299,7 @@ gc_compact(VALUE self)
|
||||
# define gc_compact rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
@@ -10818,7 +10830,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
return rb_gc_disable();
|
||||
}
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact = flag
|
||||
@@ -10832,8 +10844,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
static VALUE
|
||||
gc_set_auto_compact(VALUE _, VALUE v)
|
||||
{
|
||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
- * the read barrier, so we must disable automatic compaction. */
|
||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
||||
|
||||
ruby_enable_autocompact = RTEST(v);
|
||||
return v;
|
||||
@@ -10842,7 +10853,8 @@ gc_set_auto_compact(VALUE _, VALUE v)
|
||||
# define gc_set_auto_compact rb_f_notimplement
|
||||
#endif
|
||||
|
||||
-#if GC_COMPACTION_SUPPORTED
|
||||
+
|
||||
+#if GC_CAN_COMPILE_COMPACTION
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact -> true or false
|
||||
@@ -13753,11 +13776,21 @@ Init_GC(void)
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
||||
#endif
|
||||
- rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
- rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
- rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
+ if (GC_COMPACTION_SUPPORTED) {
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
+ }
|
||||
+ else {
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", rb_f_notimplement, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", rb_f_notimplement, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", rb_f_notimplement, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", rb_f_notimplement, 0);
|
||||
+ /* When !GC_COMPACTION_SUPPORTED, this method is not defined in gc.rb */
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", rb_f_notimplement, -1);
|
||||
+ }
|
||||
|
||||
#if GC_DEBUG_STRESS_TO_CLASS
|
||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
||||
@@ -13781,6 +13803,7 @@ Init_GC(void)
|
||||
OPT(MALLOC_ALLOCATED_SIZE);
|
||||
OPT(MALLOC_ALLOCATED_SIZE_CHECK);
|
||||
OPT(GC_PROFILE_DETAIL_MEMORY);
|
||||
+ OPT(GC_COMPACTION_SUPPORTED);
|
||||
#undef OPT
|
||||
OBJ_FREEZE(opts);
|
||||
}
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
|
@ -0,0 +1,502 @@
|
|||
From 1b3502156a665e2782f366aa5ac8c3bfd7637ab8 Mon Sep 17 00:00:00 2001
|
||||
From: Mike Dalessio <mike.dalessio@gmail.com>
|
||||
Date: Mon, 23 May 2022 15:40:22 -0400
|
||||
Subject: [PATCH 1/2] Move compaction-related methods into gc.c
|
||||
|
||||
These methods are removed from gc.rb and added to gc.c:
|
||||
|
||||
- GC.compact
|
||||
- GC.auto_compact
|
||||
- GC.auto_compact=
|
||||
- GC.latest_compact_info
|
||||
- GC.verify_compaction_references
|
||||
|
||||
This is a prefactor to allow setting these methods to
|
||||
`rb_f_notimplement` in a followup commit.
|
||||
---
|
||||
gc.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
|
||||
gc.rb | 68 ---------------------------------------
|
||||
2 files changed, 91 insertions(+), 78 deletions(-)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index ef9327df1f..1c35856c44 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -10165,8 +10165,20 @@ gc_update_references(rb_objspace_t *objspace)
|
||||
gc_update_table_refs(objspace, finalizer_table);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
+ *
|
||||
+ * Returns information about object moved in the most recent GC compaction.
|
||||
+ *
|
||||
+ * The returned hash has two keys :considered and :moved. The hash for
|
||||
+ * :considered lists the number of objects that were considered for movement
|
||||
+ * by the compactor, and the :moved hash lists the number of objects that
|
||||
+ * were actually moved. Some objects can't be moved (maybe they were pinned)
|
||||
+ * so these numbers can be used to calculate compaction efficiency.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_compact_stats(rb_execution_context_t *ec, VALUE self)
|
||||
+gc_compact_stats(VALUE self)
|
||||
{
|
||||
size_t i;
|
||||
rb_objspace_t *objspace = &rb_objspace;
|
||||
@@ -10239,22 +10251,70 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.compact
|
||||
+ *
|
||||
+ * This function compacts objects together in Ruby's heap. It eliminates
|
||||
+ * unused space (or fragmentation) in the heap by moving objects in to that
|
||||
+ * unused space. This function returns a hash which contains statistics about
|
||||
+ * which objects were moved. See `GC.latest_gc_info` for details about
|
||||
+ * compaction statistics.
|
||||
+ *
|
||||
+ * This method is implementation specific and not expected to be implemented
|
||||
+ * in any implementation besides MRI.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_compact(rb_execution_context_t *ec, VALUE self)
|
||||
+gc_compact(VALUE self)
|
||||
{
|
||||
/* Run GC with compaction enabled */
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
|
||||
- return gc_compact_stats(ec, self);
|
||||
+ return gc_compact_stats(self);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
+ *
|
||||
+ * Verify compaction reference consistency.
|
||||
+ *
|
||||
+ * This method is implementation specific. During compaction, objects that
|
||||
+ * were moved are replaced with T_MOVED objects. No object should have a
|
||||
+ * reference to a T_MOVED object after compaction.
|
||||
+ *
|
||||
+ * This function doubles the heap to ensure room to move all objects,
|
||||
+ * compacts the heap to make sure everything moves, updates all references,
|
||||
+ * then performs a full GC. If any object contains a reference to a T_MOVED
|
||||
+ * object, that object should be pushed on the mark stack, and will
|
||||
+ * make a SEGV.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE double_heap, VALUE toward_empty)
|
||||
+gc_verify_compaction_references(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
rb_objspace_t *objspace = &rb_objspace;
|
||||
+ VALUE kwargs, double_heap = Qfalse, toward_empty = Qfalse;
|
||||
+ static ID id_toward, id_double_heap, id_empty;
|
||||
+
|
||||
+ if (!id_toward) {
|
||||
+ id_toward = rb_intern("toward");
|
||||
+ id_double_heap = rb_intern("double_heap");
|
||||
+ id_empty = rb_intern("empty");
|
||||
+ }
|
||||
+
|
||||
+ rb_scan_args(argc, argv, ":", &kwargs);
|
||||
+ if (!NIL_P(kwargs)) {
|
||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_toward))) {
|
||||
+ VALUE toward = rb_hash_aref(kwargs, ID2SYM(id_toward));
|
||||
+ toward_empty = (toward == ID2SYM(id_empty)) ? Qtrue : Qfalse;
|
||||
+ }
|
||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_double_heap))) {
|
||||
+ double_heap = rb_hash_aref(kwargs, ID2SYM(id_double_heap));
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* Clear the heap. */
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
||||
|
||||
RB_VM_LOCK_ENTER();
|
||||
{
|
||||
@@ -10274,12 +10334,12 @@ gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE do
|
||||
}
|
||||
RB_VM_LOCK_LEAVE();
|
||||
|
||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
||||
|
||||
objspace_reachable_objects_from_root(objspace, root_obj_check_moved_i, NULL);
|
||||
objspace_each_objects(objspace, heap_check_moved_i, NULL, TRUE);
|
||||
|
||||
- return gc_compact_stats(ec, self);
|
||||
+ return gc_compact_stats(self);
|
||||
}
|
||||
|
||||
VALUE
|
||||
@@ -10740,8 +10800,18 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
return rb_gc_disable();
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.auto_compact = flag
|
||||
+ *
|
||||
+ * Updates automatic compaction mode.
|
||||
+ *
|
||||
+ * When enabled, the compactor will execute on every major collection.
|
||||
+ *
|
||||
+ * Enabling compaction will degrade performance on major collections.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
||||
+gc_set_auto_compact(VALUE _, VALUE v)
|
||||
{
|
||||
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
* the read barrier, so we must disable automatic compaction. */
|
||||
@@ -10755,8 +10825,14 @@ gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
||||
return v;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * call-seq:
|
||||
+ * GC.auto_compact -> true or false
|
||||
+ *
|
||||
+ * Returns whether or not automatic compaction has been enabled.
|
||||
+ */
|
||||
static VALUE
|
||||
-gc_get_auto_compact(rb_execution_context_t *ec, VALUE _)
|
||||
+gc_get_auto_compact(VALUE _)
|
||||
{
|
||||
return RBOOL(ruby_enable_autocompact);
|
||||
}
|
||||
@@ -13656,6 +13732,11 @@ Init_GC(void)
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
||||
#endif
|
||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
||||
|
||||
#if GC_DEBUG_STRESS_TO_CLASS
|
||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
||||
diff --git a/gc.rb b/gc.rb
|
||||
index 72637f3796..9265dd7b57 100644
|
||||
--- a/gc.rb
|
||||
+++ b/gc.rb
|
||||
@@ -38,27 +38,6 @@ def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true
|
||||
Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false
|
||||
end
|
||||
|
||||
- # call-seq:
|
||||
- # GC.auto_compact -> true or false
|
||||
- #
|
||||
- # Returns whether or not automatic compaction has been enabled.
|
||||
- #
|
||||
- def self.auto_compact
|
||||
- Primitive.gc_get_auto_compact
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.auto_compact = flag
|
||||
- #
|
||||
- # Updates automatic compaction mode.
|
||||
- #
|
||||
- # When enabled, the compactor will execute on every major collection.
|
||||
- #
|
||||
- # Enabling compaction will degrade performance on major collections.
|
||||
- def self.auto_compact=(flag)
|
||||
- Primitive.gc_set_auto_compact(flag)
|
||||
- end
|
||||
-
|
||||
# call-seq:
|
||||
# GC.enable -> true or false
|
||||
#
|
||||
@@ -210,53 +189,6 @@ def self.latest_gc_info hash_or_key = nil
|
||||
Primitive.gc_latest_gc_info hash_or_key
|
||||
end
|
||||
|
||||
- # call-seq:
|
||||
- # GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
- #
|
||||
- # Returns information about object moved in the most recent GC compaction.
|
||||
- #
|
||||
- # The returned hash has two keys :considered and :moved. The hash for
|
||||
- # :considered lists the number of objects that were considered for movement
|
||||
- # by the compactor, and the :moved hash lists the number of objects that
|
||||
- # were actually moved. Some objects can't be moved (maybe they were pinned)
|
||||
- # so these numbers can be used to calculate compaction efficiency.
|
||||
- def self.latest_compact_info
|
||||
- Primitive.gc_compact_stats
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.compact
|
||||
- #
|
||||
- # This function compacts objects together in Ruby's heap. It eliminates
|
||||
- # unused space (or fragmentation) in the heap by moving objects in to that
|
||||
- # unused space. This function returns a hash which contains statistics about
|
||||
- # which objects were moved. See `GC.latest_gc_info` for details about
|
||||
- # compaction statistics.
|
||||
- #
|
||||
- # This method is implementation specific and not expected to be implemented
|
||||
- # in any implementation besides MRI.
|
||||
- def self.compact
|
||||
- Primitive.gc_compact
|
||||
- end
|
||||
-
|
||||
- # call-seq:
|
||||
- # GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
- #
|
||||
- # Verify compaction reference consistency.
|
||||
- #
|
||||
- # This method is implementation specific. During compaction, objects that
|
||||
- # were moved are replaced with T_MOVED objects. No object should have a
|
||||
- # reference to a T_MOVED object after compaction.
|
||||
- #
|
||||
- # This function doubles the heap to ensure room to move all objects,
|
||||
- # compacts the heap to make sure everything moves, updates all references,
|
||||
- # then performs a full GC. If any object contains a reference to a T_MOVED
|
||||
- # object, that object should be pushed on the mark stack, and will
|
||||
- # make a SEGV.
|
||||
- def self.verify_compaction_references(toward: nil, double_heap: false)
|
||||
- Primitive.gc_verify_compaction_references(double_heap, toward == :empty)
|
||||
- end
|
||||
-
|
||||
# call-seq:
|
||||
# GC.using_rvargc? -> true or false
|
||||
#
|
||||
|
||||
From d3273559356db6852d1fd794f0f076fba100e09e Mon Sep 17 00:00:00 2001
|
||||
From: Mike Dalessio <mike.dalessio@gmail.com>
|
||||
Date: Mon, 23 May 2022 17:31:14 -0400
|
||||
Subject: [PATCH 2/2] Define unsupported GC compaction methods as
|
||||
rb_f_notimplement
|
||||
|
||||
Fixes [Bug #18779]
|
||||
|
||||
Define the following methods as `rb_f_notimplement` on unsupported
|
||||
platforms:
|
||||
|
||||
- GC.compact
|
||||
- GC.auto_compact
|
||||
- GC.auto_compact=
|
||||
- GC.latest_compact_info
|
||||
- GC.verify_compaction_references
|
||||
|
||||
This change allows users to call `GC.respond_to?(:compact)` to
|
||||
properly test for compaction support. Previously, it was necessary to
|
||||
invoke `GC.compact` or `GC.verify_compaction_references` and check if
|
||||
those methods raised `NotImplementedError` to determine if compaction
|
||||
was supported.
|
||||
|
||||
This follows the precedent set for other platform-specific
|
||||
methods. For example, in `process.c` for methods such as
|
||||
`Process.fork`, `Process.setpgid`, and `Process.getpriority`.
|
||||
---
|
||||
gc.c | 31 +++++++++++++++----
|
||||
test/ruby/test_gc_compact.rb | 58 ++++++++++++++++++++++++++----------
|
||||
2 files changed, 69 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index 92ed76cf96..d71924846a 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -9439,6 +9439,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
||||
return (VALUE)src;
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
static int
|
||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
||||
{
|
||||
@@ -9486,6 +9487,7 @@ gc_sort_heap_by_empty_slots(rb_objspace_t *objspace)
|
||||
free(page_list);
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void
|
||||
gc_ref_update_array(rb_objspace_t * objspace, VALUE v)
|
||||
@@ -10165,6 +10167,7 @@ gc_update_references(rb_objspace_t *objspace)
|
||||
gc_update_table_refs(objspace, finalizer_table);
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
||||
@@ -10201,7 +10204,11 @@ gc_compact_stats(VALUE self)
|
||||
|
||||
return h;
|
||||
}
|
||||
+#else
|
||||
+# define gc_compact_stats rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
static void
|
||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
||||
{
|
||||
@@ -10263,6 +10270,10 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data)
|
||||
*
|
||||
* This method is implementation specific and not expected to be implemented
|
||||
* in any implementation besides MRI.
|
||||
+ *
|
||||
+ * To test whether GC compaction is supported, use the idiom:
|
||||
+ *
|
||||
+ * GC.respond_to?(:compact)
|
||||
*/
|
||||
static VALUE
|
||||
gc_compact(VALUE self)
|
||||
@@ -10272,7 +10283,11 @@ gc_compact(VALUE self)
|
||||
|
||||
return gc_compact_stats(self);
|
||||
}
|
||||
+#else
|
||||
+# define gc_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
||||
@@ -10341,6 +10356,9 @@ gc_verify_compaction_references(int argc, VALUE *argv, VALUE self)
|
||||
|
||||
return gc_compact_stats(self);
|
||||
}
|
||||
+#else
|
||||
+# define gc_verify_compaction_references rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
VALUE
|
||||
rb_gc_start(void)
|
||||
@@ -10800,6 +10818,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
||||
return rb_gc_disable();
|
||||
}
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact = flag
|
||||
@@ -10815,16 +10834,15 @@ gc_set_auto_compact(VALUE _, VALUE v)
|
||||
{
|
||||
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||
* the read barrier, so we must disable automatic compaction. */
|
||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
||||
- rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
|
||||
- }
|
||||
-#endif
|
||||
|
||||
ruby_enable_autocompact = RTEST(v);
|
||||
return v;
|
||||
}
|
||||
+#else
|
||||
+# define gc_set_auto_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
+#if GC_COMPACTION_SUPPORTED
|
||||
/*
|
||||
* call-seq:
|
||||
* GC.auto_compact -> true or false
|
||||
@@ -10836,6 +10854,9 @@ gc_get_auto_compact(VALUE _)
|
||||
{
|
||||
return RBOOL(ruby_enable_autocompact);
|
||||
}
|
||||
+#else
|
||||
+# define gc_get_auto_compact rb_f_notimplement
|
||||
+#endif
|
||||
|
||||
static int
|
||||
get_envparam_size(const char *name, size_t *default_value, size_t lower_bound)
|
||||
diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb
|
||||
index 42ad028530..411d5eab69 100644
|
||||
--- a/test/ruby/test_gc_compact.rb
|
||||
+++ b/test/ruby/test_gc_compact.rb
|
||||
@@ -9,14 +9,7 @@
|
||||
end
|
||||
|
||||
class TestGCCompact < Test::Unit::TestCase
|
||||
- module SupportsCompact
|
||||
- def setup
|
||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
- super
|
||||
- end
|
||||
-
|
||||
- private
|
||||
-
|
||||
+ module CompactionSupportInspector
|
||||
def supports_auto_compact?
|
||||
return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
|
||||
@@ -30,10 +23,19 @@ def supports_auto_compact?
|
||||
end
|
||||
end
|
||||
|
||||
- include SupportsCompact
|
||||
+ module OmitUnlessCompactSupported
|
||||
+ include CompactionSupportInspector
|
||||
+
|
||||
+ def setup
|
||||
+ omit "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
+ super
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ include OmitUnlessCompactSupported
|
||||
|
||||
class AutoCompact < Test::Unit::TestCase
|
||||
- include SupportsCompact
|
||||
+ include OmitUnlessCompactSupported
|
||||
|
||||
def test_enable_autocompact
|
||||
before = GC.auto_compact
|
||||
@@ -87,13 +89,39 @@ def test_implicit_compaction_does_something
|
||||
end
|
||||
end
|
||||
|
||||
- def os_page_size
|
||||
- return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
+ class CompactMethodsNotImplemented < Test::Unit::TestCase
|
||||
+ include CompactionSupportInspector
|
||||
+
|
||||
+ def assert_not_implemented(method, *args)
|
||||
+ omit "autocompact is supported on this platform" if supports_auto_compact?
|
||||
+
|
||||
+ assert_raise(NotImplementedError) { GC.send(method, *args) }
|
||||
+ refute(GC.respond_to?(method), "GC.#{method} should be defined as rb_f_notimplement")
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_compact_not_implemented
|
||||
+ assert_not_implemented(:compact)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_auto_compact_get_not_implemented
|
||||
+ assert_not_implemented(:auto_compact)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_auto_compact_set_not_implemented
|
||||
+ assert_not_implemented(:auto_compact=, true)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_latest_compact_info_not_implemented
|
||||
+ assert_not_implemented(:latest_compact_info)
|
||||
+ end
|
||||
+
|
||||
+ def test_gc_verify_compaction_references_not_implemented
|
||||
+ assert_not_implemented(:verify_compaction_references)
|
||||
+ end
|
||||
end
|
||||
|
||||
- def setup
|
||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
||||
- super
|
||||
+ def os_page_size
|
||||
+ return true unless defined?(Etc::SC_PAGE_SIZE)
|
||||
end
|
||||
|
||||
def test_gc_compact_stats
|
||||
|
|
@ -0,0 +1,502 @@
|
|||
--- ruby-3.1.3/gc.rbinc 2022-11-24 11:20:33.000000000 +0100
|
||||
+++ ruby/gc.rbinc 2022-11-25 11:50:19.939820992 +0100
|
||||
@@ -9,27 +9,27 @@
|
||||
#include "builtin.h" /* for RB_BUILTIN_FUNCTION */
|
||||
struct rb_execution_context_struct; /* in vm_core.h */
|
||||
|
||||
-static VALUE builtin_inline_class_277(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_209(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);
|
||||
-#line 277 "gc.rb"
|
||||
+#line 209 "gc.rb"
|
||||
|
||||
rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;
|
||||
return flag;
|
||||
#line 20 "gc.rbinc"
|
||||
}
|
||||
|
||||
-static VALUE builtin_inline_class_289(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_221(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
-#line 289 "gc.rb"
|
||||
+#line 221 "gc.rb"
|
||||
return
|
||||
RBOOL(rb_objspace.flags.measure_gc);
|
||||
#line 28 "gc.rbinc"
|
||||
}
|
||||
|
||||
-static VALUE builtin_inline_class_299(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
+static VALUE builtin_inline_class_231(struct rb_execution_context_struct *ec, const VALUE self)
|
||||
{
|
||||
-#line 299 "gc.rb"
|
||||
+#line 231 "gc.rb"
|
||||
return
|
||||
ULL2NUM(rb_objspace.profile.total_time_ns);
|
||||
#line 36 "gc.rbinc"
|
||||
@@ -52,31 +52,6 @@
|
||||
}
|
||||
|
||||
static void
|
||||
-mjit_compile_invokebuiltin_for_gc_get_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_get_auto_compact */\n", (VALUE)gc_get_auto_compact);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_set_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE);\n");
|
||||
- if (index == -1) {
|
||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 1);
|
||||
- }
|
||||
- else {
|
||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
||||
- }
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_set_auto_compact */\n", (VALUE)gc_set_auto_compact);
|
||||
- fprintf(f, " val = f(ec, self, argv[0]);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
mjit_compile_invokebuiltin_for_gc_enable(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
{
|
||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
@@ -161,40 +136,6 @@
|
||||
}
|
||||
|
||||
static void
|
||||
-mjit_compile_invokebuiltin_for_gc_compact_stats(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact_stats */\n", (VALUE)gc_compact_stats);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact */\n", (VALUE)gc_compact);
|
||||
- fprintf(f, " val = f(ec, self);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-mjit_compile_invokebuiltin_for_gc_verify_compaction_references(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
-{
|
||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE, VALUE);\n");
|
||||
- if (index == -1) {
|
||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 2);
|
||||
- }
|
||||
- else {
|
||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
||||
- }
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_verify_compaction_references */\n", (VALUE)gc_verify_compaction_references);
|
||||
- fprintf(f, " val = f(ec, self, argv[0], argv[1]);\n");
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
mjit_compile_invokebuiltin_for__bi0(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
||||
{
|
||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
||||
@@ -202,7 +143,7 @@
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
fprintf(f, "%s", " MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);\n");
|
||||
- fprintf(f, "%s", "#line 277 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 209 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " \n");
|
||||
fprintf(f, "%s", " rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n");
|
||||
fprintf(f, "%s", " return flag;\n");
|
||||
@@ -211,7 +152,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_277 */\n", (VALUE)builtin_inline_class_277);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_209 */\n", (VALUE)builtin_inline_class_209);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -222,7 +163,7 @@
|
||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
- fprintf(f, "%s", "#line 289 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 221 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " return \n");
|
||||
fprintf(f, "%s", " RBOOL(rb_objspace.flags.measure_gc);\n");
|
||||
fprintf(f, "%s", "#line 52 \"gc.rbinc\"\n");
|
||||
@@ -230,7 +171,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_289 */\n", (VALUE)builtin_inline_class_289);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_221 */\n", (VALUE)builtin_inline_class_221);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -241,7 +182,7 @@
|
||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
||||
if (inlinable_p) {
|
||||
fprintf(f, "%s", " {\n");
|
||||
- fprintf(f, "%s", "#line 299 \"gc.rb\"\n");
|
||||
+ fprintf(f, "%s", "#line 231 \"gc.rb\"\n");
|
||||
fprintf(f, "%s", " return \n");
|
||||
fprintf(f, "%s", " ULL2NUM(rb_objspace.profile.total_time_ns);\n");
|
||||
fprintf(f, "%s", "#line 59 \"gc.rbinc\"\n");
|
||||
@@ -249,7 +190,7 @@
|
||||
fprintf(f, "%s", " \n");
|
||||
return;
|
||||
}
|
||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_299 */\n", (VALUE)builtin_inline_class_299);
|
||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_231 */\n", (VALUE)builtin_inline_class_231);
|
||||
fprintf(f, " val = f(ec, self);\n");
|
||||
}
|
||||
|
||||
@@ -258,21 +199,16 @@
|
||||
// table definition
|
||||
static const struct rb_builtin_function gc_table[] = {
|
||||
RB_BUILTIN_FUNCTION(0, gc_start_internal, gc_start_internal, 4, mjit_compile_invokebuiltin_for_gc_start_internal),
|
||||
- RB_BUILTIN_FUNCTION(1, gc_get_auto_compact, gc_get_auto_compact, 0, mjit_compile_invokebuiltin_for_gc_get_auto_compact),
|
||||
- RB_BUILTIN_FUNCTION(2, gc_set_auto_compact, gc_set_auto_compact, 1, mjit_compile_invokebuiltin_for_gc_set_auto_compact),
|
||||
- RB_BUILTIN_FUNCTION(3, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
||||
- RB_BUILTIN_FUNCTION(4, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
||||
- RB_BUILTIN_FUNCTION(5, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
||||
- RB_BUILTIN_FUNCTION(6, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
||||
- RB_BUILTIN_FUNCTION(7, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
||||
- RB_BUILTIN_FUNCTION(8, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
||||
- RB_BUILTIN_FUNCTION(9, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
||||
- RB_BUILTIN_FUNCTION(10, gc_compact_stats, gc_compact_stats, 0, mjit_compile_invokebuiltin_for_gc_compact_stats),
|
||||
- RB_BUILTIN_FUNCTION(11, gc_compact, gc_compact, 0, mjit_compile_invokebuiltin_for_gc_compact),
|
||||
- RB_BUILTIN_FUNCTION(12, gc_verify_compaction_references, gc_verify_compaction_references, 2, mjit_compile_invokebuiltin_for_gc_verify_compaction_references),
|
||||
- RB_BUILTIN_FUNCTION(13, _bi0, builtin_inline_class_277, 0, mjit_compile_invokebuiltin_for__bi0),
|
||||
- RB_BUILTIN_FUNCTION(14, _bi1, builtin_inline_class_289, 0, mjit_compile_invokebuiltin_for__bi1),
|
||||
- RB_BUILTIN_FUNCTION(15, _bi2, builtin_inline_class_299, 0, mjit_compile_invokebuiltin_for__bi2),
|
||||
+ RB_BUILTIN_FUNCTION(1, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
||||
+ RB_BUILTIN_FUNCTION(2, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
||||
+ RB_BUILTIN_FUNCTION(3, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
||||
+ RB_BUILTIN_FUNCTION(4, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
||||
+ RB_BUILTIN_FUNCTION(5, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
||||
+ RB_BUILTIN_FUNCTION(6, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
||||
+ RB_BUILTIN_FUNCTION(7, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
||||
+ RB_BUILTIN_FUNCTION(8, _bi0, builtin_inline_class_209, 0, mjit_compile_invokebuiltin_for__bi0),
|
||||
+ RB_BUILTIN_FUNCTION(9, _bi1, builtin_inline_class_221, 0, mjit_compile_invokebuiltin_for__bi1),
|
||||
+ RB_BUILTIN_FUNCTION(10, _bi2, builtin_inline_class_231, 0, mjit_compile_invokebuiltin_for__bi2),
|
||||
RB_BUILTIN_FUNCTION(-1, NULL, NULL, 0, 0),
|
||||
};
|
||||
|
||||
@@ -282,8 +218,6 @@
|
||||
COMPILER_WARNING_ERROR(-Wincompatible-pointer-types)
|
||||
#endif
|
||||
if (0) rb_builtin_function_check_arity4(gc_start_internal);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_get_auto_compact);
|
||||
- if (0) rb_builtin_function_check_arity1(gc_set_auto_compact);
|
||||
if (0) rb_builtin_function_check_arity0(gc_enable);
|
||||
if (0) rb_builtin_function_check_arity0(gc_disable);
|
||||
if (0) rb_builtin_function_check_arity0(gc_stress_get);
|
||||
@@ -291,12 +225,9 @@
|
||||
if (0) rb_builtin_function_check_arity0(gc_count);
|
||||
if (0) rb_builtin_function_check_arity1(gc_stat);
|
||||
if (0) rb_builtin_function_check_arity1(gc_latest_gc_info);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_compact_stats);
|
||||
- if (0) rb_builtin_function_check_arity0(gc_compact);
|
||||
- if (0) rb_builtin_function_check_arity2(gc_verify_compaction_references);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_277);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_289);
|
||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_299);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_209);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_221);
|
||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_231);
|
||||
COMPILER_WARNING_POP
|
||||
|
||||
// load
|
||||
--- ruby-3.1.3/miniprelude.c 2022-11-24 11:20:33.000000000 +0100
|
||||
+++ ruby/miniprelude.c 2022-11-25 11:50:20.012820803 +0100
|
||||
@@ -545,11 +545,10 @@
|
||||
|
||||
static const char prelude_name2[] = "<internal:gc>";
|
||||
static const struct {
|
||||
- char L0[479]; /* 1..58 */
|
||||
- char L58[508]; /* 59..204 */
|
||||
- char L204[504]; /* 205..275 */
|
||||
- char L275[490]; /* 276..306 */
|
||||
- char L306[128]; /* 307..312 */
|
||||
+ char L0[492]; /* 1..70 */
|
||||
+ char L70[468]; /* 71..197 */
|
||||
+ char L197[470]; /* 198..237 */
|
||||
+ char L237[211]; /* 238..244 */
|
||||
} prelude_code2 = {
|
||||
#line 1 "gc.rb"
|
||||
""/* for gc.c */
|
||||
@@ -593,29 +592,6 @@
|
||||
" end\n"
|
||||
"\n"
|
||||
"\n"/* call-seq: */
|
||||
-"\n"/* GC.auto_compact -> true or false */
|
||||
-"\n"/* */
|
||||
-"\n"/* Returns whether or not automatic compaction has been enabled. */
|
||||
-"\n"/* */
|
||||
-" def self.auto_compact\n"
|
||||
-" Primitive.gc_get_auto_compact\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.auto_compact = flag */
|
||||
-"\n"/* */
|
||||
-"\n"/* Updates automatic compaction mode. */
|
||||
-"\n"/* */
|
||||
-"\n"/* When enabled, the compactor will execute on every major collection. */
|
||||
-"\n"/* */
|
||||
-"\n"/* Enabling compaction will degrade performance on major collections. */
|
||||
-" def self.auto_compact=(flag)\n"
|
||||
-,
|
||||
-#line 59 "gc.rb"
|
||||
-" Primitive.gc_set_auto_compact(flag)\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
"\n"/* GC.enable -> true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Enables garbage collection, returning +true+ if garbage */
|
||||
@@ -645,6 +621,8 @@
|
||||
"\n"/* GC.stress -> integer, true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Returns current status of GC stress mode. */
|
||||
+,
|
||||
+#line 71 "gc.rb"
|
||||
" def self.stress\n"
|
||||
" Primitive.gc_stress_get\n"
|
||||
" end\n"
|
||||
@@ -758,8 +736,6 @@
|
||||
"\n"/* GC.latest_gc_info(:major_by) -> :malloc */
|
||||
"\n"/* */
|
||||
"\n"/* Returns information about the most recent garbage collection. */
|
||||
-,
|
||||
-#line 205 "gc.rb"
|
||||
"\n"/* */
|
||||
"\n"/* If the optional argument, hash, is given, */
|
||||
"\n"/* it is overwritten and returned. */
|
||||
@@ -768,59 +744,14 @@
|
||||
" Primitive.gc_latest_gc_info hash_or_key\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}} */
|
||||
-"\n"/* */
|
||||
-"\n"/* Returns information about object moved in the most recent GC compaction. */
|
||||
-"\n"/* */
|
||||
-"\n"/* The returned hash has two keys :considered and :moved. The hash for */
|
||||
-"\n"/* :considered lists the number of objects that were considered for movement */
|
||||
-"\n"/* by the compactor, and the :moved hash lists the number of objects that */
|
||||
-"\n"/* were actually moved. Some objects can't be moved (maybe they were pinned) */
|
||||
-"\n"/* so these numbers can be used to calculate compaction efficiency. */
|
||||
-" def self.latest_compact_info\n"
|
||||
-" Primitive.gc_compact_stats\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.compact */
|
||||
-"\n"/* */
|
||||
-"\n"/* This function compacts objects together in Ruby's heap. It eliminates */
|
||||
-"\n"/* unused space (or fragmentation) in the heap by moving objects in to that */
|
||||
-"\n"/* unused space. This function returns a hash which contains statistics about */
|
||||
-"\n"/* which objects were moved. See `GC.latest_gc_info` for details about */
|
||||
-"\n"/* compaction statistics. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This method is implementation specific and not expected to be implemented */
|
||||
-"\n"/* in any implementation besides MRI. */
|
||||
-" def self.compact\n"
|
||||
-" Primitive.gc_compact\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
-"\n"/* call-seq: */
|
||||
-"\n"/* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash */
|
||||
-"\n"/* */
|
||||
-"\n"/* Verify compaction reference consistency. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This method is implementation specific. During compaction, objects that */
|
||||
-"\n"/* were moved are replaced with T_MOVED objects. No object should have a */
|
||||
-"\n"/* reference to a T_MOVED object after compaction. */
|
||||
-"\n"/* */
|
||||
-"\n"/* This function doubles the heap to ensure room to move all objects, */
|
||||
-"\n"/* compacts the heap to make sure everything moves, updates all references, */
|
||||
-"\n"/* then performs a full GC. If any object contains a reference to a T_MOVED */
|
||||
-"\n"/* object, that object should be pushed on the mark stack, and will */
|
||||
-"\n"/* make a SEGV. */
|
||||
-" def self.verify_compaction_references(toward: nil, double_heap: false)\n"
|
||||
-" Primitive.gc_verify_compaction_references(double_heap, toward == :empty)\n"
|
||||
-" end\n"
|
||||
-"\n"
|
||||
"\n"/* call-seq: */
|
||||
"\n"/* GC.using_rvargc? -> true or false */
|
||||
"\n"/* */
|
||||
"\n"/* Returns true if using experimental feature Variable Width Allocation, false */
|
||||
"\n"/* otherwise. */
|
||||
" def self.using_rvargc?\n"/* :nodoc: */
|
||||
+,
|
||||
+#line 198 "gc.rb"
|
||||
" GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] > 1\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
@@ -831,8 +762,6 @@
|
||||
"\n"/* Enable to measure GC time. */
|
||||
"\n"/* You can get the result with <tt>GC.stat(:time)</tt>. */
|
||||
"\n"/* Note that GC time measurement can cause some performance overhead. */
|
||||
-,
|
||||
-#line 276 "gc.rb"
|
||||
" def self.measure_total_time=(flag)\n"
|
||||
" Primitive.cstmt! %{\n"
|
||||
" rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n"
|
||||
@@ -863,15 +792,15 @@
|
||||
"end\n"
|
||||
"\n"
|
||||
"module ObjectSpace\n"
|
||||
-" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
||||
,
|
||||
-#line 307 "gc.rb"
|
||||
+#line 238 "gc.rb"
|
||||
+" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
||||
" Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false\n"
|
||||
" end\n"
|
||||
"\n"
|
||||
" module_function :garbage_collect\n"
|
||||
"end\n"
|
||||
-#line 875 "miniprelude.c"
|
||||
+#line 804 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name3[] = "<internal:numeric>";
|
||||
@@ -1223,7 +1152,7 @@
|
||||
" end\n"
|
||||
"\n"
|
||||
"end\n"
|
||||
-#line 1227 "miniprelude.c"
|
||||
+#line 1156 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name4[] = "<internal:io>";
|
||||
@@ -1354,7 +1283,7 @@
|
||||
" Primitive.io_write_nonblock(buf, exception)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1358 "miniprelude.c"
|
||||
+#line 1287 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name5[] = "<internal:marshal>";
|
||||
@@ -1402,7 +1331,7 @@
|
||||
" alias restore load\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1406 "miniprelude.c"
|
||||
+#line 1335 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name6[] = "<internal:pack>";
|
||||
@@ -1724,7 +1653,7 @@
|
||||
" Primitive.pack_unpack1(fmt, offset)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 1728 "miniprelude.c"
|
||||
+#line 1657 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name7[] = "<internal:trace_point>";
|
||||
@@ -2111,7 +2040,7 @@
|
||||
" Primitive.tracepoint_attr_instruction_sequence\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2115 "miniprelude.c"
|
||||
+#line 2044 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name8[] = "<internal:warning>";
|
||||
@@ -2172,7 +2101,7 @@
|
||||
" Primitive.rb_warn_m(msgs, uplevel, category)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2176 "miniprelude.c"
|
||||
+#line 2105 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name9[] = "<internal:array>";
|
||||
@@ -2249,7 +2178,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2253 "miniprelude.c"
|
||||
+#line 2182 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name10[] = "<internal:kernel>";
|
||||
@@ -2438,7 +2367,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 2442 "miniprelude.c"
|
||||
+#line 2371 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name11[] = "<internal:ractor>";
|
||||
@@ -3309,7 +3238,7 @@
|
||||
" }\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3313 "miniprelude.c"
|
||||
+#line 3242 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name12[] = "<internal:timev>";
|
||||
@@ -3632,7 +3561,7 @@
|
||||
" Primitive.time_init_args(year, mon, mday, hour, min, sec, zone)\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3636 "miniprelude.c"
|
||||
+#line 3565 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name13[] = "<internal:nilclass>";
|
||||
@@ -3665,7 +3594,7 @@
|
||||
" return 0.0\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 3669 "miniprelude.c"
|
||||
+#line 3598 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name14[] = "<internal:prelude>";
|
||||
@@ -3695,7 +3624,7 @@
|
||||
"\n"
|
||||
" private :pp\n"
|
||||
"end\n"
|
||||
-#line 3699 "miniprelude.c"
|
||||
+#line 3628 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name15[] = "<internal:gem_prelude>";
|
||||
@@ -3722,7 +3651,7 @@
|
||||
"rescue LoadError\n"
|
||||
" warn \"`did_you_mean' was not loaded.\"\n"
|
||||
"end if defined?(DidYouMean)\n"
|
||||
-#line 3726 "miniprelude.c"
|
||||
+#line 3655 "miniprelude.c"
|
||||
};
|
||||
|
||||
static const char prelude_name16[] = "<internal:yjit>";
|
||||
@@ -4063,7 +3992,7 @@
|
||||
" end\n"
|
||||
" end\n"
|
||||
"end\n"
|
||||
-#line 4067 "miniprelude.c"
|
||||
+#line 3996 "miniprelude.c"
|
||||
};
|
||||
|
||||
COMPILER_WARNING_POP
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
From 9b7cb6a40d73bb86ee0de34360068e90e80f4e7e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Thu, 7 Sep 2023 13:13:02 +0200
|
||||
Subject: [PATCH] Disable syntax-suggest test case.
|
||||
|
||||
This requires internet connection.
|
||||
---
|
||||
common.mk | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/common.mk b/common.mk
|
||||
index dae7d9dc00..111e859d1b 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -1619,8 +1619,6 @@ no-test-bundled-gems-spec:
|
||||
|
||||
test-syntax-suggest:
|
||||
|
||||
-check: $(DOT_WAIT) $(PREPARE_SYNTAX_SUGGEST) test-syntax-suggest
|
||||
-
|
||||
test-bundler-precheck: $(TEST_RUNNABLE)-test-bundler-precheck
|
||||
no-test-bundler-precheck:
|
||||
yes-test-bundler-precheck: main $(arch)-fake.rb
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
From 1cfb11bc8d01e4fc1ff47807721e29b250f0f19f Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Mon, 22 Dec 2025 10:13:34 +0100
|
||||
Subject: [PATCH] Support customizable rustc_flags for rustc builds.
|
||||
|
||||
Add `rustc_flags` option for configure that appends to RUSTC_FLAGS
|
||||
flags used when compiling with rustc for customizable build flags.
|
||||
It appends to existing defaults in RUSTC_FLAGS.
|
||||
|
||||
Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
|
||||
---
|
||||
common.mk | 10 ++--------
|
||||
configure.ac | 8 ++++++++
|
||||
defs/jit.mk | 2 ++
|
||||
template/Makefile.in | 1 +
|
||||
4 files changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/common.mk b/common.mk
|
||||
index 08fee9119a..9ac5ae919f 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -270,21 +270,15 @@ MAKE_LINK = $(MINIRUBY) -rfileutils -e "include FileUtils::Verbose" \
|
||||
# For release builds
|
||||
YJIT_RUSTC_ARGS = --crate-name=yjit \
|
||||
$(JIT_RUST_FLAGS) \
|
||||
+ $(RUSTC_FLAGS) \
|
||||
--edition=2021 \
|
||||
- -g \
|
||||
- -C lto=thin \
|
||||
- -C opt-level=3 \
|
||||
- -C overflow-checks=on \
|
||||
'--out-dir=$(CARGO_TARGET_DIR)/release/' \
|
||||
'$(top_srcdir)/yjit/src/lib.rs'
|
||||
|
||||
ZJIT_RUSTC_ARGS = --crate-name=zjit \
|
||||
$(JIT_RUST_FLAGS) \
|
||||
+ $(RUSTC_FLAGS) \
|
||||
--edition=2024 \
|
||||
- -g \
|
||||
- -C lto=thin \
|
||||
- -C opt-level=3 \
|
||||
- -C overflow-checks=on \
|
||||
'--out-dir=$(CARGO_TARGET_DIR)/release/' \
|
||||
'$(top_srcdir)/zjit/src/lib.rs'
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 2bbce78fd0..a3aa6dc383 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -69,6 +69,7 @@ dnl 93(bright yellow) is copied from .github/workflows/mingw.yml
|
||||
AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])dnl
|
||||
AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])dnl
|
||||
AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])dnl
|
||||
+AC_ARG_VAR([rustc_flags], [additional RUSTC_FLAGS])dnl
|
||||
|
||||
[begin]_group "environment section" && {
|
||||
HAVE_BASERUBY=yes
|
||||
@@ -4054,6 +4055,11 @@ AS_CASE(["${ZJIT_SUPPORT}"],
|
||||
AC_DEFINE(USE_ZJIT, 0)
|
||||
])
|
||||
|
||||
+RUSTC_FLAGS='-g -C lto=thin -C opt-level=3 -C overflow-checks=on'
|
||||
+AS_IF([test -n "${rustc_flags}"], [
|
||||
+ RUSTC_FLAGS="${RUSTC_FLAGS} ${rustc_flags}"
|
||||
+])
|
||||
+
|
||||
JIT_RUST_FLAGS='--crate-type=staticlib --cfg feature=\"stats_allocator\"'
|
||||
RLIB_DIR=
|
||||
AS_CASE(["$JIT_CARGO_SUPPORT:$YJIT_SUPPORT:$ZJIT_SUPPORT"],
|
||||
@@ -4111,6 +4117,7 @@ AS_IF([test -n "$RUST_LIB"], [
|
||||
dnl These variables end up in ::RbConfig::CONFIG
|
||||
AC_SUBST(RUSTC)dnl Rust compiler command
|
||||
AC_SUBST(JIT_RUST_FLAGS)dnl the common rustc flags for JIT crates such as zjit
|
||||
+AC_SUBST(RUSTC_FLAGS)dnl user-configurable rustc compiler flags
|
||||
AC_SUBST(CARGO)dnl Cargo command for Rust builds
|
||||
AC_SUBST(CARGO_BUILD_ARGS)dnl for selecting Rust build profiles
|
||||
AC_SUBST(YJIT_SUPPORT)dnl what flavor of YJIT the Ruby build includes
|
||||
@@ -4855,6 +4862,7 @@ config_summary "strip command" "$STRIP"
|
||||
config_summary "install doc" "$DOCTARGETS"
|
||||
config_summary "YJIT support" "$YJIT_SUPPORT"
|
||||
config_summary "ZJIT support" "$ZJIT_SUPPORT"
|
||||
+config_summary "RUSTC_FLAGS" "$RUSTC_FLAGS"
|
||||
config_summary "man page type" "$MANTYPE"
|
||||
config_summary "search path" "$search_path"
|
||||
config_summary "static-linked-ext" ${EXTSTATIC:+"yes"}
|
||||
diff --git a/defs/jit.mk b/defs/jit.mk
|
||||
index 42b56c4cd9..27b14e7a07 100644
|
||||
--- a/defs/jit.mk
|
||||
+++ b/defs/jit.mk
|
||||
@@ -40,6 +40,7 @@ else ifneq ($(strip $(RLIB_DIR)),) # combo build
|
||||
$(RUST_LIB): $(srcdir)/ruby.rs
|
||||
$(ECHO) 'building $(@F)'
|
||||
$(gnumake_recursive)$(Q) $(RUSTC) --edition=2024 \
|
||||
+ $(RUSTC_FLAGS) \
|
||||
'-L$(@D)' \
|
||||
--extern=yjit \
|
||||
--extern=zjit \
|
||||
@@ -58,6 +59,7 @@ $(JIT_RLIB):
|
||||
$(gnumake_recursive)$(Q) $(RUSTC) --crate-name=jit \
|
||||
--edition=2024 \
|
||||
$(JIT_RUST_FLAGS) \
|
||||
+ $(RUSTC_FLAGS) \
|
||||
'--out-dir=$(@D)' \
|
||||
'$(top_srcdir)/jit/src/lib.rs'
|
||||
endif # ifneq ($(JIT_CARGO_SUPPORT),no)
|
||||
diff --git a/template/Makefile.in b/template/Makefile.in
|
||||
index 443c394cb4..0b7b50e3aa 100644
|
||||
--- a/template/Makefile.in
|
||||
+++ b/template/Makefile.in
|
||||
@@ -115,6 +115,7 @@ CARGO_TARGET_DIR=@abs_top_builddir@/target
|
||||
CARGO_BUILD_ARGS=@CARGO_BUILD_ARGS@
|
||||
ZJIT_TEST_FEATURES=@ZJIT_TEST_FEATURES@
|
||||
JIT_RUST_FLAGS=@JIT_RUST_FLAGS@
|
||||
+RUSTC_FLAGS=@RUSTC_FLAGS@
|
||||
RLIB_DIR=@RLIB_DIR@
|
||||
RUST_LIB=@RUST_LIB@
|
||||
RUST_LIBOBJ = $(RUST_LIB:.a=.@OBJEXT@)
|
||||
24
ruby-irb-1.4.1-drop-rdoc-hard-dep.patch
Normal file
24
ruby-irb-1.4.1-drop-rdoc-hard-dep.patch
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
From 54c8df06ff9e161012f89d19a4e3aa2e0e37e1b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 23 Aug 2022 10:41:28 +0200
|
||||
Subject: [PATCH] Drop hard dependency on RDoc.
|
||||
|
||||
This has been introduced in 026700499dfd640b2072d7bf0370247a98d5ac40,
|
||||
but it seems that this is just be mistake, otherwise the later handling
|
||||
of `LoadError` would not be needed.
|
||||
---
|
||||
lib/irb/input-method.rb | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
|
||||
index fd68239e..a8227caa 100644
|
||||
--- a/lib/irb/input-method.rb
|
||||
+++ b/lib/irb/input-method.rb
|
||||
@@ -14,7 +14,6 @@
|
||||
require_relative 'completion'
|
||||
require 'io/console'
|
||||
require 'reline'
|
||||
-require 'rdoc'
|
||||
|
||||
module IRB
|
||||
STDIN_FILE_NAME = "(line)" # :nodoc:
|
||||
35
ruby-irb-1.4.1-set-rdoc-soft-dep.patch
Normal file
35
ruby-irb-1.4.1-set-rdoc-soft-dep.patch
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
From b24852058fc87c940252c8a711c60ae2eb298082 Mon Sep 17 00:00:00 2001
|
||||
From: Jun Aruga <jaruga@redhat.com>
|
||||
Date: Thu, 25 Aug 2022 20:11:34 +0200
|
||||
Subject: [PATCH] Require RDoc in `input-method.rb` again in a limited scope.
|
||||
|
||||
RDoc is implemented as soft dependency in IRB. See how the rdoc is required in
|
||||
the files. I reverted the commit below.
|
||||
|
||||
```
|
||||
$ grep -ril rdoc lib/
|
||||
lib/irb/cmd/help.rb
|
||||
lib/irb/completion.rb
|
||||
lib/irb/easter-egg.rb
|
||||
lib/irb/input-method.rb
|
||||
```
|
||||
---
|
||||
lib/irb/input-method.rb | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
|
||||
index a8227ca..b77fd32 100644
|
||||
--- a/lib/irb/input-method.rb
|
||||
+++ b/lib/irb/input-method.rb
|
||||
@@ -320,6 +320,11 @@ def auto_indent(&block)
|
||||
[195, 164], # The "ä" that appears when Alt+d is pressed on xterm.
|
||||
[226, 136, 130] # The "∂" that appears when Alt+d in pressed on iTerm2.
|
||||
]
|
||||
+ begin
|
||||
+ require 'rdoc'
|
||||
+ rescue LoadError
|
||||
+ return nil
|
||||
+ end
|
||||
|
||||
if just_cursor_moving and completion_journey_data.nil?
|
||||
return nil
|
||||
|
|
@ -13,13 +13,15 @@ addFilter(r'ruby\.(spec|src):\d+: W: unversioned-explicit-provides bundled\(ccan
|
|||
# The template files do not have to have executable bits.
|
||||
addFilter(r'^rubygem-bundler\.noarch: E: non-executable-script /usr/share/gems/gems/bundler-[\d\.]+/lib/bundler/templates/[\w/\.]+ 644 /usr/bin/env ')
|
||||
|
||||
# Samples don't really need executable bits.
|
||||
addFilter(r'^rubygem-bigdecimal\.x86_64: E: non-executable-script /usr/share/gems/gems/bigdecimal-[\d\.]+/sample/\w+.rb 644 /usr/local/bin/ruby$')
|
||||
|
||||
# The bundled gem files permissions are overridden as 644 by `make install`.
|
||||
# https://bugs.ruby-lang.org/issues/17840
|
||||
# https://github.com/rubygems/rubygems/issues/5255
|
||||
addFilter(r'^.*: E: non-executable-script /usr/share/gems/gems/(abbrev|getoptlong|nkf|observer|resolv|resolv-replace|rinda|syslog)-[\d\.]+/bin/\w+ 644 ')
|
||||
# https://github.com/ruby/debug/pull/481
|
||||
# https://github.com/ruby/net-ftp/pull/12
|
||||
# https://github.com/ruby/net-imap/pull/53
|
||||
# https://github.com/ruby/net-pop/pull/7
|
||||
# https://github.com/ruby/prime/pull/16
|
||||
addFilter(r'^.*: E: non-executable-script /usr/share/gems/gems/(debug|net-(ftp|imap|pop)|prime)-[\d\.]+/bin/\w+ 644 ')
|
||||
|
||||
# Ruby provides API to set the cipher list.
|
||||
addFilter(r'^ruby-libs\.\w+: W: crypto-policy-non-compliance-openssl /usr/lib(64)?/ruby/openssl.so SSL_CTX_set_cipher_list$')
|
||||
|
|
@ -29,11 +31,31 @@ addFilter(r'^ruby-libs\.\w+: W: crypto-policy-non-compliance-openssl /usr/lib(64
|
|||
# https://bugs.ruby-lang.org/issues/17944
|
||||
addFilter(r'^ruby-libs\.\w+: W: binary-or-shlib-calls-gethostbyname /usr/lib(64)?/ruby/socket.so$')
|
||||
|
||||
# Nothing referred and no dependency information should be no problem.
|
||||
# https://bugs.ruby-lang.org/issues/16558#note-2
|
||||
addFilter(r'^ruby-libs\.\w+: E: shared-library-without-dependency-information /usr/lib(64)?/ruby/enc/gb2312.so$')
|
||||
# Compatibility for rpmlint 1.11.
|
||||
addFilter(r'^ruby-libs\.\w+: E: shared-lib-without-dependency-information /usr/lib(64)?/ruby/enc/gb2312.so$')
|
||||
|
||||
# These are Ruby plugins, where Ruby always load glibc prior the library.
|
||||
addFilter(r'^ruby-libs\.\w+: W: library-not-linked-against-libc /usr/lib(64)?/ruby/.*.so$')
|
||||
|
||||
# The function `chroot` without using `chdir` is detected by rpmlint with the
|
||||
# following message. However it looks a false positive as the `chroot` in the
|
||||
# `dir.c` is just used as a Ruby binding `Dir.chroot` for the function.
|
||||
#
|
||||
# ruby-libs.x86_64: E: missing-call-to-chdir-with-chroot /usr/lib64/libruby.so.N.N.N
|
||||
# This executable appears to call chroot without using chdir to change the
|
||||
# current directory. This is likely an error and permits an attacker to break
|
||||
# out of the chroot by using fchdir. While that's not always a security issue,
|
||||
# this has to be checked.
|
||||
addFilter(r'^ruby-libs\.\w+: E: missing-call-to-chdir-with-chroot /usr/lib(64)?/libruby.so.[\d/.]+$')
|
||||
|
||||
# Rake ships some examples.
|
||||
addFilter(r'^rubygem-rake.noarch: W: devel-file-in-non-devel-package /usr/share/gems/gems/rake-[\d\.]+/doc/example/\w+.c$')
|
||||
|
||||
# Some executables don't have their manual pages. Is it worth of use help2man?
|
||||
addFilter(r'^.+: W: no-manual-page-for-binary (bundler|gem|racc|rbs|rdbg|rdoc|ruby-mri|syntax_suggest|typeprof)$')
|
||||
addFilter(r'^.+: W: no-manual-page-for-binary (bundler|gem|rbs|rdbg|rdoc|ruby-mri|typeprof)$')
|
||||
|
||||
# Default gems does not come with any documentation.
|
||||
addFilter(r'^rubygem-(bigdecimal|io-console|json|psych)\.\w+: W: no-documentation$')
|
||||
|
|
@ -42,18 +64,6 @@ addFilter(r'^rubygem-(bigdecimal|io-console|json|psych)\.\w+: W: no-documentatio
|
|||
# by RPM and can't be modified.
|
||||
addFilter(r'rubygems-devel.noarch: W: only-non-binary-in-usr-lib$')
|
||||
|
||||
# Ignore some spelling false positives.
|
||||
# Ignore spelling of technical terms
|
||||
addFilter(r'^ruby-default-gems.noarch: E: spelling-error \(\'gemspec\'')
|
||||
addFilter(r'^ruby-libs.x86_64: E: spelling-error \(\'libruby\'')
|
||||
addFilter(r'^rubygem-test-unit.noarch: E: spelling-error \(\'xUnit\'')
|
||||
addFilter(r'^rubygem-psych.x86_64: E: spelling-error \(\'libyaml\'')
|
||||
addFilter(r'^rubygem-io-console.x86_64: E: spelling-error \(\'readline\'')
|
||||
# `pyaml` is part of URL
|
||||
addFilter(r'^rubygem-psych.x86_64: E: spelling-error \(\'pyyaml\'')
|
||||
# `de-` is actually prefix
|
||||
addFilter(r'^rubygem-psych.x86_64: E: spelling-error \(\'de\'')
|
||||
|
||||
# It does not seemt to be worth of changing rubygems to archful package due to
|
||||
# single directory, unless it causes some real troubles.
|
||||
addFilter(r'^rubygems.noarch: E: noarch-with-lib64$')
|
||||
# The empty gem.build_complete file is false positive. This error is gone in rpmlint 2.0+.
|
||||
# https://github.com/rpm-software-management/rpmlint/commit/e34ce874f27d733628f51c9884ac951af072bed2
|
||||
addFilter(r'^ruby(gem)?-(bigdecimal|bundled-gems|io-console|json|psych|rbs)\.\w+: E: zero-length /usr/lib(64)?/gems/ruby/.*/gem.build_complete')
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
diff --git a/bundler/spec/install/gemfile/specific_platform_spec.rb b/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
index a29446305..e35d8bc16 100644
|
||||
--- a/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
+++ b/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
@@ -104,40 +104,53 @@
|
||||
L
|
||||
end
|
||||
|
||||
- it "still installs the generic RUBY variant if necessary even when running on a legacy lockfile locked only to RUBY" do
|
||||
- build_repo4 do
|
||||
- build_gem "nokogiri", "1.3.10"
|
||||
- build_gem "nokogiri", "1.3.10" do |s|
|
||||
- s.platform = "arm64-darwin"
|
||||
- s.required_ruby_version = "< #{Gem.ruby_version}"
|
||||
+ context "when running on a legacy lockfile locked only to RUBY" do
|
||||
+ around do |example|
|
||||
+ build_repo4 do
|
||||
+ build_gem "nokogiri", "1.3.10"
|
||||
+ build_gem "nokogiri", "1.3.10" do |s|
|
||||
+ s.platform = "arm64-darwin"
|
||||
+ s.required_ruby_version = "< #{Gem.ruby_version}"
|
||||
+ end
|
||||
+
|
||||
+ build_gem "bundler", "2.1.4"
|
||||
end
|
||||
|
||||
- build_gem "bundler", "2.1.4"
|
||||
- end
|
||||
-
|
||||
- gemfile <<~G
|
||||
+ gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
+
|
||||
gem "nokogiri"
|
||||
- G
|
||||
+ G
|
||||
|
||||
- lockfile <<-L
|
||||
+ lockfile <<-L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.3.10)
|
||||
+
|
||||
PLATFORMS
|
||||
ruby
|
||||
+
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
+
|
||||
RUBY VERSION
|
||||
2.5.3p105
|
||||
+
|
||||
BUNDLED WITH
|
||||
2.1.4
|
||||
- L
|
||||
+ L
|
||||
|
||||
- simulate_platform "arm64-darwin-22" do
|
||||
+ simulate_platform "arm64-darwin-22", &example
|
||||
+ end
|
||||
+
|
||||
+ it "still installs the generic RUBY variant if necessary" do
|
||||
bundle "update --bundler", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
end
|
||||
+
|
||||
+ it "still installs the generic RUBY variant if necessary, even in frozen mode" do
|
||||
+ bundle "update --bundler", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s, "BUNDLE_FROZEN" => "true" }
|
||||
+ end
|
||||
end
|
||||
|
||||
it "doesn't discard previously installed platform specific gem and fall back to ruby on subsequent bundles" do
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
From 891246c3865ed0af7e277ca50c079f466d035f7c Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Thu, 1 Jun 2023 13:22:24 +0200
|
||||
Subject: [PATCH] Backport "Fix another issue of Bundler not falling back to an
|
||||
installable candidate"
|
||||
|
||||
In this case, when materializing a legacy lockfile using only "ruby"
|
||||
platform, and in frozen mode.
|
||||
|
||||
=====
|
||||
|
||||
Commit adapted from: https://github.com/rubygems/rubygems/pull/6261
|
||||
---
|
||||
bundler/lib/bundler/lazy_specification.rb | 11 +++--
|
||||
.../install/gemfile/specific_platform_spec.rb | 41 ++++++++++++-------
|
||||
2 files changed, 35 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/bundler/lib/bundler/lazy_specification.rb b/bundler/lib/bundler/lazy_specification.rb
|
||||
index e8bee25ab..a65020e6c 100644
|
||||
--- a/bundler/lib/bundler/lazy_specification.rb
|
||||
+++ b/bundler/lib/bundler/lazy_specification.rb
|
||||
@@ -85,7 +85,7 @@ def materialize_for_installation
|
||||
|
||||
installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)
|
||||
|
||||
- specification = __materialize__(installable_candidates)
|
||||
+ specification = __materialize__(installable_candidates, :fallback_to_non_installable => false)
|
||||
return specification unless specification.nil?
|
||||
|
||||
if target_platform != platform
|
||||
@@ -98,13 +98,18 @@ def materialize_for_installation
|
||||
__materialize__(candidates)
|
||||
end
|
||||
|
||||
- def __materialize__(candidates)
|
||||
+ # If in frozen mode, we fallback to a non-installable candidate because by
|
||||
+ # doing this we avoid re-resolving and potentially end up changing the
|
||||
+ # lock file, which is not allowed. In that case, we will give a proper error
|
||||
+ # about the mismatch higher up the stack, right before trying to install the
|
||||
+ # bad gem.
|
||||
+ def __materialize__(candidates, fallback_to_non_installable: Bundler.frozen_bundle?)
|
||||
search = candidates.reverse.find do |spec|
|
||||
spec.is_a?(StubSpecification) ||
|
||||
(spec.matches_current_ruby? &&
|
||||
spec.matches_current_rubygems?)
|
||||
end
|
||||
- if search.nil? && Bundler.frozen_bundle?
|
||||
+ if search.nil? && fallback_to_non_installable
|
||||
search = candidates.last
|
||||
else
|
||||
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
||||
--
|
||||
2.41.0.rc1
|
||||
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
From 0985592ad2d815ac461100807f5b2621e5f49b21 Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Fri, 31 Mar 2023 11:54:07 +0200
|
||||
Subject: [PATCH 1/2] Provide fix for bundler Gemfile resolving regression.
|
||||
|
||||
Instead of resolving to correct Ruby platform, it preferred the
|
||||
archful package, that is actually incompatible.
|
||||
|
||||
See https://github.com/sclorg/s2i-ruby-container/issues/469
|
||||
for an example of the bug.
|
||||
|
||||
Commit taken from:
|
||||
<https://github.com/rubygems/rubygems/pull/6225>
|
||||
and adapted:
|
||||
<https://github.com/rubygems/rubygems/commit/7b64c64262a7a980c0eb23b96ea56cf72ea06e89>
|
||||
for the PR#6225.
|
||||
---
|
||||
bundler/lib/bundler/index.rb | 5 ++
|
||||
bundler/lib/bundler/lazy_specification.rb | 64 ++++++++++-------------
|
||||
2 files changed, 34 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/bundler/lib/bundler/index.rb b/bundler/lib/bundler/index.rb
|
||||
index ed16c90a3..903e220d5 100644
|
||||
--- a/bundler/lib/bundler/index.rb
|
||||
+++ b/bundler/lib/bundler/index.rb
|
||||
@@ -71,6 +71,7 @@ def local_search(query)
|
||||
when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
|
||||
when String then specs_by_name(query)
|
||||
when Gem::Dependency then search_by_dependency(query)
|
||||
+ when Array then search_by_name_and_version(*query)
|
||||
else
|
||||
raise "You can't search for a #{query.inspect}."
|
||||
end
|
||||
@@ -173,6 +174,10 @@ def search_by_dependency(dependency)
|
||||
end
|
||||
end
|
||||
|
||||
+ def search_by_name_and_version(name, version)
|
||||
+ specs_by_name(name).select { |spec| spec.version == version }
|
||||
+ end
|
||||
+
|
||||
EMPTY_SEARCH = [].freeze
|
||||
|
||||
def search_by_spec(spec)
|
||||
diff --git a/bundler/lib/bundler/lazy_specification.rb b/bundler/lib/bundler/lazy_specification.rb
|
||||
index 949e8264b..e8bee25ab 100644
|
||||
--- a/bundler/lib/bundler/lazy_specification.rb
|
||||
+++ b/bundler/lib/bundler/lazy_specification.rb
|
||||
@@ -13,7 +13,6 @@ def initialize(name, version, platform, source = nil)
|
||||
@dependencies = []
|
||||
@platform = platform || Gem::Platform::RUBY
|
||||
@source = source
|
||||
- @specification = nil
|
||||
end
|
||||
|
||||
def full_name
|
||||
@@ -76,37 +75,41 @@ def to_lock
|
||||
def materialize_for_installation
|
||||
source.local!
|
||||
|
||||
- candidates = if source.is_a?(Source::Path) || !ruby_platform_materializes_to_ruby_platform?
|
||||
- target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
|
||||
+ matching_specs = source.specs.search(use_exact_resolved_specifications? ? self : [name, version])
|
||||
+ return self if matching_specs.empty?
|
||||
|
||||
- GemHelpers.select_best_platform_match(source.specs.search(Dependency.new(name, version)), target_platform)
|
||||
- else
|
||||
- source.specs.search(self)
|
||||
- end
|
||||
+ candidates = if use_exact_resolved_specifications?
|
||||
+ matching_specs
|
||||
+ else
|
||||
+ target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
|
||||
+
|
||||
+ installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)
|
||||
+
|
||||
+ specification = __materialize__(installable_candidates)
|
||||
+ return specification unless specification.nil?
|
||||
|
||||
- return self if candidates.empty?
|
||||
+ if target_platform != platform
|
||||
+ installable_candidates = GemHelpers.select_best_platform_match(matching_specs, platform)
|
||||
+ end
|
||||
+
|
||||
+ installable_candidates
|
||||
+ end
|
||||
|
||||
__materialize__(candidates)
|
||||
end
|
||||
|
||||
def __materialize__(candidates)
|
||||
- @specification = begin
|
||||
- search = candidates.reverse.find do |spec|
|
||||
- spec.is_a?(StubSpecification) ||
|
||||
- (spec.matches_current_ruby? &&
|
||||
- spec.matches_current_rubygems?)
|
||||
- end
|
||||
- if search.nil? && Bundler.frozen_bundle?
|
||||
- search = candidates.last
|
||||
- else
|
||||
- search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
||||
- end
|
||||
- search
|
||||
+ search = candidates.reverse.find do |spec|
|
||||
+ spec.is_a?(StubSpecification) ||
|
||||
+ (spec.matches_current_ruby? &&
|
||||
+ spec.matches_current_rubygems?)
|
||||
end
|
||||
- end
|
||||
-
|
||||
- def respond_to?(*args)
|
||||
- super || @specification ? @specification.respond_to?(*args) : nil
|
||||
+ if search.nil? && Bundler.frozen_bundle?
|
||||
+ search = candidates.last
|
||||
+ else
|
||||
+ search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
||||
+ end
|
||||
+ search
|
||||
end
|
||||
|
||||
def to_s
|
||||
@@ -127,17 +130,8 @@ def git_version
|
||||
end
|
||||
|
||||
private
|
||||
-
|
||||
- def to_ary
|
||||
- nil
|
||||
- end
|
||||
-
|
||||
- def method_missing(method, *args, &blk)
|
||||
- raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification
|
||||
-
|
||||
- return super unless respond_to?(method)
|
||||
-
|
||||
- @specification.send(method, *args, &blk)
|
||||
+ def use_exact_resolved_specifications?
|
||||
+ @use_exact_resolved_specifications ||= !source.is_a?(Source::Path) && ruby_platform_materializes_to_ruby_platform?
|
||||
end
|
||||
|
||||
#
|
||||
--
|
||||
2.40.0
|
||||
|
||||
60
rubygem-bundler-2.3.26-Tests-from-bundler-PR-6225.patch
Normal file
60
rubygem-bundler-2.3.26-Tests-from-bundler-PR-6225.patch
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
From cb3d287a91e9b6762e47635137d6024fe39e117d Mon Sep 17 00:00:00 2001
|
||||
From: Jarek Prokop <jprokop@redhat.com>
|
||||
Date: Fri, 31 Mar 2023 12:06:21 +0200
|
||||
Subject: [PATCH] Tests from bundler's PR#6225.
|
||||
|
||||
See <https://github.com/rubygems/rubygems/pull/6225>.
|
||||
---
|
||||
.../install/gemfile/specific_platform_spec.rb | 36 +++++++++++++++++++
|
||||
1 file changed, 36 insertions(+)
|
||||
|
||||
diff --git a/bundler/spec/install/gemfile/specific_platform_spec.rb b/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
index 98efec396..a29446305 100644
|
||||
--- a/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
+++ b/bundler/spec/install/gemfile/specific_platform_spec.rb
|
||||
@@ -104,6 +104,42 @@
|
||||
L
|
||||
end
|
||||
|
||||
+ it "still installs the generic RUBY variant if necessary even when running on a legacy lockfile locked only to RUBY" do
|
||||
+ build_repo4 do
|
||||
+ build_gem "nokogiri", "1.3.10"
|
||||
+ build_gem "nokogiri", "1.3.10" do |s|
|
||||
+ s.platform = "arm64-darwin"
|
||||
+ s.required_ruby_version = "< #{Gem.ruby_version}"
|
||||
+ end
|
||||
+
|
||||
+ build_gem "bundler", "2.1.4"
|
||||
+ end
|
||||
+
|
||||
+ gemfile <<~G
|
||||
+ source "#{file_uri_for(gem_repo4)}"
|
||||
+ gem "nokogiri"
|
||||
+ G
|
||||
+
|
||||
+ lockfile <<-L
|
||||
+ GEM
|
||||
+ remote: #{file_uri_for(gem_repo4)}/
|
||||
+ specs:
|
||||
+ nokogiri (1.3.10)
|
||||
+ PLATFORMS
|
||||
+ ruby
|
||||
+ DEPENDENCIES
|
||||
+ nokogiri
|
||||
+ RUBY VERSION
|
||||
+ 2.5.3p105
|
||||
+ BUNDLED WITH
|
||||
+ 2.1.4
|
||||
+ L
|
||||
+
|
||||
+ simulate_platform "arm64-darwin-22" do
|
||||
+ bundle "update --bundler", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
it "doesn't discard previously installed platform specific gem and fall back to ruby on subsequent bundles" do
|
||||
build_repo2 do
|
||||
build_gem("libv8", "8.4.255.0")
|
||||
--
|
||||
2.40.0
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ module RubyGemsReq
|
|||
end
|
||||
|
||||
# Report conflicting gem dependencies including their version.
|
||||
def self.gem_dependencies(specification)
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
conflict_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
|
||||
requirement_string = "rubygem(#{dependency.name}) #{requirement}"
|
||||
|
|
@ -39,7 +39,7 @@ module RubyGemsReq
|
|||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
gem_dependencies(specification)
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ module RubyGemsReq
|
|||
end
|
||||
|
||||
# Report all gem dependencies including their version.
|
||||
def self.gem_dependencies(specification)
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
dependency_name = "rubygem(#{dependency.name})"
|
||||
requirements = Helpers::requirement_versions_to_rpm(dependency.requirement)
|
||||
|
|
@ -75,7 +75,7 @@ module RubyGemsReq
|
|||
specification = Gem::Specification.load filename
|
||||
|
||||
rubygems_dependency(specification)
|
||||
gem_dependencies(specification)
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
|
|
|
|||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
SHA512 (ruby-4.0.1.tar.xz) = b67d9d1f97ba30200d103f8454e39dc2d0450819d51d91eb5451d44b0bafc56d2fa48bb1be6c5081babe5828f679984bad02b9bcee7441f6bd34c0a95b8f200b
|
||||
SHA512 (ruby-3.1.4.tar.xz) = a627bb629a10750b8b2081ad451a41faea0fc85d95aa1e267e3d2a0f56a35bb58195d4a8d13bbdbd82f4197a96dae22b1cee1dfc83861ec33a67ece07aef5633
|
||||
|
|
|
|||
|
|
@ -1,34 +0,0 @@
|
|||
require 'openssl'
|
||||
|
||||
# Run openssl tests in OpenSSL FIPS. See the link below for how to test.
|
||||
# https://github.com/ruby/openssl/blob/master/.github/workflows/test.yml
|
||||
# - step name: test on fips module
|
||||
|
||||
# Listing the testing files by an array explicitly rather than the `Dir.glob`
|
||||
# to prevent the test files from not loading unintentionally.
|
||||
TEST_FILES = %w[
|
||||
test/openssl/test_fips.rb
|
||||
test/openssl/test_pkey.rb
|
||||
].freeze
|
||||
|
||||
if ARGV.empty?
|
||||
puts 'ERROR: Argument base_dir required.'
|
||||
puts "Usage: #{__FILE__} base_dir [options]"
|
||||
exit false
|
||||
end
|
||||
BASE_DIR = ARGV[0]
|
||||
abs_test_files = TEST_FILES.map { |file| File.join(BASE_DIR, file) }
|
||||
|
||||
# Set Fedora/RHEL downstream OpenSSL downstream environment variable to enable
|
||||
# FIPS module in non-FIPS OS environment. It is available in Fedora 38 or later
|
||||
# versions.
|
||||
# https://src.fedoraproject.org/rpms/openssl/blob/rawhide/f/0009-Add-Kernel-FIPS-mode-flag-support.patch
|
||||
ENV['OPENSSL_FORCE_FIPS_MODE'] = '1'
|
||||
# A flag to tell the tests the current environment is FIPS enabled.
|
||||
# https://github.com/ruby/openssl/blob/master/test/openssl/test_fips.rb
|
||||
ENV['TEST_RUBY_OPENSSL_FIPS_ENABLED'] = 'true'
|
||||
|
||||
abs_test_files.each do |file|
|
||||
puts "INFO: Loading #{file}."
|
||||
require file
|
||||
end
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'test/unit'
|
||||
require 'rpm_test_helper'
|
||||
|
||||
class TestRubyGemsCon < Test::Unit::TestCase
|
||||
include RPMTestHelper
|
||||
|
||||
def test_filter_out_regular_requirements
|
||||
gem_i = GemInfo.new
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(0, lines.size)
|
||||
|
||||
deps = [ Dependency.new('bar') ]
|
||||
gem_i.dependencies = deps
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(0, lines.size)
|
||||
|
||||
deps = [
|
||||
Dependency.new('bar'),
|
||||
Dependency.new('baq'),
|
||||
Dependency.new('quz')
|
||||
]
|
||||
|
||||
gem_i.dependencies = deps
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(0, lines.size)
|
||||
|
||||
deps = [
|
||||
Dependency.new('bar', ['>= 4.1']),
|
||||
Dependency.new('baz', ['~> 3.2']),
|
||||
Dependency.new('quz', ['>= 5.6'])
|
||||
]
|
||||
|
||||
gem_i.dependencies = deps
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(0, lines.size)
|
||||
end
|
||||
|
||||
def test_single_gem_single_version_conflict
|
||||
con = Dependency.new('bar', ['!= 0.4.4'])
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [ con ])
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{con.to_rpm_str} = 0.4.4\n", lines.first)
|
||||
end
|
||||
|
||||
def test_multiple_gems_with_single_conflict
|
||||
cons = [
|
||||
Dependency.new('bar', ['!= 1.1']),
|
||||
Dependency.new('baq', ['!= 1.2.2']),
|
||||
Dependency.new('quz', ['!= 1.3'])
|
||||
]
|
||||
|
||||
gem_i = GemInfo.new(dependencies: cons)
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(3, lines.size)
|
||||
|
||||
assert_equal("#{cons[0].to_rpm_str} = 1.1\n" , lines[0])
|
||||
assert_equal("#{cons[1].to_rpm_str} = 1.2.2\n", lines[1])
|
||||
assert_equal("#{cons[2].to_rpm_str} = 1.3\n" , lines[2])
|
||||
end
|
||||
|
||||
def test_multiple_conflicts_on_single_gem
|
||||
con = Dependency.new('bar', ['!= 2.3', '!= 2.4'])
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [con])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
rpm_name = con.to_rpm_str
|
||||
left_rpm_constraint = "(#{rpm_name} = 2.3 with "
|
||||
right_rpm_constraint = "#{rpm_name} = 2.4)\n"
|
||||
assert_equal((left_rpm_constraint + right_rpm_constraint), lines[0])
|
||||
|
||||
con = Dependency.new('bar', ['!= 2.3', '!= 2.4', '!= 4.5'])
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [ con ])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
|
||||
rpm_name = con.to_rpm_str
|
||||
left_rpm_constraint = "(#{rpm_name} = 2.3 with "
|
||||
middle_rpm_constraint = "#{rpm_name} = 2.4 with "
|
||||
right_rpm_constraint = "#{rpm_name} = 4.5)\n"
|
||||
|
||||
assert_equal((left_rpm_constraint + middle_rpm_constraint + right_rpm_constraint), lines[0])
|
||||
end
|
||||
|
||||
def test_generates_conflicts_while_ignoring_regular_requirements
|
||||
deps = [
|
||||
Dependency.new('bar', ['>= 2.3', '!= 2.4.2']),
|
||||
Dependency.new('quz', ['~> 3.0', '!= 3.2'])
|
||||
]
|
||||
|
||||
gem_i = GemInfo.new(dependencies: deps)
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
|
||||
rpm_name = deps[0].to_rpm_str
|
||||
rpm_constraint = "#{rpm_name} = 2.4.2\n"
|
||||
assert_equal(rpm_constraint, lines[0])
|
||||
|
||||
rpm_name = deps[1].to_rpm_str
|
||||
rpm_constraint = "#{rpm_name} = 3.2\n"
|
||||
assert_equal(rpm_constraint, lines[1])
|
||||
end
|
||||
end
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'test/unit'
|
||||
require 'rpm_test_helper'
|
||||
|
||||
class TestRubyGemsProv < Test::Unit::TestCase
|
||||
include RPMTestHelper
|
||||
|
||||
def test_provides_the_gem_version
|
||||
gem_i = GemInfo.new(version: '1.2')
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{gem_i.to_rpm_str} = #{gem_i.version}\n", lines.first)
|
||||
|
||||
gem_i = GemInfo.new(name: 'somegem_foo', version: '4.5.6')
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{gem_i.to_rpm_str} = #{gem_i.version}\n", lines.first)
|
||||
|
||||
deps = [
|
||||
Dependency.new('bar'),
|
||||
Dependency.new('baq', [">= 1.2"]),
|
||||
Dependency.new('quz', ["!= 3.2"])
|
||||
]
|
||||
gem_i = GemInfo.new(dependencies: deps)
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{gem_i.to_rpm_str} = #{gem_i.version}\n", lines.first)
|
||||
end
|
||||
|
||||
def test_translates_prelease_version_provides_from_rubygems_to_rpm
|
||||
gem_i = GemInfo.new(version: '1.2.3.dev')
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{gem_i.to_rpm_str} = 1.2.3~dev\n", lines.first)
|
||||
|
||||
gem_i = GemInfo.new(name: 'foo2', version: '1.2.3.dev.2')
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{gem_i.to_rpm_str} = 1.2.3~dev.2\n", lines.first)
|
||||
end
|
||||
end
|
||||
|
|
@ -1,205 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'test/unit'
|
||||
require 'rpm_test_helper'
|
||||
|
||||
class TestRubyGemsReq < Test::Unit::TestCase
|
||||
include RPMTestHelper
|
||||
|
||||
def test_depends_on_rubygems
|
||||
gem_i = GemInfo.new
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(1, lines.size)
|
||||
assert_equal("#{helper_rubygems_dependency}\n", lines.first)
|
||||
end
|
||||
|
||||
def test_requires_rubygems_and_dependency
|
||||
dep = Dependency.new('bar')
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{helper_rubygems_dependency}\n", lines.first)
|
||||
assert_equal("#{dep.to_rpm_str}\n", lines[1])
|
||||
end
|
||||
|
||||
def test_requires_multiple_dependencies_with_constraint
|
||||
constraints = [
|
||||
'>= 3.0',
|
||||
'>= 3.0.0',
|
||||
'>= 3',
|
||||
'= 1.0.2',
|
||||
'= 3.0',
|
||||
'< 3.2',
|
||||
'<= 3.4'
|
||||
]
|
||||
|
||||
dependencies = []
|
||||
constraints.each_with_index do |constraint, idx|
|
||||
dependencies << Dependency.new("bar#{idx}", [constraint])
|
||||
end
|
||||
|
||||
gem_i = GemInfo.new(dependencies: dependencies)
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
# + 1 for the rubygems dependency
|
||||
assert_equal(constraints.size + 1, lines.size)
|
||||
dependencies.each_with_index do |dep, idx|
|
||||
rpm_dep_name = dep.to_rpm_str
|
||||
# Start indexing lines at 1, to jump over rubygems dependency
|
||||
assert_equal("#{rpm_dep_name} #{constraints[idx]}\n", lines[idx + 1])
|
||||
end
|
||||
end
|
||||
|
||||
def test_expands_pessimistic_constraint_for_rpm
|
||||
dep = Dependency.new('bar', ['~> 1.2'])
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
|
||||
rpm_dep_name = dep.to_rpm_str
|
||||
left_constraint = "#{rpm_dep_name} >= 1.2"
|
||||
right_constraint = "#{rpm_dep_name} < 2"
|
||||
expected_constraint = "(#{left_constraint} with #{right_constraint})\n"
|
||||
assert_equal(expected_constraint, lines[1])
|
||||
end
|
||||
|
||||
def test_multiple_pessimistically_constrained_dependencies
|
||||
dependencies = []
|
||||
dep_map = [
|
||||
{
|
||||
constraint: '~> 1.2.3',
|
||||
expanded_left: '>= 1.2.3',
|
||||
expanded_rigth: '< 1.3',
|
||||
gem_name: 'bar1'
|
||||
},
|
||||
{
|
||||
constraint: '~> 1.2',
|
||||
expanded_left: '>= 1.2',
|
||||
expanded_rigth: '< 2',
|
||||
gem_name: 'bar2'
|
||||
},
|
||||
{
|
||||
constraint: '~> 3',
|
||||
expanded_left: '>= 3',
|
||||
expanded_rigth: '< 4',
|
||||
gem_name: 'bar3'
|
||||
}
|
||||
].each do |deps|
|
||||
dependencies << Dependency.new(deps[:gem_name], [deps[:constraint]])
|
||||
end
|
||||
|
||||
gem_i = GemInfo.new(dependencies: dependencies)
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(dep_map.size + 1, lines.size)
|
||||
|
||||
dep_map.each_with_index do |hash, idx|
|
||||
rpm_dep_name = dependencies[idx].to_rpm_str
|
||||
left_constraint = rpm_dep_name + ' ' + hash[:expanded_left]
|
||||
right_constraint = rpm_dep_name + ' ' + hash[:expanded_rigth]
|
||||
expected_constraint = "(#{left_constraint} with #{right_constraint})\n"
|
||||
assert_equal(expected_constraint, lines[idx + 1])
|
||||
end
|
||||
end
|
||||
|
||||
def test_multiple_constraints_on_one_dependency_composes_constraints_for_RPM
|
||||
# The quoting here depends on how the constraint is expanded in the helpers.
|
||||
# right now the form is `["#{constraint}"]`, therefore we have to not specify
|
||||
# left and right quotes.
|
||||
constraints = ['>= 0.2.3', '<= 0.2.5']
|
||||
dep = Dependency.new('baz', constraints)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
rpm_dep_name = dep.to_rpm_str
|
||||
assert_equal("(#{rpm_dep_name} >= 0.2.3 with #{rpm_dep_name} <= 0.2.5)\n", lines[1])
|
||||
|
||||
# Not sure who would compose a dependency like this, but it's possible
|
||||
# to do with the current generator
|
||||
constraints = ['> 0.4.5', '< 0.6.4', '>= 2.3', '<= 2.5.3']
|
||||
dep = Dependency.new('qux', constraints)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
rpm_dep = dep.to_rpm_str
|
||||
expected_str = "(#{rpm_dep} > 0.4.5 with #{rpm_dep} < 0.6.4 with " \
|
||||
"#{rpm_dep} >= 2.3 with #{rpm_dep} <= 2.5.3)\n"
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal(expected_str, lines[1])
|
||||
end
|
||||
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1561487
|
||||
def test_depends_on_gem_with_version_conflict
|
||||
dep = Dependency.new('baz', ['!= 0.4'])
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{dep.to_rpm_str}\n", lines[1])
|
||||
end
|
||||
|
||||
def test_filters_conflict_from_regular_version_constraints
|
||||
constraint = ['> 1.2.4', '!= 1.2.7']
|
||||
dep = Dependency.new('baq', constraint)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{dep.to_rpm_str} > 1.2.4\n", lines[1])
|
||||
end
|
||||
|
||||
def test_filtering_conflicts_is_not_depending_on_contraint_ordering
|
||||
constraints = ['!= 1.2.7', '> 1.2.4']
|
||||
dep = Dependency.new('baq', constraints)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{dep.to_rpm_str} > 1.2.4\n", lines[1])
|
||||
end
|
||||
|
||||
def test_filters_multiple_conflicts_from_dependency
|
||||
omit "Case not yet supported."
|
||||
constraints = ['!= 1.2.4', '!= 1.2.5', '!= 2.3', '!= 4.8']
|
||||
dep = Dependency.new('baf', constraints)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{dep.to_rpm_str}\n", lines[1])
|
||||
end
|
||||
|
||||
def test_filters_multiple_conflicts_from_dependency_but_keeps_regular_constraint
|
||||
constraints = ['!= 1.2.4', '!= 1.2.5', '!= 2.3', '<= 4.8']
|
||||
dep = Dependency.new('bam', constraints)
|
||||
|
||||
gem_i = GemInfo.new(dependencies: [dep])
|
||||
|
||||
lines = run_generator_single_file(gem_i)
|
||||
|
||||
assert_equal(2, lines.size)
|
||||
assert_equal("#{dep.to_rpm_str} <= 4.8\n", lines[1])
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue