From 72d8be21a19e1d63e217e1a93af259c399b67c44 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 21 Jan 2020 18:34:30 -0500 Subject: [PATCH] import ruby-2.5.5-105.module+el8.1.0+3656+f80bfa1d --- SOURCES/macros.rubygems | 8 +- ...ifferent-js-gz-pages-across-multilib.patch | 214 ++++++++++++++++++ ...ddle-1.0.0-ffi-closure-alloc-default.patch | 61 +++++ SPECS/ruby.spec | 35 ++- 4 files changed, 313 insertions(+), 5 deletions(-) create mode 100644 SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch create mode 100644 SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch diff --git a/SOURCES/macros.rubygems b/SOURCES/macros.rubygems index d2e8514..f821ba7 100644 --- a/SOURCES/macros.rubygems +++ b/SOURCES/macros.rubygems @@ -60,7 +60,7 @@ gem install \\\ # %gemspec_add_dep(g:s:d) \ read -d '' gemspec_add_dep_script << 'EOR' || : \ - gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ + gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ \ name = '%{-g*}' \ requirements = %{*}%{!?1:nil} \ @@ -97,7 +97,7 @@ unset -v gemspec_add_dep_script \ # %gemspec_remove_dep(g:s:d) \ read -d '' gemspec_remove_dep_script << 'EOR' || : \ - gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ + gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \ \ name = '%{-g*}' \ requirements = %{*}%{!?1:nil} \ @@ -144,7 +144,7 @@ unset -v gemspec_remove_dep_script \ # %gemspec_add_file(s:tr) \ read -d '' gemspec_add_file_script << 'EOR' || : \ - gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ + 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" \ \ @@ -177,7 +177,7 @@ unset -v gemspec_add_file_script \ # %gemspec_remove_file(s:tr) \ read -d '' gemspec_remove_file_script << 'EOR' || : \ - gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}.gemspec}' \ + 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" \ \ diff --git a/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch b/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch new file mode 100644 index 0000000..041f327 --- /dev/null +++ b/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch @@ -0,0 +1,214 @@ +From 091459248d3ce814e10d50cc4421f0c0454ef61f Mon Sep 17 00:00:00 2001 +From: "Bernhard M. Wiedemann" +Date: Sun, 30 Apr 2017 22:47:40 +0200 +Subject: [PATCH 1/4] created.rid: use SOURCE_DATE_EPOCH + +use SOURCE_DATE_EPOCH instead of current time in created.rid top line +to enable reproducible builds of ruby docs + +See https://reproducible-builds.org/ for why this is good +and https://reproducible-builds.org/specs/source-date-epoch/ +for the definition of this variable. +--- + lib/rdoc/rdoc.rb | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb +index 68775c8be1..a2711fbbd1 100644 +--- a/lib/rdoc/rdoc.rb ++++ b/lib/rdoc/rdoc.rb +@@ -232,6 +232,9 @@ def store= store + + def update_output_dir(op_dir, time, last = {}) + return if @options.dry_run or not @options.update_output_dir ++ unless ENV['SOURCE_DATE_EPOCH'].nil? ++ time = Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime ++ end + + open output_flag_file(op_dir), "w" do |f| + f.puts time.rfc2822 +-- +2.21.0 + +From 73a935e9fa63b056ea0be69c0c923afdfb4d88da Mon Sep 17 00:00:00 2001 +From: "Bernhard M. Wiedemann" +Date: Thu, 14 Dec 2017 10:54:54 +0100 +Subject: [PATCH 2/4] Do not store current timestamps in gz headers + +to enable reproducible builds of rdoc + +Normally, 0 would be the preferred value to indicate "no date" +but that value is handled differently in Zlib::GzipWriter +to put in the current time +--- + lib/rdoc/generator/json_index.rb | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/rdoc/generator/json_index.rb b/lib/rdoc/generator/json_index.rb +index e4cfe967c6..a059a5d4d0 100644 +--- a/lib/rdoc/generator/json_index.rb ++++ b/lib/rdoc/generator/json_index.rb +@@ -175,7 +175,7 @@ def generate_gzipped + debug_msg "Writing gzipped search index to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| +- gz.mtime = File.mtime(search_index_file) ++ gz.mtime = 1 # make output reproducible + gz.orig_name = search_index_file.basename.to_s + gz.write search_index + gz.close +@@ -193,7 +193,7 @@ def generate_gzipped + debug_msg "Writing gzipped file to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| +- gz.mtime = File.mtime(dest) ++ gz.mtime = 1 # make output reproducible + gz.orig_name = dest.basename.to_s + gz.write data + gz.close +-- +2.21.0 + +From 1b34b337b72918e83c3b952eed6998ad47974960 Mon Sep 17 00:00:00 2001 +From: aycabta +Date: Sat, 27 Jan 2018 14:37:42 +0900 +Subject: [PATCH 3/4] Improve reproducible builds for .js and .js.gz files + +The mtime for search_index.js.gz should be updated because it's +generated dynamically. So uses SOURCE_DATE_EPOCH after +RDoc::Generator::JsonIndex#generate creates index file. + +FileUtils.install in RDoc::Generator::JsonIndex#generate with :preserve +option because the mtime value is based on original .js file. +--- + lib/rdoc/generator/json_index.rb | 9 +++++--- + test/rdoc/test_rdoc_generator_json_index.rb | 25 ++++++++++++++++++++- + 2 files changed, 30 insertions(+), 4 deletions(-) + +diff --git a/lib/rdoc/generator/json_index.rb b/lib/rdoc/generator/json_index.rb +index a059a5d4d0..3a1000033d 100644 +--- a/lib/rdoc/generator/json_index.rb ++++ b/lib/rdoc/generator/json_index.rb +@@ -147,12 +147,15 @@ def generate + + JSON.dump data, io, 0 + end ++ unless ENV['SOURCE_DATE_EPOCH'].nil? ++ index_file.utime index_file.atime, Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime ++ end + + Dir.chdir @template_dir do + Dir['**/*.js'].each do |source| + dest = File.join out_dir, source + +- FileUtils.install source, dest, :mode => 0644, :verbose => $DEBUG_RDOC ++ FileUtils.install source, dest, :mode => 0644, :preserve => true, :verbose => $DEBUG_RDOC + end + end + end +@@ -175,7 +178,7 @@ def generate_gzipped + debug_msg "Writing gzipped search index to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| +- gz.mtime = 1 # make output reproducible ++ gz.mtime = File.mtime(search_index_file) + gz.orig_name = search_index_file.basename.to_s + gz.write search_index + gz.close +@@ -193,7 +196,7 @@ def generate_gzipped + debug_msg "Writing gzipped file to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| +- gz.mtime = 1 # make output reproducible ++ gz.mtime = File.mtime(dest) + gz.orig_name = dest.basename.to_s + gz.write data + gz.close +diff --git a/test/rdoc/test_rdoc_generator_json_index.rb b/test/rdoc/test_rdoc_generator_json_index.rb +index 6cb5463d29..65e7f087cc 100644 +--- a/test/rdoc/test_rdoc_generator_json_index.rb ++++ b/test/rdoc/test_rdoc_generator_json_index.rb +@@ -8,7 +8,7 @@ class TestRDocGeneratorJsonIndex < RDoc::TestCase + def setup + super + +- @tmpdir = File.join Dir.tmpdir, "test_rdoc_generator_darkfish_#{$$}" ++ @tmpdir = Dir.mktmpdir "test_rdoc_generator_darkfish_#{$$}_" + FileUtils.mkdir_p @tmpdir + + @options = RDoc::Options.new +@@ -89,12 +89,21 @@ def test_file_dir + end + + def test_generate ++ now = Time.now + @g.generate + + assert_file 'js/searcher.js' + assert_file 'js/navigation.js' + assert_file 'js/search_index.js' + ++ orig_file = Pathname(File.join @pwd, 'lib/rdoc/generator/template/json_index/js/navigation.js') ++ generated_file = Pathname(File.join @tmpdir, 'js/navigation.js') ++ assert_equal orig_file.mtime, generated_file.mtime ++ assert generated_file.mtime < now, '.js files should be the same timestamp' ++ ++ generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') ++ assert generated_search_index.mtime > (now - 1), 'search_index.js should be generated timestamp' ++ + json = File.read 'js/search_index.js' + + json =~ /\Avar search_data = / +@@ -137,6 +146,20 @@ def test_generate + assert_equal expected, index + end + ++ def test_generate_search_index_with_reproducible_builds ++ backup_epoch = ENV['SOURCE_DATE_EPOCH'] ++ ruby_birthday = Time.parse 'Wed, 24 Feb 1993 21:00:00 +0900' ++ ENV['SOURCE_DATE_EPOCH'] = ruby_birthday.to_i.to_s ++ ++ @g.generate ++ ++ assert_file 'js/search_index.js' ++ generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') ++ assert_equal ruby_birthday, generated_search_index.mtime ++ ++ ENV['SOURCE_DATE_EPOCH'] = backup_epoch ++ end ++ + def test_generate_gzipped + begin + require 'zlib' +-- +2.21.0 + +From 74c1e201f2146e7175e74d6fc0b9386c2e95210f Mon Sep 17 00:00:00 2001 +From: aycabta +Date: Sat, 27 Jan 2018 17:54:31 +0900 +Subject: [PATCH 4/4] Use dirty hack on JRuby for MiniTest 4 + +--- + test/rdoc/test_rdoc_generator_json_index.rb | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/test/rdoc/test_rdoc_generator_json_index.rb b/test/rdoc/test_rdoc_generator_json_index.rb +index 65e7f087cc..714d496195 100644 +--- a/test/rdoc/test_rdoc_generator_json_index.rb ++++ b/test/rdoc/test_rdoc_generator_json_index.rb +@@ -98,7 +98,11 @@ def test_generate + + orig_file = Pathname(File.join @pwd, 'lib/rdoc/generator/template/json_index/js/navigation.js') + generated_file = Pathname(File.join @tmpdir, 'js/navigation.js') +- assert_equal orig_file.mtime, generated_file.mtime ++ ++ # This is dirty hack on JRuby for MiniTest 4 ++ assert orig_file.mtime.inspect == generated_file.mtime.inspect, ++ '.js files should be tha same timestamp of original' ++ + assert generated_file.mtime < now, '.js files should be the same timestamp' + + generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') +-- +2.21.0 + diff --git a/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch b/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch new file mode 100644 index 0000000..c54f1e4 --- /dev/null +++ b/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch @@ -0,0 +1,61 @@ +diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c +index 1a80b2b..b997e23 100644 +--- a/ext/fiddle/closure.c ++++ b/ext/fiddle/closure.c +@@ -13,25 +13,11 @@ typedef struct { + ffi_type **argv; + } fiddle_closure; + +-#if defined(USE_FFI_CLOSURE_ALLOC) +-#elif defined(__OpenBSD__) || defined(__APPLE__) || defined(__linux__) +-# define USE_FFI_CLOSURE_ALLOC 0 +-#elif defined(RUBY_LIBFFI_MODVERSION) && RUBY_LIBFFI_MODVERSION < 3000005 && \ +- (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64)) +-# define USE_FFI_CLOSURE_ALLOC 0 +-#else +-# define USE_FFI_CLOSURE_ALLOC 1 +-#endif +- + static void + dealloc(void * ptr) + { + fiddle_closure * cls = (fiddle_closure *)ptr; +-#if USE_FFI_CLOSURE_ALLOC + ffi_closure_free(cls->pcl); +-#else +- munmap(cls->pcl, sizeof(*cls->pcl)); +-#endif + if (cls->argv) xfree(cls->argv); + xfree(cls); + } +@@ -205,12 +191,7 @@ allocate(VALUE klass) + VALUE i = TypedData_Make_Struct(klass, fiddle_closure, + &closure_data_type, closure); + +-#if USE_FFI_CLOSURE_ALLOC + closure->pcl = ffi_closure_alloc(sizeof(ffi_closure), &closure->code); +-#else +- closure->pcl = mmap(NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE, +- MAP_ANON | MAP_PRIVATE, -1, 0); +-#endif + + return i; + } +@@ -257,17 +238,8 @@ initialize(int rbargc, VALUE argv[], VALUE self) + if (FFI_OK != result) + rb_raise(rb_eRuntimeError, "error prepping CIF %d", result); + +-#if USE_FFI_CLOSURE_ALLOC + result = ffi_prep_closure_loc(pcl, cif, callback, + (void *)self, cl->code); +-#else +- result = ffi_prep_closure(pcl, cif, callback, (void *)self); +- cl->code = (void *)pcl; +- i = mprotect(pcl, sizeof(*pcl), PROT_READ | PROT_EXEC); +- if (i) { +- rb_sys_fail("mprotect"); +- } +-#endif + + if (FFI_OK != result) + rb_raise(rb_eRuntimeError, "error prepping closure %d", result); diff --git a/SPECS/ruby.spec b/SPECS/ruby.spec index 66a8c72..135722c 100644 --- a/SPECS/ruby.spec +++ b/SPECS/ruby.spec @@ -21,7 +21,8 @@ %endif -%global release 104 +%global release 105 + %{!?release_string:%global release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}} # The RubyGems library has to stay out of Ruby directory tree, since the @@ -160,6 +161,19 @@ Patch22: ruby-2.6.0-config-support-include-directive.patch # https://github.com/ruby/openssl/pull/217 Patch23: ruby-2.6.0-use-larger-keys-for-SSL-tests.patch +# Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64. +# https://bugzilla.redhat.com/show_bug.cgi?id=1727832 +# https://bugzilla.redhat.com/show_bug.cgi?id=1721569 +# https://github.com/ruby/fiddle/pull/20 +Patch26: ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch +# Fix rdoc gzipped javascript pages are not the same across multilib. +# https://github.com/ruby/ruby/commit/98c7058bf7b3eab91c62a77cb10b09f6c8ed368e +# https://github.com/ruby/rdoc/commit/524a8ffc7efbc10b09234f7ac3f81d30a3f9f65c +# https://github.com/ruby/rdoc/commit/2df261bb8a9336438508bba94e22e0f968f88983 +# https://github.com/ruby/rdoc/commit/8e1916b89ef1d50930c2c863119ddb6ce6c796ed +# https://github.com/ruby/rdoc/commit/5a8dc7ce883b24539918c75a460a740943c46970 +Patch27: ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch + Requires: %{name}-libs%{?_isa} = %{version}-%{release} Suggests: rubypick Recommends: ruby(rubygems) >= %{rubygems_version} @@ -544,11 +558,22 @@ rm -rf ext/fiddle/libffi* %patch10 -p1 %patch15 -p1 %patch16 -p1 + +# Preserve rdoc's js file timestamp modified by patch command +# for reproducible build. It is used as generated js.gz file's metadata. +# https://bugzilla.redhat.com/show_bug.cgi?id=1719647 +# https://github.com/junaruga/rdoc/blob/v6.0.2/lib/rdoc/generator/json_index.rb#L199 +# https://github.com/rpm-software-management/rpm/issues/788 +ORIG_EPOCH=$(stat --printf='%y' lib/rdoc/generator/template/json_index/js/navigation.js) %patch20 -p1 +touch -d "${ORIG_EPOCH}" lib/rdoc/generator/template/json_index/js/navigation.js + %patch22 -p1 %patch23 -p1 %patch24 -p1 %patch25 -p1 +%patch26 -p1 +%patch27 -p1 # Provide an example of usage of the tapset: cp -a %{SOURCE3} . @@ -1101,6 +1126,14 @@ OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file OPENSSL_CONF='' \ %{gem_dir}/specifications/xmlrpc-%{xmlrpc_version}.gemspec %changelog +* Thu Jul 04 2019 Jun Aruga - 2.5.5-105 +- Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64. + Resolves: rhbz#1727832 +- Properly support %%prerelease in %%gemspec_ macros. + Related: rhbz#1688758 +- Fix rdoc gzipped javascript pages are not the same across multilib. + Resolves: rhbz#1719647 + * Wed Apr 17 2019 Vít Ondruch - 2.5.5-104 - Update to Ruby 2.5.5. * Remove Patch25: ruby-2.6.0-Update-for-tzdata-2018f.patch; subsumed