import ruby-3.1.2-141.module+el9.1.0+15737+76195479
This commit is contained in:
		
						commit
						e9a297153f
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| SOURCES/ruby-3.1.2.tar.xz | ||||
							
								
								
									
										1
									
								
								.ruby.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.ruby.metadata
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| 4c47f1dfeeb23fc55d65bcae50cf70c23bc28aa3 SOURCES/ruby-3.1.2.tar.xz | ||||
							
								
								
									
										303
									
								
								SOURCES/libruby.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										303
									
								
								SOURCES/libruby.stp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,303 @@ | ||||
| /* SystemTap tapset to make it easier to trace Ruby 2.0 | ||||
|  * | ||||
|  * All probes provided by Ruby can be listed using following command | ||||
|  * (the path to the library must be adjuste appropriately): | ||||
|  * | ||||
|  * stap -L 'process("@LIBRARY_PATH@").mark("*")' | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.array.create - Allocation of new array. | ||||
|  * | ||||
|  * @size: Number of elements (an int) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.array.create = | ||||
|       process("@LIBRARY_PATH@").mark("array__create") | ||||
| { | ||||
| 	size = $arg1 | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.cmethod.entry - Fired just before a method implemented in C is entered. | ||||
|  * | ||||
|  * @classname: Name of the class (string) | ||||
|  * @methodname: The method about bo be executed (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.cmethod.entry = | ||||
|       process("@LIBRARY_PATH@").mark("cmethod__entry") | ||||
| { | ||||
| 	classname  = user_string($arg1) | ||||
| 	methodname = user_string($arg2) | ||||
| 	file = user_string($arg3) | ||||
| 	line = $arg4 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.cmethod.return - Fired just after a method implemented in C has returned. | ||||
|  * | ||||
|  * @classname: Name of the class (string) | ||||
|  * @methodname: The executed method (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.cmethod.return = | ||||
|       process("@LIBRARY_PATH@").mark("cmethod__return") | ||||
| { | ||||
| 	classname  = user_string($arg1) | ||||
| 	methodname = user_string($arg2) | ||||
| 	file = user_string($arg3) | ||||
| 	line = $arg4 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.find.require.entry - Fired when require starts to search load | ||||
|  * path for suitable file to require. | ||||
|  * | ||||
|  * @requiredfile: The name of the file to be required (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.find.require.entry = | ||||
|       process("@LIBRARY_PATH@").mark("find__require__entry") | ||||
| { | ||||
| 	requiredfile = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.find.require.return - Fired just after require has finished | ||||
|  * search of load path for suitable file to require. | ||||
|  * | ||||
|  * @requiredfile: The name of the file to be required (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.find.require.return = | ||||
|       process("@LIBRARY_PATH@").mark("find__require__return") | ||||
| { | ||||
| 	requiredfile = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.gc.mark.begin - Fired when a GC mark phase is about to start. | ||||
|  * | ||||
|  * It takes no arguments. | ||||
|  */ | ||||
| probe ruby.gc.mark.begin = | ||||
|       process("@LIBRARY_PATH@").mark("gc__mark__begin") | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.gc.mark.end - Fired when a GC mark phase has ended. | ||||
|  * | ||||
|  * It takes no arguments. | ||||
|  */ | ||||
| probe ruby.gc.mark.end = | ||||
|       process("@LIBRARY_PATH@").mark("gc__mark__end") | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.gc.sweep.begin - Fired when a GC sweep phase is about to start. | ||||
|  * | ||||
|  * It takes no arguments. | ||||
|  */ | ||||
| probe ruby.gc.sweep.begin = | ||||
|       process("@LIBRARY_PATH@").mark("gc__sweep__begin") | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.gc.sweep.end - Fired when a GC sweep phase has ended. | ||||
|  * | ||||
|  * It takes no arguments. | ||||
|  */ | ||||
| probe ruby.gc.sweep.end = | ||||
|       process("@LIBRARY_PATH@").mark("gc__sweep__end") | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.hash.create - Allocation of new hash. | ||||
|  * | ||||
|  * @size: Number of elements (int) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.hash.create = | ||||
|       process("@LIBRARY_PATH@").mark("hash__create") | ||||
| { | ||||
| 	size = $arg1 | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.load.entry - Fired when calls to "load" are made. | ||||
|  * | ||||
|  * @loadedfile: The name of the file to be loaded (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.load.entry = | ||||
|       process("@LIBRARY_PATH@").mark("load__entry") | ||||
| { | ||||
| 	loadedfile = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.load.return - Fired just after require has finished | ||||
|  * search of load path for suitable file to require. | ||||
|  * | ||||
|  * @loadedfile: The name of the file that was loaded (string) | ||||
|  */ | ||||
| probe ruby.load.return = | ||||
|       process("@LIBRARY_PATH@").mark("load__return") | ||||
| { | ||||
| 	loadedfile = user_string($arg1) | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.method.entry - Fired just before a method implemented in Ruby is entered. | ||||
|  * | ||||
|  * @classname: Name of the class (string) | ||||
|  * @methodname: The method about bo be executed (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.method.entry = | ||||
|       process("@LIBRARY_PATH@").mark("method__entry") | ||||
| { | ||||
| 	classname  = user_string($arg1) | ||||
| 	methodname = user_string($arg2) | ||||
| 	file = user_string($arg3) | ||||
| 	line = $arg4 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.method.return - Fired just after a method implemented in Ruby has returned. | ||||
|  * | ||||
|  * @classname: Name of the class (string) | ||||
|  * @methodname: The executed method (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.method.return = | ||||
|       process("@LIBRARY_PATH@").mark("method__return") | ||||
| { | ||||
| 	classname  = user_string($arg1) | ||||
| 	methodname = user_string($arg2) | ||||
| 	file = user_string($arg3) | ||||
| 	line = $arg4 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.object.create - Allocation of new object. | ||||
|  * | ||||
|  * @classname: Name of the class (string) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.object.create = | ||||
|       process("@LIBRARY_PATH@").mark("object__create") | ||||
| { | ||||
| 	classname = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.parse.begin - Fired just before a Ruby source file is parsed. | ||||
|  * | ||||
|  * @parsedfile: The name of the file to be parsed (string) | ||||
|  * @parsedline: The line number of beginning of parsing (int) | ||||
|  */ | ||||
| probe ruby.parse.begin = | ||||
|       process("@LIBRARY_PATH@").mark("parse__begin") | ||||
| { | ||||
| 	parsedfile = user_string($arg1) | ||||
| 	parsedline = $arg2 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.parse.end - Fired just after a Ruby source file was parsed. | ||||
|  * | ||||
|  * @parsedfile: The name of parsed the file (string) | ||||
|  * @parsedline: The line number of beginning of parsing (int) | ||||
|  */ | ||||
| probe ruby.parse.end = | ||||
|       process("@LIBRARY_PATH@").mark("parse__end") | ||||
| { | ||||
| 	parsedfile = user_string($arg1) | ||||
| 	parsedline = $arg2 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.raise - Fired when an exception is raised. | ||||
|  * | ||||
|  * @classname: The class name of the raised exception (string) | ||||
|  * @file: The name of the file where the exception was raised (string) | ||||
|  * @line: The line number in the file where the exception was raised (int) | ||||
|  */ | ||||
| probe ruby.raise = | ||||
|       process("@LIBRARY_PATH@").mark("raise") | ||||
| { | ||||
| 	classname  = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.require.entry - Fired on calls to rb_require_safe (when a file | ||||
|  * is required). | ||||
|  * | ||||
|  * @requiredfile: The name of the file to be required (string) | ||||
|  * @file: The file that called "require" (string) | ||||
|  * @line: The line number where the call to require was made(int) | ||||
|  */ | ||||
| probe ruby.require.entry = | ||||
|       process("@LIBRARY_PATH@").mark("require__entry") | ||||
| { | ||||
| 	requiredfile = user_string($arg1) | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.require.return - Fired just after require has finished | ||||
|  * search of load path for suitable file to require. | ||||
|  * | ||||
|  * @requiredfile: The file that was required (string) | ||||
|  */ | ||||
| probe ruby.require.return = | ||||
|       process("@LIBRARY_PATH@").mark("require__return") | ||||
| { | ||||
| 	requiredfile = user_string($arg1) | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * probe ruby.string.create - Allocation of new string. | ||||
|  * | ||||
|  * @size: Number of elements (an int) | ||||
|  * @file: The file name where the method is being called (string) | ||||
|  * @line: The line number where the method is being called (int) | ||||
|  */ | ||||
| probe ruby.string.create = | ||||
|       process("@LIBRARY_PATH@").mark("string__create") | ||||
| { | ||||
| 	size = $arg1 | ||||
| 	file = user_string($arg2) | ||||
| 	line = $arg3 | ||||
| } | ||||
							
								
								
									
										22
									
								
								SOURCES/macros.ruby
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								SOURCES/macros.ruby
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| %ruby_libdir %{_datadir}/%{name} | ||||
| %ruby_libarchdir %{_libdir}/%{name} | ||||
| 
 | ||||
| # This is the local lib/arch and should not be used for packaging. | ||||
| %ruby_sitedir site_ruby | ||||
| %ruby_sitelibdir %{_prefix}/local/share/%{name}/%{ruby_sitedir} | ||||
| %ruby_sitearchdir %{_prefix}/local/%{_lib}/%{name}/%{ruby_sitedir} | ||||
| 
 | ||||
| # This is the general location for libs/archs compatible with all | ||||
| # or most of the Ruby versions available in the Fedora repositories. | ||||
| %ruby_vendordir vendor_ruby | ||||
| %ruby_vendorlibdir %{ruby_libdir}/%{ruby_vendordir} | ||||
| %ruby_vendorarchdir %{ruby_libarchdir}/%{ruby_vendordir} | ||||
| 
 | ||||
| # For ruby packages we want to filter out any provides caused by private | ||||
| # libs in %%{ruby_vendorarchdir}/%%{ruby_sitearchdir}. | ||||
| # | ||||
| # Note that this must be invoked in the spec file, preferably as | ||||
| # "%{?ruby_default_filter}", before any %description block. | ||||
| %ruby_default_filter %{expand: \ | ||||
| %global __provides_exclude_from %{?__provides_exclude_from:%{__provides_exclude_from}|}^(%{ruby_vendorarchdir}|%{ruby_sitearchdir})/.*\\\\.so$ \ | ||||
| } | ||||
							
								
								
									
										186
									
								
								SOURCES/macros.rubygems
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								SOURCES/macros.rubygems
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,186 @@ | ||||
| # The RubyGems root folder. | ||||
| %gem_dir %{_datadir}/gems | ||||
| %gem_archdir %{_libdir}/gems | ||||
| 
 | ||||
| # Common gem locations and files. | ||||
| %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. | ||||
| # | ||||
| # Usage: %gem_install [options] | ||||
| # | ||||
| # -n <gem_file>      Overrides gem file name for installation. | ||||
| # -d <install_dir>   Set installation directory. | ||||
| # | ||||
| %gem_install(d:n:) \ | ||||
| mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \ | ||||
| \ | ||||
| CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' --with-ldflags='%{build_ldflags}' $CONFIGURE_ARGS" \\\ | ||||
| gem install \\\ | ||||
|         -V \\\ | ||||
|         --local \\\ | ||||
|         --build-root %{-d*}%{!?-d:.} \\\ | ||||
|         --force \\\ | ||||
|         --document=ri,rdoc \\\ | ||||
|         %{-n*}%{!?-n:%{gem_name}-%{version}%{?prerelease}.gem} \ | ||||
| %{nil} | ||||
| 
 | ||||
| 
 | ||||
| # The 'read' command in %%gemspec_* macros is not essential, but it is usefull | ||||
| # to make the sript appear in build log. | ||||
| 
 | ||||
| 
 | ||||
| # %gemspec_add_dep - Add dependency into .gemspec. | ||||
| # | ||||
| # Usage: %gemspec_add_dep -g <gem> [options] [requirements] | ||||
| # | ||||
| # Add dependency named <gem> to .gemspec file. The macro adds runtime | ||||
| # dependency by default. The [requirements] argument can be used to specify | ||||
| # the dependency constraints more precisely. It is expected to be valid Ruby | ||||
| # code. | ||||
| # | ||||
| # -s <gemspec_file>   Overrides the default .gemspec location. | ||||
| # -d                  Add development dependecy. | ||||
| # | ||||
| %gemspec_add_dep(g:s:d) \ | ||||
| read -d '' gemspec_add_dep_script << 'EOR' || : \ | ||||
|   gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ | ||||
|   \ | ||||
|   name = '%{-g*}' \ | ||||
|   requirements = %{*}%{!?1:nil} \ | ||||
|   \ | ||||
|   type = :%{!?-d:runtime}%{?-d:development} \ | ||||
|   \ | ||||
|   spec = Gem::Specification.load(gemspec_file) \ | ||||
|   abort("#{gemspec_file} is not accessible.") unless spec \ | ||||
|   \ | ||||
|   dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \ | ||||
|   if dep \ | ||||
|     dep.requirement.concat requirements \ | ||||
|   else \ | ||||
|     spec.public_send "add_#{type}_dependency", name, requirements \ | ||||
|   end \ | ||||
|   File.write gemspec_file, spec.to_ruby \ | ||||
| EOR\ | ||||
| echo "$gemspec_add_dep_script" | ruby \ | ||||
| unset -v gemspec_add_dep_script \ | ||||
| %{nil} | ||||
| 
 | ||||
| 
 | ||||
| # %gemspec_remove_dep - Remove dependency from .gemspec. | ||||
| # | ||||
| # Usage: %gemspec_remove_dep -g <gem> [options] [requirements] | ||||
| # | ||||
| # Remove dependency named <gem> from .gemspec file. The macro removes runtime | ||||
| # dependency by default. The [requirements] argument can be used to specify | ||||
| # the dependency constraints more precisely. It is expected to be valid Ruby | ||||
| # code. The macro fails if these specific requirements can't be removed. | ||||
| # | ||||
| # -s <gemspec_file>   Overrides the default .gemspec location. | ||||
| # -d                  Remove development dependecy. | ||||
| # | ||||
| %gemspec_remove_dep(g:s:d) \ | ||||
| read -d '' gemspec_remove_dep_script << 'EOR' || : \ | ||||
|   gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ | ||||
|   \ | ||||
|   name = '%{-g*}' \ | ||||
|   requirements = %{*}%{!?1:nil} \ | ||||
|   \ | ||||
|   type = :%{!?-d:runtime}%{?-d:development} \ | ||||
|   \ | ||||
|   spec = Gem::Specification.load(gemspec_file) \ | ||||
|   abort("#{gemspec_file} is not accessible.") unless spec \ | ||||
|   \ | ||||
|   dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \ | ||||
|   if dep \ | ||||
|     if requirements \ | ||||
|       requirements = Gem::Requirement.create(requirements).requirements \ | ||||
|       requirements.each do |r| \ | ||||
|         unless dep.requirement.requirements.reject! { |dependency_requirements| dependency_requirements == r } \ | ||||
|           abort("Requirement '#{r.first} #{r.last}' was not possible to remove for dependency '#{dep}'!") \ | ||||
|         end \ | ||||
|       end \ | ||||
|       spec.dependencies.delete dep if dep.requirement.requirements.empty? \ | ||||
|     else \ | ||||
|       spec.dependencies.delete dep \ | ||||
|     end \ | ||||
|   else \ | ||||
|     abort("Dependency '#{name}' was not found!") \ | ||||
|   end \ | ||||
|   File.write gemspec_file, spec.to_ruby \ | ||||
| EOR\ | ||||
| echo "$gemspec_remove_dep_script" | ruby \ | ||||
| unset -v gemspec_remove_dep_script \ | ||||
| %{nil} | ||||
| 
 | ||||
| 
 | ||||
| # %%gemspec_add_file - Add files to various files lists in .gemspec. | ||||
| # | ||||
| # Usage: %%gemspec_add_file [options] <file> | ||||
| # | ||||
| # Add files to .gemspec file. <file> is expected to be valid Ruby code. | ||||
| # Path to file is expected. Does not check real files in any way. | ||||
| # By default, `files` list is edited. | ||||
| # | ||||
| # -s <gemspec_file>   Overrides the default .gemspec location. | ||||
| # -t                  Edit test_files only. | ||||
| # -r                  Edit extra_rdoc_files only. | ||||
| # | ||||
| %gemspec_add_file(s:tr) \ | ||||
| read -d '' gemspec_add_file_script << 'EOR' || : \ | ||||
|   gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ | ||||
|   \ | ||||
|   abort("gemspec_add_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \ | ||||
|   \ | ||||
|   filenames = %{*}%{!?1:nil} \ | ||||
|   filenames = Array(filenames) \ | ||||
|   \ | ||||
|   spec = Gem::Specification.load(gemspec_file) \ | ||||
|   abort("#{gemspec_file} is not accessible.") unless spec \ | ||||
|   \ | ||||
|   spec.%{?-t:test_}%{?-r:extra_rdoc_}files += filenames \ | ||||
|   File.write gemspec_file, spec.to_ruby \ | ||||
| EOR\ | ||||
| echo "$gemspec_add_file_script" | ruby \ | ||||
| unset -v gemspec_add_file_script \ | ||||
| %{nil} | ||||
| 
 | ||||
| 
 | ||||
| # %%gemspec_remove_file - Remove files from various files lists in .gemspec. | ||||
| # | ||||
| # Usage: %%gemspec_remove_file [options] <file> | ||||
| # | ||||
| # Remove files from .gemspec file. <file> is expected to be valid Ruby code. | ||||
| # Path to file is expected. Does not check/remove real files in any way. | ||||
| # By default, `files` list is edited. File has to be removed from `test_files` | ||||
| # first in order to be removable from `files`. | ||||
| # | ||||
| # -s <gemspec_file>   Overrides the default .gemspec location. | ||||
| # -t                  Edit test_files only. | ||||
| # -r                  Edit extra_rdoc_files only. | ||||
| # | ||||
| %gemspec_remove_file(s:tr) \ | ||||
| read -d '' gemspec_remove_file_script << 'EOR' || : \ | ||||
|   gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ | ||||
|   \ | ||||
|   abort("gemspec_remove_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \ | ||||
|   \ | ||||
|   filenames = %{*}%{!?1:nil} \ | ||||
|   filenames = Array(filenames) \ | ||||
|   \ | ||||
|   spec = Gem::Specification.load(gemspec_file) \ | ||||
|   abort("#{gemspec_file} is not accessible.") unless spec \ | ||||
|   \ | ||||
|   spec.%{?-t:test_}%{?-r:extra_rdoc_}files -= filenames \ | ||||
|   File.write gemspec_file, spec.to_ruby \ | ||||
| EOR\ | ||||
| echo "$gemspec_remove_file_script" | ruby \ | ||||
| unset -v gemspec_remove_file_script \ | ||||
| %{nil} | ||||
							
								
								
									
										148
									
								
								SOURCES/operating_system.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								SOURCES/operating_system.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,148 @@ | ||||
| module Gem | ||||
|   class << self | ||||
| 
 | ||||
|     ## | ||||
|     # Returns full path of previous but one directory of dir in path | ||||
|     # E.g. for '/usr/share/ruby', 'ruby', it returns '/usr' | ||||
| 
 | ||||
|     def previous_but_one_dir_to(path, dir) | ||||
|       return unless path | ||||
| 
 | ||||
|       split_path = path.split(File::SEPARATOR) | ||||
|       File.join(split_path.take_while { |one_dir| one_dir !~ /^#{dir}$/ }[0..-2]) | ||||
|     end | ||||
|     private :previous_but_one_dir_to | ||||
| 
 | ||||
|     ## | ||||
|     # Detects --install-dir option specified on command line. | ||||
| 
 | ||||
|     def opt_install_dir? | ||||
|       @opt_install_dir ||= ARGV.include?('--install-dir') || ARGV.include?('-i') | ||||
|     end | ||||
|     private :opt_install_dir? | ||||
| 
 | ||||
|     ## | ||||
|     # Detects --build-root option specified on command line. | ||||
| 
 | ||||
|     def opt_build_root? | ||||
|       @opt_build_root ||= ARGV.include?('--build-root') | ||||
|     end | ||||
|     private :opt_build_root? | ||||
| 
 | ||||
|     ## | ||||
|     # Tries to detect, if arguments and environment variables suggest that | ||||
|     # 'gem install' is executed from rpmbuild. | ||||
| 
 | ||||
|     def rpmbuild? | ||||
|       @rpmbuild ||= ENV['RPM_PACKAGE_NAME'] && (opt_install_dir? || opt_build_root?) | ||||
|     end | ||||
|     private :rpmbuild? | ||||
| 
 | ||||
|     ## | ||||
|     # Default gems locations allowed on FHS system (/usr, /usr/share). | ||||
|     # The locations are derived from directories specified during build | ||||
|     # configuration. | ||||
| 
 | ||||
|     def default_locations | ||||
|       @default_locations ||= { | ||||
|         :system => previous_but_one_dir_to(RbConfig::CONFIG['vendordir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']), | ||||
|         :local => previous_but_one_dir_to(RbConfig::CONFIG['sitedir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']) | ||||
|       } | ||||
|     end | ||||
| 
 | ||||
|     ## | ||||
|     # For each location provides set of directories for binaries (:bin_dir) | ||||
|     # platform independent (:gem_dir) and dependent (:ext_dir) files. | ||||
| 
 | ||||
|     def default_dirs | ||||
|       @libdir ||= case RUBY_PLATFORM | ||||
|       when 'java' | ||||
|         RbConfig::CONFIG['datadir'] | ||||
|       else | ||||
|         RbConfig::CONFIG['libdir'] | ||||
|       end | ||||
| 
 | ||||
|       @default_dirs ||= default_locations.inject(Hash.new) do |hash, location| | ||||
|         destination, path = location | ||||
| 
 | ||||
|         hash[destination] = if path | ||||
|           { | ||||
|             :bin_dir => File.join(path, RbConfig::CONFIG['bindir'].split(File::SEPARATOR).last), | ||||
|             :gem_dir => File.join(path, RbConfig::CONFIG['datadir'].split(File::SEPARATOR).last, 'gems'), | ||||
|             :ext_dir => File.join(path, @libdir.split(File::SEPARATOR).last, 'gems') | ||||
|           } | ||||
|         else | ||||
|           { | ||||
|             :bin_dir => '', | ||||
|             :gem_dir => '', | ||||
|             :ext_dir => '' | ||||
|           } | ||||
|         end | ||||
| 
 | ||||
|         hash | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     ## | ||||
|     # 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_path if method_defined? :default_path | ||||
|     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 | ||||
|       Gem.default_dirs[:system][:gem_dir] | ||||
|     end | ||||
| 
 | ||||
|     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_ext_dir_for base_dir | ||||
|       dir = if rpmbuild? | ||||
|         build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir] | ||||
|         if build_dir != base_dir | ||||
|           File.join build_dir, Gem.default_dirs[:system][:ext_dir] | ||||
|         end | ||||
|       else | ||||
|         dirs = Gem.default_dirs.detect {|location, paths| paths[:gem_dir] == base_dir} | ||||
|         dirs && dirs.last[:ext_dir] | ||||
|       end | ||||
|       dir && File.join(dir, RbConfig::CONFIG['RUBY_INSTALL_NAME']) | ||||
|     end | ||||
| 
 | ||||
|     # This method should be available since RubyGems 2.2 until RubyGems 3.0. | ||||
|     # https://github.com/rubygems/rubygems/issues/749 | ||||
|     if method_defined? :install_extension_in_lib | ||||
|       remove_method :install_extension_in_lib | ||||
| 
 | ||||
|       def install_extension_in_lib | ||||
|         false | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										25
									
								
								SOURCES/ruby-1.9.3-mkmf-verbose.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								SOURCES/ruby-1.9.3-mkmf-verbose.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| From 28cc0749d6729aa2444661ee7b411e183fe220b0 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com> | ||||
| Date: Mon, 19 Nov 2012 15:14:51 +0100 | ||||
| Subject: [PATCH] Verbose mkmf. | ||||
| 
 | ||||
| ---
 | ||||
|  lib/mkmf.rb | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/lib/mkmf.rb b/lib/mkmf.rb
 | ||||
| index 682eb46..e6b1445 100644
 | ||||
| --- a/lib/mkmf.rb
 | ||||
| +++ b/lib/mkmf.rb
 | ||||
| @@ -1974,7 +1974,7 @@ def configuration(srcdir)
 | ||||
|  SHELL = /bin/sh | ||||
|   | ||||
|  # V=0 quiet, V=1 verbose.  other values don't work. | ||||
| -V = 0
 | ||||
| +V = 1
 | ||||
|  V0 = $(V:0=) | ||||
|  Q1 = $(V:1=) | ||||
|  Q = $(Q1:0=@) | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										28
									
								
								SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| 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. | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index d261ea57b5..3c13076b82 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -3368,6 +3368,11 @@ AS_IF([test ${multiarch+set}], [
 | ||||
|  ]) | ||||
|   | ||||
|  archlibdir='${libdir}/${arch}' | ||||
| +AC_ARG_WITH(archlibdir,
 | ||||
| +	    AS_HELP_STRING([--with-archlibdir=DIR],
 | ||||
| +			   [prefix for libruby [[LIBDIR/ARCH]]]),
 | ||||
| +	    [archlibdir="$withval"])
 | ||||
| +
 | ||||
|  sitearchlibdir='${libdir}/${sitearch}' | ||||
|  archincludedir='${includedir}/${arch}' | ||||
|  sitearchincludedir='${includedir}/${sitearch}' | ||||
| -- 
 | ||||
| 2.22.0 | ||||
| 
 | ||||
| @ -0,0 +1,80 @@ | ||||
| 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 | ||||
|  configured. | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac     |  3 ++- | ||||
|  loadpath.c       | 12 ++++++++++++ | ||||
|  tool/mkconfig.rb |  2 +- | ||||
|  3 files changed, 15 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index c42436c23d..d261ea57b5 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -4026,7 +4026,8 @@ AS_CASE(["$ruby_version_dir_name"],
 | ||||
|  ruby_version_dir=/'${ruby_version_dir_name}' | ||||
|   | ||||
|  if test -z "${ruby_version_dir_name}"; then | ||||
| -    AC_MSG_ERROR([No ruby version, No place for bundled libraries])
 | ||||
| +    unset ruby_version_dir
 | ||||
| +    AC_DEFINE(RUBY_LIB_VERSION_BLANK, 1)
 | ||||
|  fi | ||||
|   | ||||
|  rubylibdir='${rubylibprefix}'${ruby_version_dir} | ||||
| diff --git a/loadpath.c b/loadpath.c
 | ||||
| index 9160031..0d4d953 100644
 | ||||
| --- a/loadpath.c
 | ||||
| +++ b/loadpath.c
 | ||||
| @@ -65,21 +65,33 @@ const char ruby_initial_load_paths[] =
 | ||||
|      RUBY_SEARCH_PATH "\0" | ||||
|  #endif | ||||
|  #ifndef NO_RUBY_SITE_LIB | ||||
| +#ifdef RUBY_LIB_VERSION_BLANK
 | ||||
| +    RUBY_SITE_LIB "\0"
 | ||||
| +#else
 | ||||
|      RUBY_SITE_LIB2 "\0" | ||||
| +#endif
 | ||||
|  #ifdef RUBY_THINARCH | ||||
|      RUBY_SITE_ARCH_LIB_FOR(RUBY_THINARCH) "\0" | ||||
|  #endif | ||||
|      RUBY_SITE_ARCH_LIB_FOR(RUBY_SITEARCH) "\0" | ||||
| +#ifndef RUBY_LIB_VERSION_BLANK
 | ||||
|      RUBY_SITE_LIB "\0" | ||||
|  #endif | ||||
| +#endif
 | ||||
|   | ||||
|  #ifndef NO_RUBY_VENDOR_LIB | ||||
| +#ifdef RUBY_LIB_VERSION_BLANK
 | ||||
| +    RUBY_VENDOR_LIB "\0"
 | ||||
| +#else
 | ||||
|      RUBY_VENDOR_LIB2 "\0" | ||||
| +#endif
 | ||||
|  #ifdef RUBY_THINARCH | ||||
|      RUBY_VENDOR_ARCH_LIB_FOR(RUBY_THINARCH) "\0" | ||||
|  #endif | ||||
|      RUBY_VENDOR_ARCH_LIB_FOR(RUBY_SITEARCH) "\0" | ||||
| +#ifndef RUBY_LIB_VERSION_BLANK
 | ||||
|      RUBY_VENDOR_LIB "\0" | ||||
| +#endif
 | ||||
|  #endif | ||||
|   | ||||
|      RUBY_LIB "\0" | ||||
| diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
 | ||||
| index 07076d4..35e6c3c 100755
 | ||||
| --- a/tool/mkconfig.rb
 | ||||
| +++ b/tool/mkconfig.rb
 | ||||
| @@ -115,7 +115,7 @@
 | ||||
|      val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump | ||||
|      case name | ||||
|      when /^prefix$/ | ||||
| -      val = "(TOPDIR || DESTDIR + #{val})"
 | ||||
| +      val = "(((TOPDIR && TOPDIR.empty?) ? nil : TOPDIR) || DESTDIR + #{val})"
 | ||||
|      when /^ARCH_FLAG$/ | ||||
|        val = "arch_flag || #{val}" if universal | ||||
|      when /^UNIVERSAL_ARCHNAMES$/ | ||||
| -- 
 | ||||
| 1.9.0 | ||||
| 
 | ||||
							
								
								
									
										25
									
								
								SOURCES/ruby-2.1.0-always-use-i386.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								SOURCES/ruby-2.1.0-always-use-i386.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| 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. | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac | 2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 3c13076b82..93af30321d 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -4090,6 +4090,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 | ||||
|   | ||||
| +target_cpu=`echo $target_cpu | sed s/i.86/i386/`
 | ||||
| +
 | ||||
|  AS_IF([test "${universal_binary-no}" = yes ], [ | ||||
|      arch="universal-${target_os}" | ||||
|      AS_IF([test "${rb_cv_architecture_available}" = yes], [ | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										97
									
								
								SOURCES/ruby-2.1.0-custom-rubygems-location.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								SOURCES/ruby-2.1.0-custom-rubygems-location.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | ||||
| 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 | ||||
|  Ruby tree. | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac            |  5 +++++ | ||||
|  loadpath.c              |  4 ++++ | ||||
|  template/verconf.h.tmpl |  3 +++ | ||||
|  tool/rbinstall.rb       | 10 ++++++++++ | ||||
|  4 files changed, 22 insertions(+) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 93af30321d..bc13397e0e 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -4062,6 +4062,10 @@ AC_ARG_WITH(vendorarchdir,
 | ||||
|              [vendorarchdir=$withval], | ||||
|              [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}]) | ||||
|   | ||||
| +AC_ARG_WITH(rubygemsdir,
 | ||||
| +           AS_HELP_STRING([--with-rubygemsdir=DIR], [custom rubygems directory]),
 | ||||
| +            [rubygemsdir=$withval])
 | ||||
| +
 | ||||
|  AS_IF([test "${LOAD_RELATIVE+set}"], [ | ||||
|      AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE) | ||||
|      RUBY_EXEC_PREFIX='' | ||||
| @@ -4086,6 +4090,7 @@ AC_SUBST(sitearchdir)dnl
 | ||||
|  AC_SUBST(vendordir)dnl | ||||
|  AC_SUBST(vendorlibdir)dnl | ||||
|  AC_SUBST(vendorarchdir)dnl | ||||
| +AC_SUBST(rubygemsdir)dnl
 | ||||
|   | ||||
|  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 623dc9d..74c5d9e 100644
 | ||||
| --- a/loadpath.c
 | ||||
| +++ b/loadpath.c
 | ||||
| @@ -94,6 +94,10 @@ const char ruby_initial_load_paths[] =
 | ||||
|  #endif | ||||
|  #endif | ||||
|   | ||||
| +#ifdef RUBYGEMS_DIR
 | ||||
| +    RUBYGEMS_DIR "\0"
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      RUBY_LIB "\0" | ||||
|  #ifdef RUBY_THINARCH | ||||
|      RUBY_ARCH_LIB_FOR(RUBY_THINARCH) "\0" | ||||
| diff --git a/template/verconf.h.tmpl b/template/verconf.h.tmpl
 | ||||
| index 79c003e..34f2382 100644
 | ||||
| --- a/template/verconf.h.tmpl
 | ||||
| +++ b/template/verconf.h.tmpl
 | ||||
| @@ -36,6 +36,9 @@
 | ||||
|  % if C["RUBY_SEARCH_PATH"] | ||||
|  #define RUBY_SEARCH_PATH		"${RUBY_SEARCH_PATH}" | ||||
|  % end | ||||
| +% if C["rubygemsdir"]
 | ||||
| +#define RUBYGEMS_DIR			"${rubygemsdir}"
 | ||||
| +% end
 | ||||
|  % | ||||
|  % R = {} | ||||
|  % R["ruby_version"] = '"RUBY_LIB_VERSION"' | ||||
| diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
 | ||||
| index e9110a17ca..76a1f0a315 100755
 | ||||
| --- a/tool/rbinstall.rb
 | ||||
| +++ b/tool/rbinstall.rb
 | ||||
| @@ -359,6 +359,7 @@ def CONFIG.[](name, mandatory = false)
 | ||||
|    vendorlibdir = CONFIG["vendorlibdir"] | ||||
|    vendorarchlibdir = CONFIG["vendorarchdir"] | ||||
|  end | ||||
| +rubygemsdir = CONFIG["rubygemsdir"]
 | ||||
|  mandir = CONFIG["mandir", true] | ||||
|  docdir = CONFIG["docdir", true] | ||||
|  enable_shared = CONFIG["ENABLE_SHARED"] == 'yes' | ||||
| @@ -590,7 +591,16 @@ def stub
 | ||||
|  install?(:local, :comm, :lib) do | ||||
|    prepare "library scripts", rubylibdir | ||||
|    noinst = %w[*.txt *.rdoc *.gemspec] | ||||
| +  # Bundler carries "rubygems.rb" file, so it must be specialcased :/
 | ||||
| +  noinst += %w[rubygems.rb rubygems/ bundler.rb bundler/] if rubygemsdir
 | ||||
|    install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode) | ||||
| +  if rubygemsdir
 | ||||
| +    noinst = %w[*.txt *.rdoc *.gemspec]
 | ||||
| +    install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :no_install => noinst, :mode => $data_mode)
 | ||||
| +    install(File.join(srcdir, "lib", "rubygems.rb"), File.join(rubygemsdir, "rubygems.rb"), :mode => $data_mode)
 | ||||
| +    install_recursive(File.join(srcdir, "lib", "bundler"), File.join(rubylibdir, "bundler"), :no_install => noinst, :mode => $data_mode)
 | ||||
| +    install(File.join(srcdir, "lib", "bundler.rb"), rubylibdir, :mode => $data_mode)
 | ||||
| +  end
 | ||||
|  end | ||||
|   | ||||
|  install?(:local, :comm, :hdr, :'comm-hdr') do | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										281
									
								
								SOURCES/ruby-2.3.0-ruby_version.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								SOURCES/ruby-2.3.0-ruby_version.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,281 @@ | ||||
| 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. | ||||
| 
 | ||||
| This disallows changing the ruby_version constant by --with-ruby-version | ||||
| configuration options. The two places version numbers are disallowed as | ||||
| well, since there are a lot of places which cannot handle this format | ||||
| properly. | ||||
| 
 | ||||
| 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        | 64 ++++++++++++++++++++++++--------------------- | ||||
|  template/ruby.pc.in |  1 + | ||||
|  2 files changed, 35 insertions(+), 30 deletions(-) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 80b137e380..63cd3b4f8b 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -3977,9 +3977,6 @@ AS_CASE(["$target_os"],
 | ||||
|      rubyw_install_name='$(RUBYW_INSTALL_NAME)' | ||||
|      ]) | ||||
|   | ||||
| -rubylibdir='${rubylibprefix}/${ruby_version}'
 | ||||
| -rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
 | ||||
| -
 | ||||
|  rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'} | ||||
|  AC_ARG_WITH(rubyarchprefix, | ||||
|  	    AS_HELP_STRING([--with-rubyarchprefix=DIR], | ||||
| @@ -4002,56 +3999,62 @@ AC_ARG_WITH(ridir,
 | ||||
|  AC_SUBST(ridir) | ||||
|  AC_SUBST(RI_BASE_NAME) | ||||
|   | ||||
| -AC_ARG_WITH(ruby-version,
 | ||||
| -	    AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
 | ||||
| -            [ruby_version=$withval],
 | ||||
| -            [ruby_version=full])
 | ||||
|  unset RUBY_LIB_VERSION | ||||
| -unset RUBY_LIB_VERSION_STYLE
 | ||||
| -AS_CASE(["$ruby_version"],
 | ||||
| -  [full],  [RUBY_LIB_VERSION_STYLE='3	/* full */'],
 | ||||
| -  [minor], [RUBY_LIB_VERSION_STYLE='2	/* minor */'])
 | ||||
| -AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
 | ||||
| -    {
 | ||||
| -    echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
 | ||||
| -    echo '#define STRINGIZE(x) x'
 | ||||
| -    test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
 | ||||
| -    echo '#include "version.h"'
 | ||||
| -    echo 'ruby_version=RUBY_LIB_VERSION'
 | ||||
| -    } > conftest.c
 | ||||
| -    ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
 | ||||
| -    eval $ruby_version
 | ||||
| -], [test -z "${ruby_version}"], [
 | ||||
| -    AC_MSG_ERROR([No ruby version, No place for bundled libraries])
 | ||||
| -], [
 | ||||
| -    RUBY_LIB_VERSION="${ruby_version}"
 | ||||
| -])
 | ||||
| +RUBY_LIB_VERSION_STYLE='3	/* full */'
 | ||||
| +{
 | ||||
| +echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
 | ||||
| +echo '#define STRINGIZE(x) x'
 | ||||
| +test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
 | ||||
| +echo '#include "version.h"'
 | ||||
| +echo 'ruby_version=RUBY_LIB_VERSION'
 | ||||
| +} > conftest.c
 | ||||
| +ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
 | ||||
| +eval $ruby_version
 | ||||
| +
 | ||||
| +RUBY_LIB_VERSION="${ruby_version}"
 | ||||
| +
 | ||||
|  AC_SUBST(RUBY_LIB_VERSION_STYLE) | ||||
|  AC_SUBST(RUBY_LIB_VERSION) | ||||
|   | ||||
| +AC_ARG_WITH(ruby-version,
 | ||||
| +	    AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|STR)]),
 | ||||
| +            [ruby_version_dir_name=$withval],
 | ||||
| +            [ruby_version_dir_name=full])
 | ||||
| +AS_CASE(["$ruby_version_dir_name"],
 | ||||
| +  [full], [ruby_version_dir_name='${ruby_version}'])
 | ||||
| +
 | ||||
| +ruby_version_dir=/'${ruby_version_dir_name}'
 | ||||
| +
 | ||||
| +if test -z "${ruby_version_dir_name}"; then
 | ||||
| +    AC_MSG_ERROR([No ruby version, No place for bundled libraries])
 | ||||
| +fi
 | ||||
| +
 | ||||
| +rubylibdir='${rubylibprefix}'${ruby_version_dir}
 | ||||
| +rubyarchdir=${multiarch+'${rubyarchprefix}'${ruby_version_dir}}${multiarch-'${rubylibdir}/${arch}'}
 | ||||
| +
 | ||||
|  AC_ARG_WITH(sitedir, | ||||
|  	    AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]), | ||||
|              [sitedir=$withval], | ||||
|              [sitedir='${rubylibprefix}/site_ruby']) | ||||
| -sitelibdir='${sitedir}/${ruby_version}'
 | ||||
| +sitelibdir='${sitedir}'${ruby_version_dir}
 | ||||
|   | ||||
|  AC_ARG_WITH(sitearchdir, | ||||
|  	    AS_HELP_STRING([--with-sitearchdir=DIR], | ||||
|  			   [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]), | ||||
|              [sitearchdir=$withval], | ||||
| -            [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
 | ||||
| +            [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby'${ruby_version_dir}}${multiarch-'${sitelibdir}/${sitearch}'}])
 | ||||
|   | ||||
|  AC_ARG_WITH(vendordir, | ||||
|  	    AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]), | ||||
|              [vendordir=$withval], | ||||
|              [vendordir='${rubylibprefix}/vendor_ruby']) | ||||
| -vendorlibdir='${vendordir}/${ruby_version}'
 | ||||
| +vendorlibdir='${vendordir}'${ruby_version_dir}
 | ||||
|   | ||||
|  AC_ARG_WITH(vendorarchdir, | ||||
|  	    AS_HELP_STRING([--with-vendorarchdir=DIR], | ||||
|  			   [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]), | ||||
|              [vendorarchdir=$withval], | ||||
| -            [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
 | ||||
| +            [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
 | ||||
|   | ||||
|  AS_IF([test "${LOAD_RELATIVE+set}"], [ | ||||
|      AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE) | ||||
| @@ -4068,6 +4071,7 @@ AC_SUBST(sitearchincludedir)dnl
 | ||||
|  AC_SUBST(arch)dnl | ||||
|  AC_SUBST(sitearch)dnl | ||||
|  AC_SUBST(ruby_version)dnl | ||||
| +AC_SUBST(ruby_version_dir_name)dnl
 | ||||
|  AC_SUBST(rubylibdir)dnl | ||||
|  AC_SUBST(rubyarchdir)dnl | ||||
|  AC_SUBST(sitedir)dnl | ||||
| diff --git a/template/ruby.pc.in b/template/ruby.pc.in
 | ||||
| index 8a2c066..c81b211 100644
 | ||||
| --- a/template/ruby.pc.in
 | ||||
| +++ b/template/ruby.pc.in
 | ||||
| @@ -2,6 +2,7 @@ MAJOR=@MAJOR@
 | ||||
|  MINOR=@MINOR@ | ||||
|  TEENY=@TEENY@ | ||||
|  ruby_version=@ruby_version@ | ||||
| +ruby_version_dir_name=@ruby_version_dir_name@
 | ||||
|  RUBY_API_VERSION=@RUBY_API_VERSION@ | ||||
|  RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@ | ||||
|  arch=@arch@ | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
| 
 | ||||
| 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. | ||||
| 
 | ||||
| ---
 | ||||
|  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 d4c110e..d39c9a6 100755
 | ||||
| --- a/tool/rbinstall.rb
 | ||||
| +++ b/tool/rbinstall.rb
 | ||||
| @@ -448,7 +448,7 @@ def CONFIG.[](name, mandatory = false)
 | ||||
|   | ||||
|  install?(:doc, :rdoc) do | ||||
|    if $rdocdir | ||||
| -    ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system")
 | ||||
| +    ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system")
 | ||||
|      prepare "rdoc", ridatadir | ||||
|      install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode) | ||||
|    end | ||||
| -- 
 | ||||
| 2.23.0 | ||||
| 
 | ||||
| 
 | ||||
| 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. | ||||
| 
 | ||||
| ---
 | ||||
|  lib/rubygems/defaults.rb  | 7 ++++--- | ||||
|  test/rubygems/test_gem.rb | 5 +++-- | ||||
|  2 files changed, 7 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
 | ||||
| index d4ff4a262c..3f9a5bf590 100644
 | ||||
| --- a/lib/rubygems/defaults.rb
 | ||||
| +++ b/lib/rubygems/defaults.rb
 | ||||
| @@ -34,7 +34,7 @@ def self.default_spec_cache_dir
 | ||||
|    # specified in the environment | ||||
|   | ||||
|    def self.default_dir | ||||
| -    @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version'])
 | ||||
| +    @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'])
 | ||||
|    end | ||||
|   | ||||
|    ## | ||||
| @@ -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] | ||||
| -    parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
 | ||||
| +    ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
 | ||||
| +    parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
 | ||||
|      File.join parts | ||||
|    end | ||||
|   | ||||
| @@ -234,7 +235,7 @@ def self.vendor_dir # :nodoc:
 | ||||
|      return nil unless RbConfig::CONFIG.key? 'vendordir' | ||||
|   | ||||
|      File.join RbConfig::CONFIG['vendordir'], 'gems', | ||||
| -              RbConfig::CONFIG['ruby_version']
 | ||||
| +              RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
 | ||||
|    end | ||||
|   | ||||
|    ## | ||||
| diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
 | ||||
| index b25068405d..e9fef4a311 100644
 | ||||
| --- a/test/rubygems/test_gem.rb
 | ||||
| +++ b/test/rubygems/test_gem.rb
 | ||||
| @@ -1410,7 +1410,8 @@ def test_self_use_paths
 | ||||
|   | ||||
|    def test_self_user_dir | ||||
|      parts = [@userhome, '.gem', Gem.ruby_engine] | ||||
| -    parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
 | ||||
| +    ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
 | ||||
| +    parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
 | ||||
|   | ||||
|      FileUtils.mkdir_p File.join(parts) | ||||
|   | ||||
| @@ -1486,7 +1487,7 @@ def test_self_vendor_dir
 | ||||
|      vendordir(File.join(@tempdir, 'vendor')) do | ||||
|        expected = | ||||
|          File.join RbConfig::CONFIG['vendordir'], 'gems', | ||||
| -                  RbConfig::CONFIG['ruby_version']
 | ||||
| +                  RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
 | ||||
|   | ||||
|        assert_equal expected, Gem.vendor_dir | ||||
|      end | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
| 
 | ||||
| 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 | ||||
|  name. | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index a00f2b6776..999e2d6d5d 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -108,7 +108,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) | ||||
| -AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
 | ||||
| +AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version_dir_name}')
 | ||||
|   | ||||
|  dnl checks for alternative programs | ||||
|  AC_CANONICAL_BUILD | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
							
								
								
									
										77
									
								
								SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| 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. | ||||
| 
 | ||||
| The ABRT hook used to be initialized by preludes via patches [[1], [2]]. | ||||
| Unfortunately, due to [[3]] and especially since [[4]], this would | ||||
| require boostrapping [[5]]. | ||||
| 
 | ||||
| To keep the things simple for now, load the ABRT hook via C. | ||||
| 
 | ||||
| [1]: https://bugs.ruby-lang.org/issues/8566 | ||||
| [2]: https://bugs.ruby-lang.org/issues/15306 | ||||
| [3]: https://bugs.ruby-lang.org/issues/16254 | ||||
| [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 |  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..74b0bd5c0f
 | ||||
| --- /dev/null
 | ||||
| +++ b/abrt.c
 | ||||
| @@ -0,0 +1,12 @@
 | ||||
| +#include "internal.h"
 | ||||
| +
 | ||||
| +void
 | ||||
| +Init_abrt(void)
 | ||||
| +{
 | ||||
| +  rb_eval_string(
 | ||||
| +    "  begin\n"
 | ||||
| +    "    require 'abrt'\n"
 | ||||
| +    "  rescue LoadError\n"
 | ||||
| +    "  end\n"
 | ||||
| +  );
 | ||||
| +}
 | ||||
| diff --git a/common.mk b/common.mk
 | ||||
| index b2e5b2b6d0..f39f81da5c 100644
 | ||||
| --- a/common.mk
 | ||||
| +++ b/common.mk
 | ||||
| @@ -82,7 +82,8 @@ ENC_MK        = enc.mk
 | ||||
|  MAKE_ENC      = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \ | ||||
|  		RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(mflags) | ||||
|   | ||||
| -COMMONOBJS    = array.$(OBJEXT) \
 | ||||
| +COMMONOBJS    = abrt.$(OBJEXT) \
 | ||||
| +                array.$(OBJEXT) \
 | ||||
|  		ast.$(OBJEXT) \ | ||||
|  		bignum.$(OBJEXT) \ | ||||
|  		class.$(OBJEXT) \ | ||||
| diff --git a/ruby.c b/ruby.c
 | ||||
| index 60c57d6259..1eec16f2c8 100644
 | ||||
| --- a/ruby.c
 | ||||
| +++ b/ruby.c
 | ||||
| @@ -1611,10 +1611,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
 | ||||
|   | ||||
|  void Init_builtin_features(void); | ||||
|   | ||||
| +/* abrt.c */
 | ||||
| +void Init_abrt(void);
 | ||||
| +
 | ||||
|  static void | ||||
|  ruby_init_prelude(void) | ||||
|  { | ||||
|      Init_builtin_features(); | ||||
| +    Init_abrt();
 | ||||
|      rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX")); | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 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 | ||||
| 
 | ||||
							
								
								
									
										31
									
								
								SOURCES/ruby-3.1.1-ossl_ocsp-use-null.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								SOURCES/ruby-3.1.1-ossl_ocsp-use-null.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| --- ext/openssl/ossl_ocsp.c.orig	2022-04-07 16:40:13.263752886 +0200
 | ||||
| +++ ext/openssl/ossl_ocsp.c	2022-04-07 16:45:56.818971187 +0200
 | ||||
| @@ -382,7 +382,7 @@
 | ||||
|      if (!NIL_P(flags)) | ||||
|  	flg = NUM2INT(flags); | ||||
|      if (NIL_P(digest)) | ||||
| -	md = EVP_sha1();
 | ||||
| +	md = NULL;
 | ||||
|      else | ||||
|  	md = ossl_evp_get_digestbyname(digest); | ||||
|      if (NIL_P(certs)) | ||||
| @@ -1033,7 +1033,7 @@
 | ||||
|      if (!NIL_P(flags)) | ||||
|  	flg = NUM2INT(flags); | ||||
|      if (NIL_P(digest)) | ||||
| -	md = EVP_sha1();
 | ||||
| +	md = NULL;
 | ||||
|      else | ||||
|  	md = ossl_evp_get_digestbyname(digest); | ||||
|      if (NIL_P(certs)) | ||||
| --- test/openssl/test_ocsp.rb.orig      2022-04-08 08:20:31.400739869 +0200
 | ||||
| +++ test/openssl/test_ocsp.rb   2022-04-08 08:20:37.208727488 +0200
 | ||||
| @@ -99,7 +99,7 @@
 | ||||
|      request.sign(@cert, @cert_key, [@ca_cert], 0) | ||||
|      asn1 = OpenSSL::ASN1.decode(request.to_der) | ||||
|      assert_equal cid.to_der, asn1.value[0].value.find { |a| a.tag_class == :UNIVERSAL }.value[0].value[0].to_der | ||||
| -    assert_equal OpenSSL::ASN1.ObjectId("sha1WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
 | ||||
| +    assert_equal OpenSSL::ASN1.ObjectId("sha256WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
 | ||||
|      assert_equal @cert.to_der, asn1.value[1].value[0].value[2].value[0].value[0].to_der | ||||
|      assert_equal @ca_cert.to_der, asn1.value[1].value[0].value[2].value[0].value[1].to_der | ||||
|      assert_equal asn1.to_der, OpenSSL::OCSP::Request.new(asn1.to_der).to_der | ||||
							
								
								
									
										609
									
								
								SOURCES/ruby-3.1.2-ossl-tests-replace-sha1.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										609
									
								
								SOURCES/ruby-3.1.2-ossl-tests-replace-sha1.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,609 @@ | ||||
| diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
 | ||||
| index fedcb93..53ad621 100644
 | ||||
| --- a/ext/openssl/extconf.rb
 | ||||
| +++ b/ext/openssl/extconf.rb
 | ||||
| @@ -169,6 +169,7 @@ have_func("SSL_CTX_set_post_handshake_auth")
 | ||||
|   | ||||
|  # added in 1.1.1 | ||||
|  have_func("EVP_PKEY_check") | ||||
| +have_func("SSL_CTX_set_ciphersuites")
 | ||||
|   | ||||
|  # added in 3.0.0 | ||||
|  have_func("SSL_set0_tmp_dh_pkey") | ||||
| diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
 | ||||
| index 4b51268..2ab8aea 100644
 | ||||
| --- a/ext/openssl/ossl.h
 | ||||
| +++ b/ext/openssl/ossl.h
 | ||||
| @@ -43,13 +43,13 @@
 | ||||
|  #ifndef LIBRESSL_VERSION_NUMBER | ||||
|  # define OSSL_IS_LIBRESSL 0 | ||||
|  # define OSSL_OPENSSL_PREREQ(maj, min, pat) \ | ||||
| -      (OPENSSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
 | ||||
| +      (OPENSSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
 | ||||
|  # define OSSL_LIBRESSL_PREREQ(maj, min, pat) 0 | ||||
|  #else | ||||
|  # define OSSL_IS_LIBRESSL 1 | ||||
|  # define OSSL_OPENSSL_PREREQ(maj, min, pat) 0 | ||||
|  # define OSSL_LIBRESSL_PREREQ(maj, min, pat) \ | ||||
| -      (LIBRESSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
 | ||||
| +      (LIBRESSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
 | ||||
|  #endif | ||||
|   | ||||
|  #if !defined(OPENSSL_NO_ENGINE) && !OSSL_OPENSSL_PREREQ(3, 0, 0) | ||||
| diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c
 | ||||
| index a61d3ee..0d3fa9a 100644
 | ||||
| --- a/ext/openssl/ossl_asn1.c
 | ||||
| +++ b/ext/openssl/ossl_asn1.c
 | ||||
| @@ -1522,7 +1522,7 @@ Init_ossl_asn1(void)
 | ||||
|       * | ||||
|       * An Array that stores the name of a given tag number. These names are | ||||
|       * the same as the name of the tag constant that is additionally defined, | ||||
| -     * e.g. +UNIVERSAL_TAG_NAME[2] = "INTEGER"+ and +OpenSSL::ASN1::INTEGER = 2+.
 | ||||
| +     * e.g. <tt>UNIVERSAL_TAG_NAME[2] = "INTEGER"</tt> and <tt>OpenSSL::ASN1::INTEGER = 2</tt>.
 | ||||
|       * | ||||
|       * == Example usage | ||||
|       * | ||||
| diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c
 | ||||
| index 2a4835a..24d0da4 100644
 | ||||
| --- a/ext/openssl/ossl_pkey.c
 | ||||
| +++ b/ext/openssl/ossl_pkey.c
 | ||||
| @@ -670,7 +670,7 @@ ossl_pkey_export_traditional(int argc, VALUE *argv, VALUE self, int to_der)
 | ||||
|  	} | ||||
|      } | ||||
|      else { | ||||
| -#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
 | ||||
| +#if OSSL_OPENSSL_PREREQ(1, 1, 0) || OSSL_LIBRESSL_PREREQ(3, 5, 0)
 | ||||
|  	if (!PEM_write_bio_PrivateKey_traditional(bio, pkey, enc, NULL, 0, | ||||
|  						  ossl_pem_passwd_cb, | ||||
|  						  (void *)pass)) { | ||||
| diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
 | ||||
| index 9a0682a..af262d9 100644
 | ||||
| --- a/ext/openssl/ossl_ssl.c
 | ||||
| +++ b/ext/openssl/ossl_ssl.c
 | ||||
| @@ -959,27 +959,13 @@ ossl_sslctx_get_ciphers(VALUE self)
 | ||||
|      return ary; | ||||
|  } | ||||
|   | ||||
| -/*
 | ||||
| - * call-seq:
 | ||||
| - *    ctx.ciphers = "cipher1:cipher2:..."
 | ||||
| - *    ctx.ciphers = [name, ...]
 | ||||
| - *    ctx.ciphers = [[name, version, bits, alg_bits], ...]
 | ||||
| - *
 | ||||
| - * Sets the list of available cipher suites for this context.  Note in a server
 | ||||
| - * context some ciphers require the appropriate certificates.  For example, an
 | ||||
| - * RSA cipher suite can only be chosen when an RSA certificate is available.
 | ||||
| - */
 | ||||
|  static VALUE | ||||
| -ossl_sslctx_set_ciphers(VALUE self, VALUE v)
 | ||||
| +build_cipher_string(VALUE v)
 | ||||
|  { | ||||
| -    SSL_CTX *ctx;
 | ||||
|      VALUE str, elem; | ||||
|      int i; | ||||
|   | ||||
| -    rb_check_frozen(self);
 | ||||
| -    if (NIL_P(v))
 | ||||
| -	return v;
 | ||||
| -    else if (RB_TYPE_P(v, T_ARRAY)) {
 | ||||
| +    if (RB_TYPE_P(v, T_ARRAY)) {
 | ||||
|          str = rb_str_new(0, 0); | ||||
|          for (i = 0; i < RARRAY_LEN(v); i++) { | ||||
|              elem = rb_ary_entry(v, i); | ||||
| @@ -993,14 +979,67 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
 | ||||
|          StringValue(str); | ||||
|      } | ||||
|   | ||||
| +    return str;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * call-seq:
 | ||||
| + *    ctx.ciphers = "cipher1:cipher2:..."
 | ||||
| + *    ctx.ciphers = [name, ...]
 | ||||
| + *    ctx.ciphers = [[name, version, bits, alg_bits], ...]
 | ||||
| + *
 | ||||
| + * Sets the list of available cipher suites for this context.  Note in a server
 | ||||
| + * context some ciphers require the appropriate certificates.  For example, an
 | ||||
| + * RSA cipher suite can only be chosen when an RSA certificate is available.
 | ||||
| + */
 | ||||
| +static VALUE
 | ||||
| +ossl_sslctx_set_ciphers(VALUE self, VALUE v)
 | ||||
| +{
 | ||||
| +    SSL_CTX *ctx;
 | ||||
| +    VALUE str;
 | ||||
| +
 | ||||
| +    rb_check_frozen(self);
 | ||||
| +    if (NIL_P(v))
 | ||||
| +        return v;
 | ||||
| +
 | ||||
| +    str = build_cipher_string(v);
 | ||||
| +
 | ||||
|      GetSSLCTX(self, ctx); | ||||
| -    if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str))) {
 | ||||
| +    if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
 | ||||
|          ossl_raise(eSSLError, "SSL_CTX_set_cipher_list"); | ||||
| -    }
 | ||||
|   | ||||
|      return v; | ||||
|  } | ||||
|   | ||||
| +#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
 | ||||
| +/*
 | ||||
| + * call-seq:
 | ||||
| + *    ctx.ciphersuites = "cipher1:cipher2:..."
 | ||||
| + *    ctx.ciphersuites = [name, ...]
 | ||||
| + *    ctx.ciphersuites = [[name, version, bits, alg_bits], ...]
 | ||||
| + *
 | ||||
| + * Sets the list of available TLSv1.3 cipher suites for this context.
 | ||||
| + */
 | ||||
| +static VALUE
 | ||||
| +ossl_sslctx_set_ciphersuites(VALUE self, VALUE v)
 | ||||
| +{
 | ||||
| +    SSL_CTX *ctx;
 | ||||
| +    VALUE str;
 | ||||
| +
 | ||||
| +    rb_check_frozen(self);
 | ||||
| +    if (NIL_P(v))
 | ||||
| +        return v;
 | ||||
| +
 | ||||
| +    str = build_cipher_string(v);
 | ||||
| +
 | ||||
| +    GetSSLCTX(self, ctx);
 | ||||
| +    if (!SSL_CTX_set_ciphersuites(ctx, StringValueCStr(str)))
 | ||||
| +        ossl_raise(eSSLError, "SSL_CTX_set_ciphersuites");
 | ||||
| +
 | ||||
| +    return v;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifndef OPENSSL_NO_DH | ||||
|  /* | ||||
|   * call-seq: | ||||
| @@ -2703,6 +2742,9 @@ Init_ossl_ssl(void)
 | ||||
|  			     ossl_sslctx_set_minmax_proto_version, 2); | ||||
|      rb_define_method(cSSLContext, "ciphers",     ossl_sslctx_get_ciphers, 0); | ||||
|      rb_define_method(cSSLContext, "ciphers=",    ossl_sslctx_set_ciphers, 1); | ||||
| +#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
 | ||||
| +    rb_define_method(cSSLContext, "ciphersuites=", ossl_sslctx_set_ciphersuites, 1);
 | ||||
| +#endif
 | ||||
|  #ifndef OPENSSL_NO_DH | ||||
|      rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1); | ||||
|  #endif | ||||
| diff --git a/test/openssl/test_asn1.rb b/test/openssl/test_asn1.rb
 | ||||
| index 0fd7971..c79bc14 100644
 | ||||
| --- a/test/openssl/test_asn1.rb
 | ||||
| +++ b/test/openssl/test_asn1.rb
 | ||||
| @@ -14,7 +14,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
 | ||||
|        ["keyUsage","keyCertSign, cRLSign",true], | ||||
|        ["subjectKeyIdentifier","hash",false], | ||||
|      ] | ||||
| -    dgst = OpenSSL::Digest.new('SHA1')
 | ||||
| +    dgst = OpenSSL::Digest.new('SHA256')
 | ||||
|      cert = OpenSSL::TestUtils.issue_cert( | ||||
|        subj, key, s, exts, nil, nil, digest: dgst, not_before: now, not_after: now+3600) | ||||
|   | ||||
| @@ -42,7 +42,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
 | ||||
|      assert_equal(OpenSSL::ASN1::Sequence, sig.class) | ||||
|      assert_equal(2, sig.value.size) | ||||
|      assert_equal(OpenSSL::ASN1::ObjectId, sig.value[0].class) | ||||
| -    assert_equal("1.2.840.113549.1.1.5", sig.value[0].oid)
 | ||||
| +    assert_equal("1.2.840.113549.1.1.11", sig.value[0].oid)
 | ||||
|      assert_equal(OpenSSL::ASN1::Null, sig.value[1].class) | ||||
|   | ||||
|      dn = tbs_cert.value[3] # issuer | ||||
| @@ -189,7 +189,7 @@ class  OpenSSL::TestASN1 < OpenSSL::TestCase
 | ||||
|      assert_equal(OpenSSL::ASN1::Null, pkey.value[0].value[1].class) | ||||
|   | ||||
|      assert_equal(OpenSSL::ASN1::BitString, sig_val.class) | ||||
| -    cululated_sig = key.sign(OpenSSL::Digest.new('SHA1'), tbs_cert.to_der)
 | ||||
| +    cululated_sig = key.sign(OpenSSL::Digest.new('SHA256'), tbs_cert.to_der)
 | ||||
|      assert_equal(cululated_sig, sig_val.value) | ||||
|    end | ||||
|   | ||||
| diff --git a/test/openssl/test_ns_spki.rb b/test/openssl/test_ns_spki.rb
 | ||||
| index ed3be86..383931b 100644
 | ||||
| --- a/test/openssl/test_ns_spki.rb
 | ||||
| +++ b/test/openssl/test_ns_spki.rb
 | ||||
| @@ -22,7 +22,7 @@ class OpenSSL::TestNSSPI < OpenSSL::TestCase
 | ||||
|      spki = OpenSSL::Netscape::SPKI.new | ||||
|      spki.challenge = "RandomString" | ||||
|      spki.public_key = key1.public_key | ||||
| -    spki.sign(key1, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    spki.sign(key1, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert(spki.verify(spki.public_key)) | ||||
|      assert(spki.verify(key1.public_key)) | ||||
|      assert(!spki.verify(key2.public_key)) | ||||
| diff --git a/test/openssl/test_pkey_dsa.rb b/test/openssl/test_pkey_dsa.rb
 | ||||
| index 726b7db..08213df 100644
 | ||||
| --- a/test/openssl/test_pkey_dsa.rb
 | ||||
| +++ b/test/openssl/test_pkey_dsa.rb
 | ||||
| @@ -36,8 +36,8 @@ class OpenSSL::TestPKeyDSA < OpenSSL::PKeyTestCase
 | ||||
|        assert_equal true, dsa512.verify(OpenSSL::Digest.new('DSS1'), signature, data) | ||||
|      end | ||||
|   | ||||
| -    signature = dsa512.sign("SHA1", data)
 | ||||
| -    assert_equal true, dsa512.verify("SHA1", signature, data)
 | ||||
| +    signature = dsa512.sign("SHA256", data)
 | ||||
| +    assert_equal true, dsa512.verify("SHA256", signature, data)
 | ||||
|   | ||||
|      signature0 = (<<~'end;').unpack("m")[0] | ||||
|        MCwCFH5h40plgU5Fh0Z4wvEEpz0eE9SnAhRPbkRB8ggsN/vsSEYMXvJwjGg/ | ||||
| diff --git a/test/openssl/test_pkey_ec.rb b/test/openssl/test_pkey_ec.rb
 | ||||
| index ffe5a94..c06fe6f 100644
 | ||||
| --- a/test/openssl/test_pkey_ec.rb
 | ||||
| +++ b/test/openssl/test_pkey_ec.rb
 | ||||
| @@ -98,8 +98,8 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase
 | ||||
|    def test_sign_verify | ||||
|      p256 = Fixtures.pkey("p256") | ||||
|      data = "Sign me!" | ||||
| -    signature = p256.sign("SHA1", data)
 | ||||
| -    assert_equal true, p256.verify("SHA1", signature, data)
 | ||||
| +    signature = p256.sign("SHA256", data)
 | ||||
| +    assert_equal true, p256.verify("SHA256", signature, data)
 | ||||
|   | ||||
|      signature0 = (<<~'end;').unpack("m")[0] | ||||
|        MEQCIEOTY/hD7eI8a0qlzxkIt8LLZ8uwiaSfVbjX2dPAvN11AiAQdCYx56Fq | ||||
| diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb
 | ||||
| index 4bb39ed..9e06e43 100644
 | ||||
| --- a/test/openssl/test_pkey_rsa.rb
 | ||||
| +++ b/test/openssl/test_pkey_rsa.rb
 | ||||
| @@ -80,8 +80,8 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
 | ||||
|    def test_sign_verify | ||||
|      rsa1024 = Fixtures.pkey("rsa1024") | ||||
|      data = "Sign me!" | ||||
| -    signature = rsa1024.sign("SHA1", data)
 | ||||
| -    assert_equal true, rsa1024.verify("SHA1", signature, data)
 | ||||
| +    signature = rsa1024.sign("SHA256", data)
 | ||||
| +    assert_equal true, rsa1024.verify("SHA256", signature, data)
 | ||||
|   | ||||
|      signature0 = (<<~'end;').unpack("m")[0] | ||||
|        oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+ | ||||
| @@ -113,10 +113,10 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
 | ||||
|    def test_sign_verify_raw | ||||
|      key = Fixtures.pkey("rsa-1") | ||||
|      data = "Sign me!" | ||||
| -    hash = OpenSSL::Digest.digest("SHA1", data)
 | ||||
| -    signature = key.sign_raw("SHA1", hash)
 | ||||
| -    assert_equal true, key.verify_raw("SHA1", signature, hash)
 | ||||
| -    assert_equal true, key.verify("SHA1", signature, data)
 | ||||
| +    hash = OpenSSL::Digest.digest("SHA256", data)
 | ||||
| +    signature = key.sign_raw("SHA256", hash)
 | ||||
| +    assert_equal true, key.verify_raw("SHA256", signature, hash)
 | ||||
| +    assert_equal true, key.verify("SHA256", signature, data)
 | ||||
|   | ||||
|      # Too long data | ||||
|      assert_raise(OpenSSL::PKey::PKeyError) { | ||||
| @@ -129,9 +129,9 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
 | ||||
|        "rsa_pss_saltlen" => 20, | ||||
|        "rsa_mgf1_md" => "SHA256" | ||||
|      } | ||||
| -    sig_pss = key.sign_raw("SHA1", hash, pssopts)
 | ||||
| -    assert_equal true, key.verify("SHA1", sig_pss, data, pssopts)
 | ||||
| -    assert_equal true, key.verify_raw("SHA1", sig_pss, hash, pssopts)
 | ||||
| +    sig_pss = key.sign_raw("SHA256", hash, pssopts)
 | ||||
| +    assert_equal true, key.verify("SHA256", sig_pss, data, pssopts)
 | ||||
| +    assert_equal true, key.verify_raw("SHA256", sig_pss, hash, pssopts)
 | ||||
|    end | ||||
|   | ||||
|    def test_sign_verify_raw_legacy | ||||
| diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
 | ||||
| index a7607da..3ba8b39 100644
 | ||||
| --- a/test/openssl/test_ssl.rb
 | ||||
| +++ b/test/openssl/test_ssl.rb
 | ||||
| @@ -676,10 +676,16 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
 | ||||
|      #     buzz.example.net, respectively).  ... | ||||
|      assert_equal(true, OpenSSL::SSL.verify_certificate_identity( | ||||
|        create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com')) | ||||
| +
 | ||||
| +    # LibreSSL 3.5.0+ doesn't support other wildcard certificates
 | ||||
| +    # (it isn't required to, as RFC states MAY, not MUST)
 | ||||
| +    return if libressl?(3, 5, 0)
 | ||||
| +
 | ||||
|      assert_equal(true, OpenSSL::SSL.verify_certificate_identity( | ||||
|        create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com')) | ||||
|      assert_equal(true, OpenSSL::SSL.verify_certificate_identity( | ||||
|        create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com')) | ||||
| +
 | ||||
|      # Section 6.4.3 of RFC6125 states that client should NOT match identifier | ||||
|      # where wildcard is other than left-most label. | ||||
|      # | ||||
| @@ -1563,6 +1569,99 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
 | ||||
|      end | ||||
|    end | ||||
|   | ||||
| +  def test_ciphersuites_method_tls_connection
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +    if !tls13_supported? || !ssl_ctx.respond_to?(:ciphersuites=)
 | ||||
| +      pend 'TLS 1.3 not supported'
 | ||||
| +    end
 | ||||
| +
 | ||||
| +    csuite = ['TLS_AES_128_GCM_SHA256', 'TLSv1.3', 128, 128]
 | ||||
| +    inputs = [csuite[0], [csuite[0]], [csuite]]
 | ||||
| +
 | ||||
| +    start_server do |port|
 | ||||
| +      inputs.each do |input|
 | ||||
| +        cli_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +        cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_3_VERSION
 | ||||
| +        cli_ctx.ciphersuites = input
 | ||||
| +
 | ||||
| +        server_connect(port, cli_ctx) do |ssl|
 | ||||
| +          assert_equal('TLSv1.3', ssl.ssl_version)
 | ||||
| +          if libressl?(3, 4, 0) && !libressl?(3, 5, 0)
 | ||||
| +            assert_equal("AEAD-AES128-GCM-SHA256", ssl.cipher[0]) 
 | ||||
| +          else
 | ||||
| +            assert_equal(csuite[0], ssl.cipher[0]) 
 | ||||
| +          end
 | ||||
| +          ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
 | ||||
| +        end
 | ||||
| +      end
 | ||||
| +    end
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphersuites_method_nil_argument
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
 | ||||
| +
 | ||||
| +    assert_nothing_raised { ssl_ctx.ciphersuites = nil }
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphersuites_method_frozen_object
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
 | ||||
| +
 | ||||
| +    ssl_ctx.freeze
 | ||||
| +    assert_raise(FrozenError) { ssl_ctx.ciphersuites = 'TLS_AES_256_GCM_SHA384' }
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphersuites_method_bogus_csuite
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +    pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
 | ||||
| +
 | ||||
| +    assert_raise_with_message(
 | ||||
| +      OpenSSL::SSL::SSLError,
 | ||||
| +      /SSL_CTX_set_ciphersuites: no cipher match/i
 | ||||
| +    ) { ssl_ctx.ciphersuites = 'BOGUS' }
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphers_method_tls_connection
 | ||||
| +    csuite = ['ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1.2', 256, 256]
 | ||||
| +    inputs = [csuite[0], [csuite[0]], [csuite]]
 | ||||
| +
 | ||||
| +    start_server do |port|
 | ||||
| +      inputs.each do |input|
 | ||||
| +        cli_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +        cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
 | ||||
| +        cli_ctx.ciphers = input
 | ||||
| +
 | ||||
| +        server_connect(port, cli_ctx) do |ssl|
 | ||||
| +          assert_equal('TLSv1.2', ssl.ssl_version)
 | ||||
| +          assert_equal(csuite[0], ssl.cipher[0])
 | ||||
| +          ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
 | ||||
| +        end
 | ||||
| +      end
 | ||||
| +    end
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphers_method_nil_argument
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +    assert_nothing_raised { ssl_ctx.ciphers = nil }
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphers_method_frozen_object
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +
 | ||||
| +    ssl_ctx.freeze
 | ||||
| +    assert_raise(FrozenError) { ssl_ctx.ciphers = 'ECDHE-RSA-AES128-SHA' }
 | ||||
| +  end
 | ||||
| +
 | ||||
| +  def test_ciphers_method_bogus_csuite
 | ||||
| +    ssl_ctx = OpenSSL::SSL::SSLContext.new
 | ||||
| +
 | ||||
| +    assert_raise_with_message(
 | ||||
| +      OpenSSL::SSL::SSLError,
 | ||||
| +      /SSL_CTX_set_cipher_list: no cipher match/i
 | ||||
| +    ) { ssl_ctx.ciphers = 'BOGUS' }
 | ||||
| +  end
 | ||||
| +
 | ||||
|    def test_connect_works_when_setting_dh_callback_to_nil | ||||
|      ctx_proc = -> ctx { | ||||
|        ctx.max_version = :TLS1_2 | ||||
| diff --git a/test/openssl/test_x509cert.rb b/test/openssl/test_x509cert.rb
 | ||||
| index d696b98..4e2bd0c 100644
 | ||||
| --- a/test/openssl/test_x509cert.rb
 | ||||
| +++ b/test/openssl/test_x509cert.rb
 | ||||
| @@ -180,6 +180,7 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
 | ||||
|      assert_equal(false, certificate_error_returns_false { cert.verify(@dsa512) }) | ||||
|      cert.serial = 2 | ||||
|      assert_equal(false, cert.verify(@rsa2048)) | ||||
| +  rescue OpenSSL::X509::CertificateError # RHEL 9 disables SHA1
 | ||||
|    end | ||||
|   | ||||
|    def test_sign_and_verify_rsa_md5 | ||||
| @@ -226,9 +227,8 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
 | ||||
|      assert_equal("dsa_with_SHA256", cert.signature_algorithm) | ||||
|      # TODO: need more tests for dsa + sha2 | ||||
|   | ||||
| -    # SHA1 is allowed from OpenSSL 1.0.0 (0.9.8 requires DSS1)
 | ||||
| -    cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha1")
 | ||||
| -    assert_equal("dsaWithSHA1", cert.signature_algorithm)
 | ||||
| +    cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha512")
 | ||||
| +    assert_equal("dsa_with_SHA512", cert.signature_algorithm)
 | ||||
|    end | ||||
|   | ||||
|    def test_check_private_key | ||||
| diff --git a/test/openssl/test_x509crl.rb b/test/openssl/test_x509crl.rb
 | ||||
| index bcdb0a6..146ee07 100644
 | ||||
| --- a/test/openssl/test_x509crl.rb
 | ||||
| +++ b/test/openssl/test_x509crl.rb
 | ||||
| @@ -20,7 +20,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|   | ||||
|      cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil) | ||||
|      crl = issue_crl([], 1, now, now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(1, crl.version) | ||||
|      assert_equal(cert.issuer.to_der, crl.issuer.to_der) | ||||
|      assert_equal(now, crl.last_update) | ||||
| @@ -57,7 +57,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|      ] | ||||
|      cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil) | ||||
|      crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      revoked = crl.revoked | ||||
|      assert_equal(5, revoked.size) | ||||
|      assert_equal(1, revoked[0].serial) | ||||
| @@ -98,7 +98,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|   | ||||
|      revoke_info = (1..1000).collect{|i| [i, now, 0] } | ||||
|      crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      revoked = crl.revoked | ||||
|      assert_equal(1000, revoked.size) | ||||
|      assert_equal(1, revoked[0].serial) | ||||
| @@ -124,7 +124,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|   | ||||
|      cert = issue_cert(@ca, @rsa2048, 1, cert_exts, nil, nil) | ||||
|      crl = issue_crl([], 1, Time.now, Time.now+1600, crl_exts, | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      exts = crl.extensions | ||||
|      assert_equal(3, exts.size) | ||||
|      assert_equal("1", exts[0].value) | ||||
| @@ -160,24 +160,24 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|      assert_equal(false, exts[2].critical?) | ||||
|   | ||||
|      no_ext_crl = issue_crl([], 1, Time.now, Time.now+1600, [], | ||||
| -      cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +      cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal nil, no_ext_crl.authority_key_identifier | ||||
|    end | ||||
|   | ||||
|    def test_crlnumber | ||||
|      cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil) | ||||
|      crl = issue_crl([], 1, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_match(1.to_s, crl.extensions[0].value) | ||||
|      assert_match(/X509v3 CRL Number:\s+#{1}/m, crl.to_text) | ||||
|   | ||||
|      crl = issue_crl([], 2**32, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_match((2**32).to_s, crl.extensions[0].value) | ||||
|      assert_match(/X509v3 CRL Number:\s+#{2**32}/m, crl.to_text) | ||||
|   | ||||
|      crl = issue_crl([], 2**100, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_match(/X509v3 CRL Number:\s+#{2**100}/m, crl.to_text) | ||||
|      assert_match((2**100).to_s, crl.extensions[0].value) | ||||
|    end | ||||
| @@ -185,7 +185,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|    def test_sign_and_verify | ||||
|      cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil) | ||||
|      crl = issue_crl([], 1, Time.now, Time.now+1600, [], | ||||
| -                    cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(false, crl.verify(@rsa1024)) | ||||
|      assert_equal(true,  crl.verify(@rsa2048)) | ||||
|      assert_equal(false, crl_error_returns_false { crl.verify(@dsa256) }) | ||||
| @@ -195,7 +195,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
 | ||||
|   | ||||
|      cert = issue_cert(@ca, @dsa512, 1, [], nil, nil) | ||||
|      crl = issue_crl([], 1, Time.now, Time.now+1600, [], | ||||
| -                    cert, @dsa512, OpenSSL::Digest.new('SHA1'))
 | ||||
| +                    cert, @dsa512, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(false, crl_error_returns_false { crl.verify(@rsa1024) }) | ||||
|      assert_equal(false, crl_error_returns_false { crl.verify(@rsa2048) }) | ||||
|      assert_equal(false, crl.verify(@dsa256)) | ||||
| diff --git a/test/openssl/test_x509req.rb b/test/openssl/test_x509req.rb
 | ||||
| index ee9c678..a84b162 100644
 | ||||
| --- a/test/openssl/test_x509req.rb
 | ||||
| +++ b/test/openssl/test_x509req.rb
 | ||||
| @@ -23,31 +23,31 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
 | ||||
|    end | ||||
|   | ||||
|    def test_public_key | ||||
| -    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der) | ||||
|      req = OpenSSL::X509::Request.new(req.to_der) | ||||
|      assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der) | ||||
|   | ||||
| -    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(@dsa512.public_key.to_der, req.public_key.to_der) | ||||
|      req = OpenSSL::X509::Request.new(req.to_der) | ||||
|      assert_equal(@dsa512.public_key.to_der, req.public_key.to_der) | ||||
|    end | ||||
|   | ||||
|    def test_version | ||||
| -    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(0, req.version) | ||||
|      req = OpenSSL::X509::Request.new(req.to_der) | ||||
|      assert_equal(0, req.version) | ||||
|   | ||||
| -    req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(1, req.version) | ||||
|      req = OpenSSL::X509::Request.new(req.to_der) | ||||
|      assert_equal(1, req.version) | ||||
|    end | ||||
|   | ||||
|    def test_subject | ||||
| -    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(@dn.to_der, req.subject.to_der) | ||||
|      req = OpenSSL::X509::Request.new(req.to_der) | ||||
|      assert_equal(@dn.to_der, req.subject.to_der) | ||||
| @@ -78,9 +78,9 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
 | ||||
|        OpenSSL::X509::Attribute.new("msExtReq", attrval), | ||||
|      ] | ||||
|   | ||||
| -    req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      attrs.each{|attr| req0.add_attribute(attr) } | ||||
| -    req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      req1.attributes = attrs | ||||
|      assert_equal(req0.to_der, req1.to_der) | ||||
|   | ||||
| @@ -101,7 +101,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
 | ||||
|    end | ||||
|   | ||||
|    def test_sign_and_verify_rsa_sha1 | ||||
| -    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(true,  req.verify(@rsa1024)) | ||||
|      assert_equal(false, req.verify(@rsa2048)) | ||||
|      assert_equal(false, request_error_returns_false { req.verify(@dsa256) }) | ||||
| @@ -122,7 +122,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
 | ||||
|    end | ||||
|   | ||||
|    def test_sign_and_verify_dsa | ||||
| -    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(false, request_error_returns_false { req.verify(@rsa1024) }) | ||||
|      assert_equal(false, request_error_returns_false { req.verify(@rsa2048) }) | ||||
|      assert_equal(false, req.verify(@dsa256)) | ||||
| @@ -137,13 +137,13 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
 | ||||
|    end | ||||
|   | ||||
|    def test_dup | ||||
| -    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
 | ||||
| +    req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
 | ||||
|      assert_equal(req.to_der, req.dup.to_der) | ||||
|    end | ||||
|   | ||||
|    def test_eq | ||||
| -    req1 = issue_csr(0, @dn, @rsa1024, "sha1")
 | ||||
| -    req2 = issue_csr(0, @dn, @rsa1024, "sha1")
 | ||||
| +    req1 = issue_csr(0, @dn, @rsa1024, "sha512")
 | ||||
| +    req2 = issue_csr(0, @dn, @rsa1024, "sha512")
 | ||||
|      req3 = issue_csr(0, @dn, @rsa1024, "sha256") | ||||
|   | ||||
|      assert_equal false, req1 == 12345 | ||||
| @ -0,0 +1,338 @@ | ||||
| From 111f8422427d78becc9183ae149b2105a16bf327 Mon Sep 17 00:00:00 2001 | ||||
| From: Nobuyoshi Nakada <nobu@ruby-lang.org> | ||||
| Date: Tue, 5 Apr 2022 23:24:00 +0900 | ||||
| Subject: [PATCH 1/5] Bundled gems are expanded under `.bundle/gems` now | ||||
| 
 | ||||
| ---
 | ||||
|  ext/extmk.rb          | 13 +++++++------ | ||||
|  template/exts.mk.tmpl |  2 +- | ||||
|  2 files changed, 8 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/ext/extmk.rb b/ext/extmk.rb
 | ||||
| index 4a087f294ac9..1da9e2704521 100755
 | ||||
| --- a/ext/extmk.rb
 | ||||
| +++ b/ext/extmk.rb
 | ||||
| @@ -146,7 +146,7 @@ def extmake(target, basedir = 'ext', maybestatic = true)
 | ||||
|      top_srcdir = $top_srcdir | ||||
|      topdir = $topdir | ||||
|      hdrdir = $hdrdir | ||||
| -    prefix = "../" * (target.count("/")+1)
 | ||||
| +    prefix = "../" * (basedir.count("/")+target.count("/")+1)
 | ||||
|      $top_srcdir = relative_from(top_srcdir, prefix) | ||||
|      $hdrdir = relative_from(hdrdir, prefix) | ||||
|      $topdir = prefix + $topdir | ||||
| @@ -460,10 +460,11 @@ def $mflags.defined?(var)
 | ||||
|  end unless $extstatic | ||||
|   | ||||
|  @gemname = nil | ||||
| -if ARGV[0]
 | ||||
| -  ext_prefix, exts = ARGV.shift.split('/', 2)
 | ||||
| +if exts = ARGV.shift
 | ||||
| +  ext_prefix = exts[%r[\A(?>\.bundle/)?[^/]+(?:/(?=(.+)?)|\z)]]
 | ||||
| +  exts = $1
 | ||||
|    $extension = [exts] if exts | ||||
| -  if ext_prefix == 'gems'
 | ||||
| +  if ext_prefix.start_with?('.')
 | ||||
|      @gemname = exts | ||||
|    elsif exts | ||||
|      $static_ext.delete_if {|t, *| !File.fnmatch(t, exts)} | ||||
| @@ -515,7 +516,7 @@ def $mflags.defined?(var)
 | ||||
|      exts.delete_if {|d| File.fnmatch?("-*", d)} | ||||
|    end | ||||
|  end | ||||
| -ext_prefix = File.basename(ext_prefix)
 | ||||
| +ext_prefix = ext_prefix[$top_srcdir.size+1..-2]
 | ||||
|   | ||||
|  extend Module.new { | ||||
|    def timestamp_file(name, target_prefix = nil) | ||||
| @@ -634,7 +635,7 @@ def initialize(src)
 | ||||
|    end | ||||
|  } | ||||
|   | ||||
| -Dir.chdir ".."
 | ||||
| +Dir.chdir dir
 | ||||
|  unless $destdir.to_s.empty? | ||||
|    $mflags.defined?("DESTDIR") or $mflags << "DESTDIR=#{$destdir}" | ||||
|  end | ||||
| diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
 | ||||
| index 2f37f4480ac5..964939e365a1 100644
 | ||||
| --- a/template/exts.mk.tmpl
 | ||||
| +++ b/template/exts.mk.tmpl
 | ||||
| @@ -25,7 +25,7 @@ macros["old_extensions"] = []
 | ||||
|   | ||||
|  contpat = /(?>(?>[^\\\n]|\\.)*\\\n)*(?>[^\\\n]|\\.)*/ | ||||
|  Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e| | ||||
| -  gem = /\Agems(?=\/)/ =~ e
 | ||||
| +  gem = e.start_with?(".bundle/gems/")
 | ||||
|    s = File.read(e) | ||||
|    s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v| | ||||
|      v.gsub!(/\\\n[ \t]*/, ' ') | ||||
| 
 | ||||
| From 6ea34cac22131d28a9cc50e7875e854aed9bdb88 Mon Sep 17 00:00:00 2001 | ||||
| From: Nobuyoshi Nakada <nobu@ruby-lang.org> | ||||
| Date: Wed, 6 Apr 2022 20:25:53 +0900 | ||||
| Subject: [PATCH 2/5] Retrieve configured gems info | ||||
| 
 | ||||
| ---
 | ||||
|  template/configure-ext.mk.tmpl | 2 +- | ||||
|  template/exts.mk.tmpl          | 4 ++-- | ||||
|  2 files changed, 3 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/template/configure-ext.mk.tmpl b/template/configure-ext.mk.tmpl
 | ||||
| index 6636a7759c54..8ba6b963e3ec 100644
 | ||||
| --- a/template/configure-ext.mk.tmpl
 | ||||
| +++ b/template/configure-ext.mk.tmpl
 | ||||
| @@ -27,7 +27,7 @@ SCRIPT_ARGS = <%=script_args.gsub("#", "\\#")%>
 | ||||
|  EXTMK_ARGS = $(SCRIPT_ARGS) --gnumake=$(gnumake) --extflags="$(EXTLDFLAGS)" \ | ||||
|  	   --make-flags="MINIRUBY='$(MINIRUBY)'" | ||||
|   | ||||
| -all: exts # gems
 | ||||
| +all: exts gems
 | ||||
|  exts: | ||||
|  gems: | ||||
|   | ||||
| diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
 | ||||
| index 964939e365a1..e544c4c88bd7 100644
 | ||||
| --- a/template/exts.mk.tmpl
 | ||||
| +++ b/template/exts.mk.tmpl
 | ||||
| @@ -19,7 +19,7 @@ opt = OptionParser.new do |o|
 | ||||
|    o.on('--configure-exts=FILE') {|v| confexts = v} | ||||
|    o.order!(ARGV) | ||||
|  end | ||||
| -confexts &&= File.read(confexts).scan(/^exts: (.*\.mk)/).flatten rescue nil
 | ||||
| +confexts &&= File.read(confexts).scan(/^(?:ext|gem)s: (.*\.mk)/).flatten rescue nil
 | ||||
|  confexts ||= [] | ||||
|  macros["old_extensions"] = [] | ||||
|   | ||||
| @@ -30,7 +30,7 @@ Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e|
 | ||||
|    s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v| | ||||
|      v.gsub!(/\\\n[ \t]*/, ' ') | ||||
|      next if v.empty? | ||||
| -    next if gem and n != "extensions"
 | ||||
| +    next if n != "extensions"
 | ||||
|      n = "old_extensions" if n == "extensions" and !confexts.include?(e) | ||||
|      v = v.split | ||||
|      m = macros[n] ||= [] | ||||
| 
 | ||||
| From be9d00ee7c72766551ba8c3530f1538034498a6a Mon Sep 17 00:00:00 2001 | ||||
| From: Nobuyoshi Nakada <nobu@ruby-lang.org> | ||||
| Date: Wed, 6 Apr 2022 20:28:00 +0900 | ||||
| Subject: [PATCH 3/5] Move the target directory of bundled gems like as | ||||
|  rubygems | ||||
| 
 | ||||
| ---
 | ||||
|  ext/extmk.rb | 6 +++++- | ||||
|  1 file changed, 5 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/ext/extmk.rb b/ext/extmk.rb
 | ||||
| index 1da9e2704521..a440af27fc5d 100755
 | ||||
| --- a/ext/extmk.rb
 | ||||
| +++ b/ext/extmk.rb
 | ||||
| @@ -2,6 +2,9 @@
 | ||||
|  # -*- mode: ruby; coding: us-ascii -*- | ||||
|  # frozen_string_literal: false | ||||
|   | ||||
| +module Gem; end # only needs Gem::Platform
 | ||||
| +require 'rubygems/platform'
 | ||||
| +
 | ||||
|  # :stopdoc: | ||||
|  $extension = nil | ||||
|  $extstatic = nil | ||||
| @@ -535,11 +538,12 @@ def create_makefile(*args, &block)
 | ||||
|      super(*args) do |conf| | ||||
|        conf.find do |s| | ||||
|          s.sub!(/^(TARGET_SO_DIR *= *)\$\(RUBYARCHDIR\)/) { | ||||
| -          "TARGET_GEM_DIR = $(extout)/gems/$(arch)/#{@gemname}\n"\
 | ||||
| +          "TARGET_GEM_DIR = $(topdir)/.bundle/extensions/$(gem_platform)/$(ruby_version)/#{@gemname}\n"\
 | ||||
|            "#{$1}$(TARGET_GEM_DIR)$(target_prefix)" | ||||
|          } | ||||
|        end | ||||
|        conf.any? {|s| /^TARGET *= *\S/ =~ s} and conf << %{ | ||||
| +gem_platform = #{Gem::Platform.local}
 | ||||
|   | ||||
|  # default target | ||||
|  all: | ||||
| 
 | ||||
| From c4daf8e445925695c34bab8bf5135dcd1e8575a3 Mon Sep 17 00:00:00 2001 | ||||
| From: Nobuyoshi Nakada <nobu@ruby-lang.org> | ||||
| Date: Wed, 6 Apr 2022 22:57:01 +0900 | ||||
| Subject: [PATCH 4/5] Obey spec file locations to rubygems | ||||
| 
 | ||||
| ---
 | ||||
|  common.mk          | 3 ++- | ||||
|  defs/gmake.mk      | 2 +- | ||||
|  tool/gem-unpack.rb | 5 +++-- | ||||
|  3 files changed, 6 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/common.mk b/common.mk
 | ||||
| index 7c552cba1e04..b4adb2729c0e 100644
 | ||||
| --- a/common.mk
 | ||||
| +++ b/common.mk
 | ||||
| @@ -1359,10 +1359,11 @@ extract-gems$(gnumake:yes=-nongnumake): PHONY
 | ||||
|  	$(Q) $(RUNRUBY) -C "$(srcdir)" \ | ||||
|  	    -Itool -rgem-unpack -answ \ | ||||
|  	    -e 'BEGIN {FileUtils.mkdir_p(d = ".bundle/gems")}' \ | ||||
| +	    -e 'BEGIN {FileUtils.mkdir_p(s = ".bundle/specifications")}' \
 | ||||
|  	    -e 'gem, ver = *$$F' \ | ||||
|  	    -e 'next if !ver or /^#/=~gem' \ | ||||
|  	    -e 'g = "#{gem}-#{ver}"' \ | ||||
| -	    -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d)' \
 | ||||
| +	    -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d, s)' \
 | ||||
|  	    gems/bundled_gems | ||||
|   | ||||
|  update-bundled_gems: PHONY | ||||
| diff --git a/defs/gmake.mk b/defs/gmake.mk
 | ||||
| index a625379a6804..27e3e21cc4d6 100644
 | ||||
| --- a/defs/gmake.mk
 | ||||
| +++ b/defs/gmake.mk
 | ||||
| @@ -290,7 +290,7 @@ extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems))
 | ||||
|  	$(ECHO) Extracting bundle gem $*... | ||||
|  	$(Q) $(BASERUBY) -C "$(srcdir)" \ | ||||
|  	    -Itool -rgem-unpack \ | ||||
| -	    -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems")'
 | ||||
| +	    -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems", ".bundle/specifications")'
 | ||||
|   | ||||
|  $(srcdir)/.bundle/gems: | ||||
|  	$(MAKEDIRS) $@ | ||||
| diff --git a/tool/gem-unpack.rb b/tool/gem-unpack.rb
 | ||||
| index cb05719463f2..fe10b0e420fa 100644
 | ||||
| --- a/tool/gem-unpack.rb
 | ||||
| +++ b/tool/gem-unpack.rb
 | ||||
| @@ -5,13 +5,14 @@
 | ||||
|  # This library is used by "make extract-gems" to | ||||
|  # unpack bundled gem files. | ||||
|   | ||||
| -def Gem.unpack(file, dir = nil)
 | ||||
| +def Gem.unpack(file, dir = nil, spec_dir = nil)
 | ||||
|    pkg = Gem::Package.new(file) | ||||
|    spec = pkg.spec | ||||
|    target = spec.full_name | ||||
|    target = File.join(dir, target) if dir | ||||
|    pkg.extract_files target | ||||
| -  spec_file = File.join(target, "#{spec.name}-#{spec.version}.gemspec")
 | ||||
| +  FileUtils.mkdir_p(spec_dir ||= target)
 | ||||
| +  spec_file = File.join(spec_dir, "#{spec.name}-#{spec.version}.gemspec")
 | ||||
|    open(spec_file, 'wb') do |f| | ||||
|      f.print spec.to_ruby | ||||
|    end | ||||
| 
 | ||||
| From 3de652d8198be9cd2998c095903889a80e738275 Mon Sep 17 00:00:00 2001 | ||||
| From: Nobuyoshi Nakada <nobu@ruby-lang.org> | ||||
| Date: Thu, 7 Apr 2022 01:44:43 +0900 | ||||
| Subject: [PATCH 5/5] Install built gem extension binaries | ||||
| 
 | ||||
| ---
 | ||||
|  tool/rbinstall.rb | 56 ++++++++++++++--------------------------------- | ||||
|  1 file changed, 16 insertions(+), 40 deletions(-) | ||||
| 
 | ||||
| diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
 | ||||
| index 9d9b672be472..624961b4eee6 100755
 | ||||
| --- a/tool/rbinstall.rb
 | ||||
| +++ b/tool/rbinstall.rb
 | ||||
| @@ -858,6 +858,9 @@ class UnpackedInstaller < GemInstaller
 | ||||
|      def write_cache_file | ||||
|      end | ||||
|   | ||||
| +    def build_extensions
 | ||||
| +    end
 | ||||
| +
 | ||||
|      def shebang(bin_file_name) | ||||
|        path = File.join(gem_dir, spec.bindir, bin_file_name) | ||||
|        first_line = File.open(path, "rb") {|file| file.gets} | ||||
| @@ -940,13 +943,12 @@ def ensure_writable_dir(dir)
 | ||||
|    install_default_gem('ext', srcdir, bindir) | ||||
|  end | ||||
|   | ||||
| -def load_gemspec(file, expanded = false)
 | ||||
| +def load_gemspec(file, base = nil)
 | ||||
|    file = File.realpath(file) | ||||
|    code = File.read(file, encoding: "utf-8:-") | ||||
|    code.gsub!(/(?:`git[^\`]*`|%x\[git[^\]]*\])\.split\([^\)]*\)/m) do | ||||
|      files = [] | ||||
| -    if expanded
 | ||||
| -      base = File.dirname(file)
 | ||||
| +    if base
 | ||||
|        Dir.glob("**/*", File::FNM_DOTMATCH, base: base) do |n| | ||||
|          case File.basename(n); when ".", ".."; next; end | ||||
|          next if File.directory?(File.join(base, n)) | ||||
| @@ -959,7 +961,7 @@ def load_gemspec(file, expanded = false)
 | ||||
|    unless Gem::Specification === spec | ||||
|      raise TypeError, "[#{file}] isn't a Gem::Specification (#{spec.class} instead)." | ||||
|    end | ||||
| -  spec.loaded_from = file
 | ||||
| +  spec.loaded_from = base ? File.join(base, File.basename(file)) : file
 | ||||
|    spec.files.reject! {|n| n.end_with?(".gemspec") or n.start_with?(".git")} | ||||
|   | ||||
|    spec | ||||
| @@ -1014,20 +1016,6 @@ def install_default_gem(dir, srcdir, bindir)
 | ||||
|  end | ||||
|   | ||||
|  install?(:ext, :comm, :gem, :'bundled-gems') do | ||||
| -  if CONFIG['CROSS_COMPILING'] == 'yes'
 | ||||
| -    # The following hacky steps set "$ruby = BASERUBY" in tool/fake.rb
 | ||||
| -    $hdrdir = ''
 | ||||
| -    $extmk = nil
 | ||||
| -    $ruby = nil  # ...
 | ||||
| -    ruby_path = $ruby + " -I#{Dir.pwd}" # $baseruby + " -I#{Dir.pwd}"
 | ||||
| -  else
 | ||||
| -    # ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name)))
 | ||||
| -    ENV['RUBYLIB'] = nil
 | ||||
| -    ENV['RUBYOPT'] = nil
 | ||||
| -    ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name))) + " --disable=gems -I#{with_destdir(archlibdir)}"
 | ||||
| -  end
 | ||||
| -  Gem.instance_variable_set(:@ruby, ruby_path) if Gem.ruby != ruby_path
 | ||||
| -
 | ||||
|    gem_dir = Gem.default_dir | ||||
|    install_dir = with_destdir(gem_dir) | ||||
|    prepare "bundled gems", gem_dir | ||||
| @@ -1047,40 +1035,28 @@ def install_default_gem(dir, srcdir, bindir)
 | ||||
|      :wrappers => true, | ||||
|      :format_executable => true, | ||||
|    } | ||||
| -  gem_ext_dir = "#$extout/gems/#{CONFIG['arch']}"
 | ||||
| -  extensions_dir = with_destdir(Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir)
 | ||||
| +
 | ||||
| +  extensions_dir = Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir
 | ||||
| +  specifications_dir = File.join(gem_dir, "specifications")
 | ||||
| +  build_dir = Gem::StubSpecification.gemspec_stub("", ".bundle", ".bundle").extensions_dir
 | ||||
|   | ||||
|    File.foreach("#{srcdir}/gems/bundled_gems") do |name| | ||||
|      next if /^\s*(?:#|$)/ =~ name | ||||
|      next unless /^(\S+)\s+(\S+).*/ =~ name | ||||
|      gem_name = "#$1-#$2" | ||||
| -    path = "#{srcdir}/.bundle/gems/#{gem_name}/#{gem_name}.gemspec"
 | ||||
| -    if File.exist?(path)
 | ||||
| -      spec = load_gemspec(path)
 | ||||
| -    else
 | ||||
| -      path = "#{srcdir}/.bundle/gems/#{gem_name}/#$1.gemspec"
 | ||||
| -      next unless File.exist?(path)
 | ||||
| -      spec = load_gemspec(path, true)
 | ||||
| -    end
 | ||||
| +    path = "#{srcdir}/.bundle/specifications/#{gem_name}.gemspec"
 | ||||
| +    next unless File.exist?(path)
 | ||||
| +    spec = load_gemspec(path, "#{srcdir}/.bundle/gems/#{gem_name}")
 | ||||
|      next unless spec.platform == Gem::Platform::RUBY | ||||
|      next unless spec.full_name == gem_name | ||||
| -    if !spec.extensions.empty? && CONFIG["EXTSTATIC"] == "static"
 | ||||
| -      puts "skip installation of #{spec.name} #{spec.version}; bundled gem with an extension library is not supported on --with-static-linked-ext"
 | ||||
| -      next
 | ||||
| -    end
 | ||||
|      spec.extension_dir = "#{extensions_dir}/#{spec.full_name}" | ||||
| -    if File.directory?(ext = "#{gem_ext_dir}/#{spec.full_name}")
 | ||||
| -      spec.extensions[0] ||= "-"
 | ||||
| -    end
 | ||||
|      package = RbInstall::DirPackage.new spec | ||||
|      ins = RbInstall::UnpackedInstaller.new(package, options) | ||||
|      puts "#{INDENT}#{spec.name} #{spec.version}" | ||||
|      ins.install | ||||
| -    unless $dryrun
 | ||||
| -      File.chmod($data_mode, File.join(install_dir, "specifications", "#{spec.full_name}.gemspec"))
 | ||||
| -    end
 | ||||
| -    unless spec.extensions.empty?
 | ||||
| -      install_recursive(ext, spec.extension_dir)
 | ||||
| +    install_recursive("#{build_dir}/#{gem_name}", "#{extensions_dir}/#{gem_name}") do |src, dest|
 | ||||
| +      # puts "#{INDENT}    #{dest[extensions_dir.size+gem_name.size+2..-1]}"
 | ||||
| +      install src, dest, :mode => (File.executable?(src) ? $prog_mode : $data_mode)
 | ||||
|      end | ||||
|      installed_gems[spec.full_name] = true | ||||
|    end | ||||
| @ -0,0 +1,256 @@ | ||||
| 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 | ||||
| ``` | ||||
| 
 | ||||
| == 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
 | ||||
| @@ -4980,6 +4980,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) | ||||
|  { | ||||
| @@ -5000,6 +5017,7 @@ read_barrier_handler(uintptr_t address)
 | ||||
|      } | ||||
|      RB_VM_LOCK_LEAVE(); | ||||
|  } | ||||
| +#endif
 | ||||
|   | ||||
|  #if defined(_WIN32) | ||||
|  static LPTOP_LEVEL_EXCEPTION_FILTER old_handler; | ||||
| @@ -9250,13 +9268,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; | ||||
|      } | ||||
| @@ -9421,7 +9433,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) | ||||
|  { | ||||
| @@ -10149,7 +10161,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}} | ||||
| @@ -10190,7 +10202,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) | ||||
|  { | ||||
| @@ -10269,7 +10281,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 | ||||
| @@ -10800,7 +10812,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 | ||||
| @@ -10814,8 +10826,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; | ||||
| @@ -10824,7 +10835,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 | ||||
| @@ -13696,11 +13708,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); | ||||
| @@ -13724,6 +13746,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,402 @@ | ||||
| commit 6d1ca6737f31b2e24664a093f1827dd74a121a9f | ||||
| Author: Jarek Prokop <jprokop@redhat.com> | ||||
| Date:   Thu May 26 11:28:13 2022 +0200 | ||||
| 
 | ||||
|     Gc ppc64le fix | ||||
| 
 | ||||
| diff --git a/gc.c b/gc.c
 | ||||
| index ef9327df1f..1c35856c44 100644
 | ||||
| --- a/gc.c
 | ||||
| +++ b/gc.c
 | ||||
| @@ -9421,6 +9421,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) | ||||
|  { | ||||
| @@ -9468,6 +9469,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) | ||||
| @@ -10147,8 +10149,21 @@ 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}}
 | ||||
| + *
 | ||||
| + *  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; | ||||
| @@ -10171,7 +10186,11 @@ gc_compact_stats(rb_execution_context_t *ec, 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) | ||||
|  { | ||||
| @@ -10221,22 +10240,78 @@ 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.
 | ||||
| + *
 | ||||
| + * To test whether GC compaction is supported, use the idiom:
 | ||||
| + *
 | ||||
| + *   GC.respond_to?(:compact)
 | ||||
| + */
 | ||||
|  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);
 | ||||
|  } | ||||
| +#else
 | ||||
| +#  define gc_compact rb_f_notimplement
 | ||||
| +#endif
 | ||||
|   | ||||
| +#if GC_COMPACTION_SUPPORTED
 | ||||
| +/*
 | ||||
| + * 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(); | ||||
|      { | ||||
| @@ -10256,13 +10331,16 @@ 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);
 | ||||
|  } | ||||
| +#else
 | ||||
| +#  define gc_verify_compaction_references rb_f_notimplement
 | ||||
| +#endif
 | ||||
|   | ||||
|  VALUE | ||||
|  rb_gc_start(void) | ||||
| @@ -10722,26 +10800,45 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
 | ||||
|      return rb_gc_disable(); | ||||
|  } | ||||
|   | ||||
| +#if GC_COMPACTION_SUPPORTED
 | ||||
| +/*
 | ||||
| + *  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. */ | ||||
| -#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
 | ||||
| + *
 | ||||
| + *  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); | ||||
|  } | ||||
| +#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) | ||||
| @@ -13599,6 +13696,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/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 | ||||
| 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 | ||||
|    # | ||||
| @ -0,0 +1,502 @@ | ||||
| --- ruby-3.1.2/gc.rbinc	2022-04-12 13:11:17.000000000 +0200
 | ||||
| +++ ruby/gc.rbinc	2022-06-08 12:49:16.288024971 +0200
 | ||||
| @@ -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.2/miniprelude.c	2022-04-12 13:11:17.000000000 +0200
 | ||||
| +++ ruby/miniprelude.c	2022-06-08 12:49:16.377024871 +0200
 | ||||
| @@ -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>"; | ||||
| @@ -3305,7 +3234,7 @@
 | ||||
|  "    }\n" | ||||
|  "  end\n" | ||||
|  "end\n" | ||||
| -#line 3309 "miniprelude.c"
 | ||||
| +#line 3238 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  static const char prelude_name12[] = "<internal:timev>"; | ||||
| @@ -3628,7 +3557,7 @@
 | ||||
|  "    Primitive.time_init_args(year, mon, mday, hour, min, sec, zone)\n" | ||||
|  "  end\n" | ||||
|  "end\n" | ||||
| -#line 3632 "miniprelude.c"
 | ||||
| +#line 3561 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  static const char prelude_name13[] = "<internal:nilclass>"; | ||||
| @@ -3661,7 +3590,7 @@
 | ||||
|  "    return 0.0\n" | ||||
|  "  end\n" | ||||
|  "end\n" | ||||
| -#line 3665 "miniprelude.c"
 | ||||
| +#line 3594 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  static const char prelude_name14[] = "<internal:prelude>"; | ||||
| @@ -3691,7 +3620,7 @@
 | ||||
|  "\n" | ||||
|  "  private :pp\n" | ||||
|  "end\n" | ||||
| -#line 3695 "miniprelude.c"
 | ||||
| +#line 3624 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  static const char prelude_name15[] = "<internal:gem_prelude>"; | ||||
| @@ -3718,7 +3647,7 @@
 | ||||
|  "rescue LoadError\n" | ||||
|  "  warn \"`did_you_mean' was not loaded.\"\n" | ||||
|  "end if defined?(DidYouMean)\n" | ||||
| -#line 3722 "miniprelude.c"
 | ||||
| +#line 3651 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  static const char prelude_name16[] = "<internal:yjit>"; | ||||
| @@ -4059,7 +3988,7 @@
 | ||||
|  "    end\n" | ||||
|  "  end\n" | ||||
|  "end\n" | ||||
| -#line 4063 "miniprelude.c"
 | ||||
| +#line 3992 "miniprelude.c"
 | ||||
|  }; | ||||
|   | ||||
|  COMPILER_WARNING_POP | ||||
| @ -0,0 +1,31 @@ | ||||
| From bfa2f72cfa3bfde34049d26dcb24976316074ad7 Mon Sep 17 00:00:00 2001 | ||||
| From: Jun Aruga <jaruga@redhat.com> | ||||
| Date: Mon, 21 Mar 2022 15:36:51 +0100 | ||||
| Subject: [PATCH] Fix a test for `bin/bundle update --bundler` to pass on | ||||
|  ruby/ruby. | ||||
| 
 | ||||
| Consider the case that the latest Bundler version on RubyGems is higher than | ||||
| the `system_bundler_version` (= `Bundler::VERSION`) in `make test-bundler` on | ||||
| ruby/ruby. | ||||
| 
 | ||||
| See <https://bugs.ruby-lang.org/issues/18643>. | ||||
| ---
 | ||||
|  spec/bundler/commands/binstubs_spec.rb | 5 ++++- | ||||
|  1 file changed, 4 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/spec/bundler/commands/binstubs_spec.rb b/spec/bundler/commands/binstubs_spec.rb
 | ||||
| index 198226207bc..2634f43417c 100644
 | ||||
| --- a/spec/bundler/commands/binstubs_spec.rb
 | ||||
| +++ b/spec/bundler/commands/binstubs_spec.rb
 | ||||
| @@ -226,7 +226,10 @@
 | ||||
|   | ||||
|          it "calls through to the latest bundler version" do | ||||
|            sys_exec "bin/bundle update --bundler", :env => { "DEBUG" => "1" } | ||||
| -          expect(out).to include %(Using bundler #{system_bundler_version}\n)
 | ||||
| +          using_bundler_line = /Using bundler ([\w\.]+)\n/.match(out)
 | ||||
| +          expect(using_bundler_line).to_not be_nil
 | ||||
| +          latest_version = using_bundler_line[1]
 | ||||
| +          expect(Gem::Version.new(latest_version)).to be >= Gem::Version.new(system_bundler_version)
 | ||||
|          end | ||||
|   | ||||
|          it "calls through to the explicit bundler version" do | ||||
							
								
								
									
										39
									
								
								SOURCES/ruby-exercise.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								SOURCES/ruby-exercise.stp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| /* Example tapset file. | ||||
|  * | ||||
|  * You can execute the tapset using following command (please adjust the path | ||||
|  * prior running the command, if needed): | ||||
|  *  | ||||
|  * stap /usr/share/doc/ruby-2.0.0.0/ruby-exercise.stp -c "ruby -e \"puts 'test'\"" | ||||
|  */ | ||||
| 
 | ||||
| probe ruby.cmethod.entry { | ||||
|   printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line); | ||||
| } | ||||
| 
 | ||||
| probe ruby.cmethod.return { | ||||
|   printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line); | ||||
| } | ||||
| 
 | ||||
| probe ruby.method.entry { | ||||
|   printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line); | ||||
| } | ||||
| 
 | ||||
| probe ruby.method.return { | ||||
|   printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line); | ||||
| } | ||||
| 
 | ||||
| probe ruby.gc.mark.begin { printf("%d gc.mark.begin\n", tid()); } | ||||
| 
 | ||||
| probe ruby.gc.mark.end { printf("%d gc.mark.end\n", tid()); } | ||||
| 
 | ||||
| probe ruby.gc.sweep.begin { printf("%d gc.sweep.begin\n", tid()); } | ||||
| 
 | ||||
| probe ruby.gc.sweep.end { printf("%d gc.sweep.end\n", tid()); } | ||||
| 
 | ||||
| probe ruby.object.create{ | ||||
|   printf("%d obj.create %s %s:%d\n", tid(), classname, file, line); | ||||
| } | ||||
| 
 | ||||
| probe ruby.raise { | ||||
|   printf("%d raise %s %s:%d\n", tid(), classname, file, line); | ||||
| } | ||||
							
								
								
									
										6
									
								
								SOURCES/rubygems.attr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								SOURCES/rubygems.attr
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| %__rubygems_requires	%{_rpmconfigdir}/rubygems.req | ||||
| %__rubygems_provides	%{_rpmconfigdir}/rubygems.prov | ||||
| %__rubygems_conflicts	%{_rpmconfigdir}/rubygems.con | ||||
| # In non-gem packages, the %%{gem_name} macro is not available and the macro | ||||
| # stays unexpanded which leads to "invalid regex" error (rhbz#1154067). | ||||
| %__rubygems_path	^%{?gem_name:%{gem_spec}}%{!?gem_name:this_should_never_match_anything}$ | ||||
							
								
								
									
										52
									
								
								SOURCES/rubygems.con
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								SOURCES/rubygems.con
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| #!/usr/bin/ruby | ||||
| 
 | ||||
| require 'rubygems/package' | ||||
| 
 | ||||
| module RubyGemsReq | ||||
|   module Helpers | ||||
|     # Keep only '!=' requirements. | ||||
|     def self.conflicts(requirements) | ||||
|       conflicts = requirements.select {|r| r.first == '!='} | ||||
|     end | ||||
| 
 | ||||
|     # Converts Gem::Requirement into array of requirements strings compatible | ||||
|     # with RPM .spec file. | ||||
|     def self.requirement_versions_to_rpm(requirement) | ||||
|       self.conflicts(requirement.requirements).map do |op, version| | ||||
|         version == Gem::Version.new(0) ? "" : "= #{version}" | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   # Report conflicting gem dependencies including their version. | ||||
|   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}" | ||||
|       end | ||||
|       if conflict_strings.length > 0 | ||||
|         conflict_string = conflict_strings.join(' with ') | ||||
|         conflict_string.prepend('(').concat(')') if conflict_strings.length > 1 | ||||
|         puts conflict_string | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   # Reports all conflicts specified by all provided .gemspec files. | ||||
|   def self.conflicts | ||||
|     while filename = gets | ||||
|       filename.strip! | ||||
|       begin | ||||
|         specification = Gem::Specification.load filename | ||||
| 
 | ||||
|         gem_depenencies(specification) | ||||
|       rescue => e | ||||
|         # Ignore all errors. | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| if __FILE__ == $0 | ||||
|   RubyGemsReq::conflicts | ||||
| end | ||||
							
								
								
									
										36
									
								
								SOURCES/rubygems.prov
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								SOURCES/rubygems.prov
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| #!/usr/bin/ruby | ||||
| 
 | ||||
| require 'rubygems/package' | ||||
| 
 | ||||
| module RubyGemsProv | ||||
|   module Helpers | ||||
|     # If there is some prelease version files, such as rc1 (i.e. non-numeric | ||||
|     # field), prepend this field by tilde instead of dot. | ||||
|     def self.normalize_prerelease(version) | ||||
|       if version.prerelease? | ||||
|         prerelease = version.version.sub /^#{version.release}\./, '' | ||||
|         "#{version.release}~#{prerelease}" | ||||
|       else | ||||
|         version.release | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   # Reports all functionality gem provides. | ||||
|   def self.provides | ||||
|     while filename = gets | ||||
|       filename.strip! | ||||
|       begin | ||||
|         specification = Gem::Specification.load filename | ||||
| 
 | ||||
|         puts "rubygem(#{specification.name}) = #{Helpers::normalize_prerelease(specification.version)}" | ||||
|       rescue => e | ||||
|         # Ignore all errors. | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| if __FILE__ == $0 | ||||
|   RubyGemsProv::provides | ||||
| end | ||||
							
								
								
									
										88
									
								
								SOURCES/rubygems.req
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								SOURCES/rubygems.req
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | ||||
| #!/usr/bin/ruby | ||||
| 
 | ||||
| require 'rubygems/package' | ||||
| 
 | ||||
| module RubyGemsReq | ||||
|   module Helpers | ||||
|     # Expands '~>' and '!=' gem requirements. | ||||
|     def self.expand_requirement(requirements) | ||||
|       requirements.inject([]) do |output, r| | ||||
|         output.concat case r.first | ||||
|         when '~>' | ||||
|           expand_pessimistic_requirement(r) | ||||
|         when '!=' | ||||
|           # If there is only the conflict requirement, we still need to depend | ||||
|           # on the specified gem. | ||||
|           if requirements.size == 1 | ||||
|             Gem::Requirement.default.requirements | ||||
|           else | ||||
|             [] | ||||
|           end | ||||
|         else | ||||
|           [r] | ||||
|         end | ||||
|       end.reject {|r| r.empty? } | ||||
|     end | ||||
| 
 | ||||
|     # Expands the pessimistic version operator '~>' into equivalent '>=' and | ||||
|     # '<' pair. | ||||
|     def self.expand_pessimistic_requirement(requirement) | ||||
|       next_version = Gem::Version.create(requirement.last).bump | ||||
|       return ['>=', requirement.last], ['<', next_version] | ||||
|     end | ||||
| 
 | ||||
|     # Converts Gem::Requirement into array of requirements strings compatible | ||||
|     # with RPM .spec file. | ||||
|     def self.requirement_versions_to_rpm(requirement) | ||||
|       self.expand_requirement(requirement.requirements).map do |op, version| | ||||
|         version == Gem::Version.new(0) ? "" : " #{op} #{version}" | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     # Compose dependency together with its requirements in RPM rich dependency | ||||
|     # string. | ||||
|     def self.compose_dependency_string(name, requirements) | ||||
|       dependency_strings = requirements.map { |requirement| name + requirement } | ||||
|       dependency_string = dependency_strings.join(' with ') | ||||
|       dependency_string.prepend('(').concat(')') if dependency_strings.length > 1 | ||||
|       dependency_string | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   # Report RubyGems dependency, versioned if required. | ||||
|   def self.rubygems_dependency(specification) | ||||
|     dependency_name = "ruby(rubygems)" | ||||
|     requirements = Helpers::requirement_versions_to_rpm(specification.required_rubygems_version) | ||||
| 
 | ||||
|     puts Helpers::compose_dependency_string(dependency_name, requirements) | ||||
|   end | ||||
| 
 | ||||
|   # Report all gem dependencies including their version. | ||||
|   def self.gem_depenencies(specification) | ||||
|     specification.runtime_dependencies.each do |dependency| | ||||
|       dependency_name = "rubygem(#{dependency.name})" | ||||
|       requirements = Helpers::requirement_versions_to_rpm(dependency.requirement) | ||||
| 
 | ||||
|       puts Helpers::compose_dependency_string(dependency_name, requirements) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   # Reports all requirements specified by all provided .gemspec files. | ||||
|   def self.requires | ||||
|     while filename = gets | ||||
|       filename.strip! | ||||
|       begin | ||||
|         specification = Gem::Specification.load filename | ||||
| 
 | ||||
|         rubygems_dependency(specification) | ||||
|         gem_depenencies(specification) | ||||
|       rescue => e | ||||
|         # Ignore all errors. | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| if __FILE__ == $0 | ||||
|   RubyGemsReq::requires | ||||
| end | ||||
							
								
								
									
										7
									
								
								SOURCES/test_abrt.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								SOURCES/test_abrt.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| if !!$LOADED_FEATURES.detect { |f| f =~ /abrt\.rb/ } | ||||
|   exit true | ||||
| else | ||||
|   puts 'ERROR: ABRT hook was not loaded.' | ||||
| 
 | ||||
|   exit false | ||||
| end | ||||
							
								
								
									
										65
									
								
								SOURCES/test_systemtap.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								SOURCES/test_systemtap.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| require 'set' | ||||
| 
 | ||||
| LIBRUBY_SO = 'libruby.so' | ||||
| PROBES_D = 'probes.d' | ||||
| 
 | ||||
| # These probes are excluded by VM_COLLECT_USAGE_DETAILS ifdef. | ||||
| EXCLUDE_PROBES = Set.new %w(insn insn__operand) | ||||
| 
 | ||||
| ## Detect SystemTap section headers presence | ||||
| 
 | ||||
| stap_headers = [ | ||||
|   '\.stapsdt\.base', | ||||
|   '\.note\.stapsdt' | ||||
| ] | ||||
| 
 | ||||
| header_regexp = %r{ (#{stap_headers.join('|')}) } | ||||
| 
 | ||||
| section_headers = `readelf -S "#{LIBRUBY_SO}"` | ||||
| detected_stap_headers = section_headers.scan(header_regexp).flatten | ||||
| 
 | ||||
| # Assume there are both headers until this is proven wrong ;) | ||||
| unless detected_stap_headers.size == 2 | ||||
|   puts 'ERROR: SystemTap (DTrace) headers were not detected in resulting library.' | ||||
|   exit false | ||||
| end | ||||
| 
 | ||||
| ## Find if every declared probe is propagated to resulting library | ||||
| 
 | ||||
| # Colect probes specified in probes.d file. | ||||
| probes_declared = [] | ||||
| 
 | ||||
| File.open(PROBES_D) do |file| | ||||
|   file.each_line do |line| | ||||
|     if probe = line[/probe (\S+)\(.*\);/, 1] | ||||
|       probes_declared << probe | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| probes_declared = Set.new probes_declared | ||||
| 
 | ||||
| unless EXCLUDE_PROBES.subset? probes_declared | ||||
|   puts 'ERROR: Change in SystemTap (DTrace) probes definition file detected.' | ||||
|   exit false | ||||
| end | ||||
| 
 | ||||
| probes_declared -= EXCLUDE_PROBES | ||||
| 
 | ||||
| # Detect probes in resulting library. | ||||
| get_probes_detected = %r{ | ||||
| ^\s*Provider:\s+ruby,\s+Name:\s+(\S+),\s+.*$ | ||||
| } | ||||
| 
 | ||||
| probes_detected = `eu-readelf -n "#{LIBRUBY_SO}"` | ||||
| 
 | ||||
| probes_detected = Set.new probes_detected.scan(get_probes_detected).flatten | ||||
| 
 | ||||
| # Both sets must be equal, otherwise something is wrong. | ||||
| unless probes_declared == probes_detected | ||||
|   puts 'ERROR: SystemTap (DTrace) probes were not correctly propagated into resulting library.' | ||||
|   puts "       Undetected probes: #{(probes_declared - probes_detected).sort.join(', ')}\n", | ||||
|        "       Additional detected probes: #{(probes_detected - probes_declared).sort.join(', ')}" | ||||
| 
 | ||||
|   exit false | ||||
| end | ||||
							
								
								
									
										3009
									
								
								SPECS/ruby.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3009
									
								
								SPECS/ruby.spec
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user