Compare commits

..

10 Commits

Author SHA1 Message Date
3e5b20e2a9
Disable clocks on riscv64
https://bugs.ruby-lang.org/issues/16007
324dd9d01f

1)
Process.clock_getres matches the clock in practice for Process::CLOCK_PROCESS_CPUTIME_ID FAILED
Expected 10000 == 10000
to be falsy but was true
/builddir/build/BUILD/ruby-2.7.1/spec/ruby/core/process/clock_getres_spec.rb:27:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-2.7.1/spec/ruby/core/process/clock_getres_spec.rb:4:in `<top (required)>'
2)
Process.clock_getres matches the clock in practice for Process::CLOCK_THREAD_CPUTIME_ID FAILED
Expected 10000 == 10000
to be falsy but was true
/builddir/build/BUILD/ruby-2.7.1/spec/ruby/core/process/clock_getres_spec.rb:27:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-2.7.1/spec/ruby/core/process/clock_getres_spec.rb:4:in `<top (required)>'
Finished in 2010.323383 seconds
3746 files, 30427 examples, 111183 expectations, 2 failures, 0 errors, 3 tagged
make: *** [uncommon.mk:823: yes-test-spec] Error 1

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-05-02 22:24:17 +03:00
120ff99bc9
Disable more tests on riscv64
These tests time out on QEMU VM:

  1) Error:
Racc::TestRaccCommand#test_cast:
Timeout::Error: execution of assert_ruby_status expired timeout (10 sec)
pid 127860 killed by SIGTERM (signal 15)
|
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:108:in `ruby'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:104:in `racc'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:57:in `assert_compile'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/test_racc_command.rb:269:in `test_cast'
  2) Error:
Racc::TestRaccCommand#test_riml:
Timeout::Error: execution of assert_ruby_status expired timeout (10 sec)
pid 127914 killed by SIGTERM (signal 15)
|
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:108:in `ruby'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:104:in `racc'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/helper.rb:57:in `assert_compile'
    /builddir/build/BUILD/ruby-2.7.1/test/racc/test_racc_command.rb:245:in `test_riml'
  3) Error:
TestBugReporter#test_bug_reporter_add:
Timeout::Error: execution of assert_in_out_err expired timeout (30 sec)
pid 128134 killed by SIGKILL (signal 9)
|
| -:1: [BUG] Segmentation fault at 0x000003db0001f486
| ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
|
| -- Control frame information -----------------------------------------------
| c:0003 p:---- s:0012 e:000011 CFUNC  :kill
| c:0002 p:0021 s:0006 e:000005 EVAL   -:1 [FINISH]
| c:0001 p:0000 s:0003 E:001570 (none) [FINISH]
|
| -- Ruby level backtrace information ----------------------------------------
| -:1:in `<main>'
| -:1:in `kill'
|
| -- C level backtrace information -------------------------------------------

    /builddir/build/BUILD/ruby-2.7.1/test/-ext-/bug_reporter/test_bug_reporter.rb:22:in `test_bug_reporter_add'
  4) Error:
TestFiber#test_many_fibers_with_threads:
Timeout::Error: execution of assert_normal_exit expired timeout (60 sec)
pid 128358 killed by SIGKILL (signal 9)
|
    /builddir/build/BUILD/ruby-2.7.1/test/ruby/test_fiber.rb:53:in `test_many_fibers_with_threads'
  5) Error:
TestRubyOptions#test_segv_test:
Timeout::Error: execution of assert_in_out_err expired timeout (10 sec)
pid 134299 killed by SIGKILL (signal 9)
|
| -e:1: [BUG] Segmentation fault at 0x000003db00020c9b
| ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
|
| -- Control frame information -----------------------------------------------
| c:0003 p:---- s:0012 e:000011 CFUNC  :kill
| c:0002 p:0015 s:0006 e:000005 EVAL   -e:1 [FINISH]
| c:0001 p:0000 s:0003 E:002170 (none) [FINISH]
|
| -- Ruby level backtrace information ----------------------------------------
| -e:1:in `<main>'
| -e:1:in `kill'
|

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-05-02 15:33:34 +03:00
03cb588be8
Disable failing tests on riscv64
[21014/21023] YAMLStoreTest#test_writing_inside_readonly_transaction_raises_error = 0.00 s
[21015/21023] YAMLStoreTest#test_yaml_store_files_are_accessed_as_binary_files = 2.52 s
  1) Failure:
TestJIT#test_compile_insn_once [/builddir/build/BUILD/ruby-2.7.1/test/ruby/test_jit.rb:495]:
Expected 1 times of JIT success, but succeeded 0 times.
script:
"""
p proc { /#{true}/o =~ "true" && $~.to_a }.call
"""
stderr:
"""
gcc: internal compiler error: Segmentation fault signal terminated program cc1
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Successful MJIT finish
"""
.
<1> expected but was
<0>.
  2) Error:
TestBugReporter#test_bug_reporter_add:
Timeout::Error: execution of assert_in_out_err expired timeout (10 sec)
pid 69062 killed by SIGKILL (signal 9)
|
| -:1: [BUG] Segmentation fault at 0x000003db00010dc6
| ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
|
| -- Control frame information -----------------------------------------------
| c:0003 p:---- s:0012 e:000011 CFUNC  :kill
| c:0002 p:0021 s:0006 e:000005 EVAL   -:1 [FINISH]
| c:0001 p:0000 s:0003 E:001c20 (none) [FINISH]
|
| -- Ruby level backtrace information ----------------------------------------
| -:1:in `<main>'
| -:1:in `kill'
|
| -- C level backtrace information -------------------------------------------
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby

[..]

    /builddir/build/BUILD/ruby-2.7.1/test/-ext-/bug_reporter/test_bug_reporter.rb:22:in `test_bug_reporter_add'
  3) Error:
TestRubyOptions#test_segv_loaded_features:
Timeout::Error: execution of assert_in_out_err expired timeout (10 sec)
pid 74892 killed by SIGABRT (signal 6) (core dumped)
|
| -e:1: [BUG] Segmentation fault at 0x000003db0001248c
| ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
|
| -- Control frame information -----------------------------------------------
| c:0003 p:---- s:0012 e:000011 CFUNC  :kill
| c:0002 p:0016 s:0006 e:000005 BLOCK  -e:1 [FINISH]
| c:0001 p:0000 s:0003 E:000ee0 (none) [FINISH]
|
| -- Ruby level backtrace information ----------------------------------------
| -e:1:in `block in <main>'
| -e:1:in `kill'
|
| -- C level backtrace information -------------------------------------------
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby

[..]

    /builddir/build/BUILD/ruby-2.7.1/test/ruby/test_rubyoptions.rb:725:in `assert_segv'
    /builddir/build/BUILD/ruby-2.7.1/test/ruby/test_rubyoptions.rb:735:in `test_segv_loaded_features'
  4) Error:
TestRubyOptions#test_segv_setproctitle:
Timeout::Error: execution of assert_in_out_err expired timeout (10 sec)
pid 74904 killed by SIGABRT (signal 6) (core dumped)
|
| -e:1: [BUG] Segmentation fault at 0x000003db00012498
| ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
|
| -- Control frame information -----------------------------------------------
| c:0003 p:---- s:0012 e:000011 CFUNC  :kill
| c:0002 p:0029 s:0006 e:000005 EVAL   -e:1 [FINISH]
| c:0001 p:0000 s:0003 E:002640 (none) [FINISH]
|
| -- Ruby level backtrace information ----------------------------------------
| -e:1:in `<main>'
| -e:1:in `kill'
|
| -- C level backtrace information -------------------------------------------
| Unknown extended opcode: 5 in /builddir/build/BUILD/ruby-2.7.1/ruby

[..]
    /builddir/build/BUILD/ruby-2.7.1/test/ruby/test_rubyoptions.rb:725:in `assert_segv'
    /builddir/build/BUILD/ruby-2.7.1/test/ruby/test_rubyoptions.rb:729:in `test_segv_test'
Finished tests in 4584.001316s, 4.5844 tests/s, 593.8157 assertions/s.
21015 tests, 2722052 assertions, 1 failures, 4 errors, 61 skips
ruby -v: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [riscv64-linux]
RPM build errors:
make: *** [uncommon.mk:783: yes-test-all] Error 5

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-04-20 15:39:12 +03:00
98349071bc
Fix atomic detection for RISC-V (riscv64)
See:
abe2e7de4d
https://bugs.ruby-lang.org/issues/16800
https://bugs.ruby-lang.org/issues/16774

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-04-20 11:00:53 +03:00
f297a7ee61
Merge remote-tracking branch 'up/master' into master-riscv64
Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-04-20 10:58:19 +03:00
4a959b9846
Disable pthread assert for riscv
Let's see how far this can go in testing.

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-01-17 19:56:49 +02:00
4916a7212e
Merge commit '04b63f48ea89ff10fcffafe2ff3815dfa0e16e99' into master-riscv64
Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2020-01-17 19:35:32 +02:00
60baed04d5
Disable pthread on RISC-V (riscv64)
Until we can understand the build failure related to pthread thread
model it's better we disable it:

BUILDSTDERR: rb_mjiminiruby: thread_pthread.c:1995: rb_sigwait_fd_put: Assertion `old == th' failed.
BUILDSTDERR: make: *** [uncommon.mk:233: .ext/include/riscv64-linux/rb_mjit_min_header-2.6.3.h] Aborted (core dumped)

Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2019-07-23 17:04:04 +03:00
d2b1e688a4
Merge remote-tracking branch 'up/master' into master-riscv64
Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
2019-07-23 16:40:15 +03:00
0645d264b1
Rebuild for gdbm
Signed-off-by: David Abdurachmanov <david.abdurachmanov@gmail.com>
2018-07-24 09:35:33 +02:00
20 changed files with 525 additions and 913 deletions

View File

@ -0,0 +1,37 @@
From abe2e7de4d1f2d5861d7c9ab9c7e778f2ee1dcd2 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
Date: Fri, 10 Apr 2020 15:34:52 +0200
Subject: [PATCH] Don't require sub-word atomics
On some architectures (like RISC-V) sub-word atomics are only available
when linking against -latomic, but the configure script doesn't do that,
causing the atomic checks to fail and the resulting ruby binary is
non-functional. Ruby does not use sub-word atomic operations, rb_atomic_t
is defined to unsigned int, so use unsigned int when checking for atomic
operations.
---
configure.ac | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 7c12b9e5fb94..ba86deffbebb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1498,7 +1498,7 @@ AS_IF([test "$GCC" = yes], [
])
AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
- AC_TRY_LINK([unsigned char atomic_var;],
+ AC_TRY_LINK([unsigned int atomic_var;],
[
__atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
__atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
@@ -1513,7 +1513,7 @@ AS_IF([test "$GCC" = yes], [
])
AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
- AC_TRY_LINK([unsigned char atomic_var;],
+ AC_TRY_LINK([unsigned int atomic_var;],
[
__sync_lock_test_and_set(&atomic_var, 0);
__sync_lock_test_and_set(&atomic_var, 1);

View File

@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
index d261ea57b5..3c13076b82 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3105,6 +3105,11 @@ AS_IF([test ${multiarch+set}], [
@@ -3102,6 +3102,11 @@ AS_IF([test ${multiarch+set}], [
])
archlibdir='${libdir}/${arch}'

View File

@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
index c42436c23d..d261ea57b5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3743,7 +3743,8 @@ AS_CASE(["$ruby_version_dir_name"],
@@ -3740,7 +3740,8 @@ AS_CASE(["$ruby_version_dir_name"],
ruby_version_dir=/'${ruby_version_dir_name}'
if test -z "${ruby_version_dir_name}"; then

View File

@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
index 3c13076b82..93af30321d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3807,6 +3807,8 @@ AC_SUBST(vendorarchdir)dnl
@@ -3804,6 +3804,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

View File

@ -15,7 +15,7 @@ diff --git a/configure.ac b/configure.ac
index 93af30321d..bc13397e0e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3779,6 +3779,10 @@ AC_ARG_WITH(vendorarchdir,
@@ -3776,6 +3776,10 @@ AC_ARG_WITH(vendorarchdir,
[vendorarchdir=$withval],
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
@ -26,7 +26,7 @@ index 93af30321d..bc13397e0e 100644
AS_IF([test "${LOAD_RELATIVE+set}"], [
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
RUBY_EXEC_PREFIX=''
@@ -3803,6 +3807,7 @@ AC_SUBST(sitearchdir)dnl
@@ -3800,6 +3804,7 @@ AC_SUBST(sitearchdir)dnl
AC_SUBST(vendordir)dnl
AC_SUBST(vendorlibdir)dnl
AC_SUBST(vendorarchdir)dnl

View File

@ -20,7 +20,7 @@ diff --git a/configure.ac b/configure.ac
index 80b137e380..63cd3b4f8b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3694,9 +3694,6 @@ AS_CASE(["$target_os"],
@@ -3691,9 +3691,6 @@ AS_CASE(["$target_os"],
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
])
@ -30,7 +30,7 @@ index 80b137e380..63cd3b4f8b 100644
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
AC_ARG_WITH(rubyarchprefix,
AS_HELP_STRING([--with-rubyarchprefix=DIR],
@@ -3719,56 +3716,62 @@ AC_ARG_WITH(ridir,
@@ -3716,56 +3713,62 @@ AC_ARG_WITH(ridir,
AC_SUBST(ridir)
AC_SUBST(RI_BASE_NAME)
@ -120,7 +120,7 @@ index 80b137e380..63cd3b4f8b 100644
AS_IF([test "${LOAD_RELATIVE+set}"], [
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
@@ -3785,6 +3788,7 @@ AC_SUBST(sitearchincludedir)dnl
@@ -3782,6 +3785,7 @@ AC_SUBST(sitearchincludedir)dnl
AC_SUBST(arch)dnl
AC_SUBST(sitearch)dnl
AC_SUBST(ruby_version)dnl
@ -237,7 +237,7 @@ 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
@@ -1378,7 +1378,8 @@ def test_self_use_paths
@@ -1353,7 +1353,8 @@ def test_self_use_paths
def test_self_user_dir
parts = [@userhome, '.gem', Gem.ruby_engine]
@ -247,7 +247,7 @@ index b25068405d..e9fef4a311 100644
assert_equal File.join(parts), Gem.user_dir
end
@@ -1454,7 +1455,7 @@ def test_self_vendor_dir
@@ -1429,7 +1430,7 @@ def test_self_vendor_dir
vendordir(File.join(@tempdir, 'vendor')) do
expected =
File.join RbConfig::CONFIG['vendordir'], 'gems',

View File

@ -8,14 +8,14 @@ on Red Hat platforms.
This workaround rhbz#1361037
---
test/fiddle/helper.rb | 111 ------------------------------------------
1 file changed, 111 deletions(-)
test/fiddle/helper.rb | 105 ------------------------------------------
1 file changed, 105 deletions(-)
diff --git a/test/fiddle/helper.rb b/test/fiddle/helper.rb
index 1da3d93..65148a1 100644
--- a/test/fiddle/helper.rb
+++ b/test/fiddle/helper.rb
@@ -6,115 +6,6 @@
@@ -6,111 +6,6 @@
libc_so = libm_so = nil
@ -56,7 +56,8 @@ index 1da3d93..65148a1 100644
- crtname = RbConfig::CONFIG["RUBY_SO_NAME"][/msvc\w+/] || 'ucrtbase'
- libc_so = libm_so = "#{crtname}.dll"
-when /darwin/
- libc_so = libm_so = "/usr/lib/libSystem.B.dylib"
- libc_so = "/usr/lib/libc.dylib"
- libm_so = "/usr/lib/libm.dylib"
-when /kfreebsd/
- libc_so = "/lib/libc.so.0.1"
- libm_so = "/lib/libm.so.1"
@ -122,11 +123,6 @@ index 1da3d93..65148a1 100644
-
-libc_so = nil if !libc_so || (libc_so[0] == ?/ && !File.file?(libc_so))
-libm_so = nil if !libm_so || (libm_so[0] == ?/ && !File.file?(libm_so))
-
-# macOS 11.0+ removed libSystem.B.dylib from /usr/lib. But It works with dlopen.
-if RUBY_PLATFORM =~ /darwin/
- libc_so = libm_so = "/usr/lib/libSystem.B.dylib"
-end
-
if !libc_so || !libm_so
ruby = EnvUtil.rubybin

View File

@ -0,0 +1,182 @@
From f46bac1f3e8634e24c747d06b28e11b874f1e488 Mon Sep 17 00:00:00 2001
From: Kazuki Yamaguchi <k@rhe.jp>
Date: Thu, 16 Aug 2018 19:40:48 +0900
Subject: [PATCH] config: support .include directive
OpenSSL 1.1.1 introduces a new '.include' directive. Update our config
parser to support that.
As mentioned in the referenced GitHub issue, we should use the OpenSSL
API instead of implementing the parsing logic ourselves, but it will
need backwards-incompatible changes which we can't backport to stable
versions. So continue to use the Ruby implementation for now.
Reference: https://github.com/ruby/openssl/issues/208
---
ext/openssl/lib/openssl/config.rb | 54 ++++++++++++++++++++-----------
test/openssl/test_config.rb | 54 +++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+), 18 deletions(-)
diff --git a/ext/openssl/lib/openssl/config.rb b/ext/openssl/lib/openssl/config.rb
index 88225451..ba3a54c8 100644
--- a/ext/openssl/lib/openssl/config.rb
+++ b/ext/openssl/lib/openssl/config.rb
@@ -77,29 +77,44 @@ def get_key_string(data, section, key) # :nodoc:
def parse_config_lines(io)
section = 'default'
data = {section => {}}
- while definition = get_definition(io)
+ io_stack = [io]
+ while definition = get_definition(io_stack)
definition = clear_comments(definition)
next if definition.empty?
- if definition[0] == ?[
+ case definition
+ when /\A\[/
if /\[([^\]]*)\]/ =~ definition
section = $1.strip
data[section] ||= {}
else
raise ConfigError, "missing close square bracket"
end
- else
- if /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ =~ definition
- if $2
- section = $1
- key = $2
- else
- key = $1
+ when /\A\.include (\s*=\s*)?(.+)\z/
+ path = $2
+ if File.directory?(path)
+ files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
+ else
+ files = [path]
+ end
+
+ files.each do |filename|
+ begin
+ io_stack << StringIO.new(File.read(filename))
+ rescue
+ raise ConfigError, "could not include file '%s'" % filename
end
- value = unescape_value(data, section, $3)
- (data[section] ||= {})[key] = value.strip
+ end
+ when /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/
+ if $2
+ section = $1
+ key = $2
else
- raise ConfigError, "missing equal sign"
+ key = $1
end
+ value = unescape_value(data, section, $3)
+ (data[section] ||= {})[key] = value.strip
+ else
+ raise ConfigError, "missing equal sign"
end
end
data
@@ -212,10 +227,10 @@ def clear_comments(line)
scanned.join
end
- def get_definition(io)
- if line = get_line(io)
+ def get_definition(io_stack)
+ if line = get_line(io_stack)
while /[^\\]\\\z/ =~ line
- if extra = get_line(io)
+ if extra = get_line(io_stack)
line += extra
else
break
@@ -225,9 +240,12 @@ def get_definition(io)
end
end
- def get_line(io)
- if line = io.gets
- line.gsub(/[\r\n]*/, '')
+ def get_line(io_stack)
+ while io = io_stack.last
+ if line = io.gets
+ return line.gsub(/[\r\n]*/, '')
+ end
+ io_stack.pop
end
end
end
diff --git a/test/openssl/test_config.rb b/test/openssl/test_config.rb
index 99dcc497..5653b5d0 100644
--- a/test/openssl/test_config.rb
+++ b/test/openssl/test_config.rb
@@ -120,6 +120,49 @@ def test_s_parse_format
assert_equal("error in line 7: missing close square bracket", excn.message)
end
+ def test_s_parse_include
+ in_tmpdir("ossl-config-include-test") do |dir|
+ Dir.mkdir("child")
+ File.write("child/a.conf", <<~__EOC__)
+ [default]
+ file-a = a.conf
+ [sec-a]
+ a = 123
+ __EOC__
+ File.write("child/b.cnf", <<~__EOC__)
+ [default]
+ file-b = b.cnf
+ [sec-b]
+ b = 123
+ __EOC__
+ File.write("include-child.conf", <<~__EOC__)
+ key_outside_section = value_a
+ .include child
+ __EOC__
+
+ include_file = <<~__EOC__
+ [default]
+ file-main = unnamed
+ [sec-main]
+ main = 123
+ .include = include-child.conf
+ __EOC__
+
+ # Include a file by relative path
+ c1 = OpenSSL::Config.parse(include_file)
+ assert_equal(["default", "sec-a", "sec-b", "sec-main"], c1.sections.sort)
+ assert_equal(["file-main", "file-a", "file-b"], c1["default"].keys)
+ assert_equal({"a" => "123"}, c1["sec-a"])
+ assert_equal({"b" => "123"}, c1["sec-b"])
+ assert_equal({"main" => "123", "key_outside_section" => "value_a"}, c1["sec-main"])
+
+ # Relative paths are from the working directory
+ assert_raise(OpenSSL::ConfigError) do
+ Dir.chdir("child") { OpenSSL::Config.parse(include_file) }
+ end
+ end
+ end
+
def test_s_load
# alias of new
c = OpenSSL::Config.load
@@ -299,6 +342,17 @@ def test_clone
@it['newsection'] = {'a' => 'b'}
assert_not_equal(@it.sections.sort, c.sections.sort)
end
+
+ private
+
+ def in_tmpdir(*args)
+ Dir.mktmpdir(*args) do |dir|
+ dir = File.realpath(dir)
+ Dir.chdir(dir) do
+ yield dir
+ end
+ end
+ end
end
end

View File

@ -57,7 +57,7 @@ diff --git a/ruby.c b/ruby.c
index 60c57d6259..1eec16f2c8 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1451,10 +1451,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
@@ -1439,10 +1439,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
void Init_builtin_features(void);

View File

@ -1,34 +0,0 @@
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
@@ -19,7 +19,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

View File

@ -0,0 +1,13 @@
diff --git a/spec/ruby/core/process/fixtures/clocks.rb b/spec/ruby/core/process/fixtures/clocks.rb
index 7537cfa..c4c647a 100644
--- a/spec/ruby/core/process/fixtures/clocks.rb
+++ b/spec/ruby/core/process/fixtures/clocks.rb
@@ -34,7 +34,7 @@ module ProcessSpecs
end
# These clocks in practice on ARM on Linux do not seem to match their reported resolution.
- platform_is :armv7, :armv8, :aarch64 do
+ platform_is :armv7, :armv8, :aarch64, :riscv64 do
clocks = clocks.reject { |clock, value|
[:CLOCK_PROCESS_CPUTIME_ID, :CLOCK_THREAD_CPUTIME_ID, :CLOCK_MONOTONIC_RAW].include?(clock)
}

View File

@ -0,0 +1,88 @@
From a19228f878d955eaf2cce086bcf53f46fdf894b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
<shyouhei@ruby-lang.org>
Date: Thu, 23 Jan 2020 15:33:42 +0900
Subject: [PATCH] brace the fact that lchmod(2) can EOPNOTSUPP
Musl libc has this function as a tiny wrapper of fchmodat(3posix). On
the other hand Linux kernel does not support changing modes of a symlink.
The operation always fails with EOPNOTSUPP. This fchmodat behaviour is
defined in POSIX. We have to take care of such exceptions.
---
lib/fileutils.rb | 3 ++-
test/pathname/test_pathname.rb | 2 +-
test/ruby/test_notimp.rb | 19 ++++++++++++-------
3 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/lib/fileutils.rb b/lib/fileutils.rb
index a7ad65ae5e98..04788e26ca9c 100644
--- a/lib/fileutils.rb
+++ b/lib/fileutils.rb
@@ -1345,6 +1345,7 @@ def chmod(mode)
else
File.chmod mode, path()
end
+ rescue Errno::EOPNOTSUPP
end
def chown(uid, gid)
@@ -1439,7 +1440,7 @@ def copy_metadata(path)
if st.symlink?
begin
File.lchmod mode, path
- rescue NotImplementedError
+ rescue NotImplementedError, Errno::EOPNOTSUPP
end
else
File.chmod mode, path
diff --git a/test/pathname/test_pathname.rb b/test/pathname/test_pathname.rb
index 792510bdfb2d..2ce32a6c1208 100644
--- a/test/pathname/test_pathname.rb
+++ b/test/pathname/test_pathname.rb
@@ -818,7 +818,7 @@ def test_lchmod
old = path.lstat.mode
begin
path.lchmod(0444)
- rescue NotImplementedError
+ rescue NotImplementedError, Errno::EOPNOTSUPP
next
end
assert_equal(0444, path.lstat.mode & 0777)
diff --git a/test/ruby/test_notimp.rb b/test/ruby/test_notimp.rb
index b069154cfc3f..e13db692b50d 100644
--- a/test/ruby/test_notimp.rb
+++ b/test/ruby/test_notimp.rb
@@ -13,11 +13,11 @@ def test_respond_to_fork
def test_respond_to_lchmod
assert_include(File.methods, :lchmod)
- if /linux/ =~ RUBY_PLATFORM
- assert_equal(false, File.respond_to?(:lchmod))
- end
- if /freebsd/ =~ RUBY_PLATFORM
+ case RUBY_PLATFORM
+ when /freebsd/, /linux-musl/
assert_equal(true, File.respond_to?(:lchmod))
+ when /linux/
+ assert_equal(false, File.respond_to?(:lchmod))
end
end
@@ -57,9 +57,14 @@ def test_call_lchmod
File.open(f, "w") {}
File.symlink f, g
newmode = 0444
- File.lchmod newmode, "#{d}/g"
- snew = File.lstat(g)
- assert_equal(newmode, snew.mode & 0777)
+ begin
+ File.lchmod newmode, "#{d}/g"
+ rescue Errno::EOPNOTSUPP
+ skip $!
+ else
+ snew = File.lstat(g)
+ assert_equal(newmode, snew.mode & 0777)
+ end
}
end
end

View File

@ -0,0 +1,131 @@
From 72c02aa4b79731c7f25c9267f74b347f1946c704 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
Date: Fri, 28 Feb 2020 21:15:37 +0900
Subject: [PATCH] Moved not-implemented method tests [Bug #16662]
Test not-implemented method with the dedicated methods, instead of
platform dependent features.
---
test/-ext-/test_notimplement.rb | 7 +++
test/ruby/test_notimp.rb | 90 ---------------------------------
2 files changed, 7 insertions(+), 90 deletions(-)
delete mode 100644 test/ruby/test_notimp.rb
diff --git a/test/-ext-/test_notimplement.rb b/test/-ext-/test_notimplement.rb
index 92a2fd22b8d6..038b507b7312 100644
--- a/test/-ext-/test_notimplement.rb
+++ b/test/-ext-/test_notimplement.rb
@@ -13,10 +13,17 @@ def test_funcall_notimplement
end
def test_respond_to
+ assert_include(Bug.methods(false), :notimplement)
+ assert_include(Bug::NotImplement.instance_methods(false), :notimplement)
assert_not_respond_to(Bug, :notimplement)
assert_not_respond_to(Bug::NotImplement.new, :notimplement)
end
+ def test_method_inspect_notimplement
+ assert_match(/not-implemented/, Bug.method(:notimplement).inspect)
+ assert_match(/not-implemented/, Bug::NotImplement.instance_method(:notimplement).inspect)
+ end
+
def test_not_method_defined
assert !Bug::NotImplement.method_defined?(:notimplement)
assert !Bug::NotImplement.method_defined?(:notimplement, true)
diff --git a/test/ruby/test_notimp.rb b/test/ruby/test_notimp.rb
deleted file mode 100644
index e13db692b50d..000000000000
--- a/test/ruby/test_notimp.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-# frozen_string_literal: false
-require 'test/unit'
-require 'timeout'
-require 'tmpdir'
-
-class TestNotImplement < Test::Unit::TestCase
- def test_respond_to_fork
- assert_include(Process.methods, :fork)
- if /linux/ =~ RUBY_PLATFORM
- assert_equal(true, Process.respond_to?(:fork))
- end
- end
-
- def test_respond_to_lchmod
- assert_include(File.methods, :lchmod)
- case RUBY_PLATFORM
- when /freebsd/, /linux-musl/
- assert_equal(true, File.respond_to?(:lchmod))
- when /linux/
- assert_equal(false, File.respond_to?(:lchmod))
- end
- end
-
- def test_call_fork
- GC.start
- pid = nil
- ps =
- case RUBY_PLATFORM
- when /linux/ # assume Linux Distribution uses procps
- proc {`ps -eLf #{pid}`}
- when /freebsd/
- proc {`ps -lH #{pid}`}
- when /darwin/
- proc {`ps -lM #{pid}`}
- else
- proc {`ps -l #{pid}`}
- end
- assert_nothing_raised(Timeout::Error, ps) do
- EnvUtil.timeout(20) {
- pid = fork {}
- Process.wait pid
- pid = nil
- }
- end
- ensure
- if pid
- Process.kill(:KILL, pid)
- Process.wait pid
- end
- end if Process.respond_to?(:fork)
-
- def test_call_lchmod
- if File.respond_to?(:lchmod)
- Dir.mktmpdir {|d|
- f = "#{d}/f"
- g = "#{d}/g"
- File.open(f, "w") {}
- File.symlink f, g
- newmode = 0444
- begin
- File.lchmod newmode, "#{d}/g"
- rescue Errno::EOPNOTSUPP
- skip $!
- else
- snew = File.lstat(g)
- assert_equal(newmode, snew.mode & 0777)
- end
- }
- end
- end
-
- def test_method_inspect_fork
- m = Process.method(:fork)
- if Process.respond_to?(:fork)
- assert_not_match(/not-implemented/, m.inspect)
- else
- assert_match(/not-implemented/, m.inspect)
- end
- end
-
- def test_method_inspect_lchmod
- m = File.method(:lchmod)
- if File.respond_to?(:lchmod)
- assert_not_match(/not-implemented/, m.inspect)
- else
- assert_match(/not-implemented/, m.inspect)
- end
- end
-
-end

View File

@ -1,178 +0,0 @@
From c5806d668f84a86e9e6a522f84b8aa6cb4cdaae9 Mon Sep 17 00:00:00 2001
From: Ali Saidi <alisaidi@amazon.com>
Date: Wed, 5 Aug 2020 20:46:28 -0500
Subject: [PATCH 1/3] Enable unaligned accesses on arm64
64-bit Arm platforms support unaligned accesses.
Running the string benchmarks this change improves performance
by an average of 1.04x, min .96x, max 1.21x, median 1.01x
---
include/ruby/defines.h | 2 +-
regint.h | 2 +-
siphash.c | 2 +-
st.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
index 49f673ef936a..0193275e8b78 100644
--- a/include/ruby/defines.h
+++ b/include/ruby/defines.h
@@ -485,7 +485,7 @@
#ifndef UNALIGNED_WORD_ACCESS
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
- defined(__powerpc64__) || \
+ defined(__powerpc64__) || defined(__aarch64__) || \
defined(__mc68020__)
# define UNALIGNED_WORD_ACCESS 1
# else
diff --git a/regint.h b/regint.h
index a2f5bbba1d1f..0740429688bc 100644
--- a/regint.h
+++ b/regint.h
@@ -52,7 +52,7 @@
#ifndef UNALIGNED_WORD_ACCESS
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
- defined(__powerpc64__) || \
+ defined(__powerpc64__) || defined(__aarch64__) || \
defined(__mc68020__)
# define UNALIGNED_WORD_ACCESS 1
# else
diff --git a/siphash.c b/siphash.c
index 153d2c690ab9..ddf8ee245d81 100644
--- a/siphash.c
+++ b/siphash.c
@@ -30,7 +30,7 @@
#ifndef UNALIGNED_WORD_ACCESS
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
- defined(__powerpc64__) || \
+ defined(__powerpc64__) || defined(__aarch64__) || \
defined(__mc68020__)
# define UNALIGNED_WORD_ACCESS 1
# endif
diff --git a/st.c b/st.c
index c11535ef9779..8be466bf733f 100644
--- a/st.c
+++ b/st.c
@@ -1815,7 +1815,7 @@ st_values_check(st_table *tab, st_data_t *values, st_index_t size,
#ifndef UNALIGNED_WORD_ACCESS
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
- defined(__powerpc64__) || \
+ defined(__powerpc64__) || defined(__aarch64__) || \
defined(__mc68020__)
# define UNALIGNED_WORD_ACCESS 1
# endif
From 79b7b9143fda0f33fc9375980cecc61eb42c6f66 Mon Sep 17 00:00:00 2001
From: Ali Saidi <alisaidi@amazon.com>
Date: Wed, 5 Aug 2020 21:04:37 -0500
Subject: [PATCH 2/3] arm64 enable gc optimizations
Similar to x86 and powerpc optimizations.
| |compare-ruby|built-ruby|
|:------|-----------:|---------:|
|hash1 | 0.225| 0.237|
| | -| 1.05x|
|hash2 | 0.110| 0.110|
| | 1.00x| -|
---
gc.c | 13 +++++++++++++
gc.h | 2 ++
2 files changed, 15 insertions(+)
diff --git a/gc.c b/gc.c
index 22972dfc806c..788f06f1586e 100644
--- a/gc.c
+++ b/gc.c
@@ -1153,6 +1153,19 @@ tick(void)
return val;
}
+#elif defined(__aarch64__) && defined(__GNUC__)
+typedef unsigned long tick_t;
+#define PRItick "lu"
+
+static __inline__ tick_t
+tick(void)
+{
+ unsigned long val;
+ __asm__ __volatile__ ("mrs %0, cntvct_el0", : "=r" (val));
+ return val;
+}
+
+
#elif defined(_WIN32) && defined(_MSC_VER)
#include <intrin.h>
typedef unsigned __int64 tick_t;
diff --git a/gc.h b/gc.h
index 6568079c54e5..47a4ca19a0c5 100644
--- a/gc.h
+++ b/gc.h
@@ -8,6 +8,8 @@
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movl\t%%esp, %0" : "=r" (*(p)))
#elif defined(__powerpc64__) && defined(__GNUC__)
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr\t%0, %%r1" : "=r" (*(p)))
+#elif defined(__aarch64__) && defined(__GNUC__)
+#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mov\t%0, sp" : "=r" (*(p)))
#else
NOINLINE(void rb_gc_set_stack_end(VALUE **stack_end_p));
#define SET_MACHINE_STACK_END(p) rb_gc_set_stack_end(p)
From c985b8c6868a380e44e285368af4a4f414ce3309 Mon Sep 17 00:00:00 2001
From: Ali Saidi <alisaidi@amazon.com>
Date: Wed, 5 Aug 2020 21:15:55 -0500
Subject: [PATCH 3/3] vm_exec.c: improve performance for arm64
| |compare-ruby|built-ruby|
|:------------------------------|-----------:|---------:|
|vm_array | 26.501M| 27.959M|
| | -| 1.06x|
|vm_attr_ivar | 21.606M| 31.429M|
| | -| 1.45x|
|vm_attr_ivar_set | 21.178M| 26.113M|
| | -| 1.23x|
|vm_backtrace | 6.621| 6.668|
| | -| 1.01x|
|vm_bigarray | 26.205M| 29.958M|
| | -| 1.14x|
|vm_bighash | 504.155k| 479.306k|
| | 1.05x| -|
|vm_block | 16.692M| 21.315M|
| | -| 1.28x|
|block_handler_type_iseq | 5.083| 7.004|
| | -| 1.38x|
---
vm_exec.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/vm_exec.c b/vm_exec.c
index ce2e053ee745..7aa56f6ad620 100644
--- a/vm_exec.c
+++ b/vm_exec.c
@@ -27,6 +27,9 @@ static void vm_insns_counter_count_insn(int insn) {}
#elif defined(__GNUC__) && defined(__powerpc64__)
#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
+#elif defined(__GNUC__) && defined(__aarch64__)
+#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("x" reg)
+
#else
#define DECL_SC_REG(type, r, reg) register type reg_##r
#endif
@@ -74,6 +77,11 @@ vm_exec_core(rb_execution_context_t *ec, VALUE initial)
DECL_SC_REG(rb_control_frame_t *, cfp, "15");
#define USE_MACHINE_REGS 1
+#elif defined(__GNUC__) && defined(__aarch64__)
+ DECL_SC_REG(const VALUE *, pc, "19");
+ DECL_SC_REG(rb_control_frame_t *, cfp, "20");
+#define USE_MACHINE_REGS 1
+
#else
register rb_control_frame_t *reg_cfp;
const VALUE *reg_pc;

125
ruby.spec
View File

@ -1,6 +1,6 @@
%global major_version 2
%global minor_version 7
%global teeny_version 2
%global teeny_version 1
%global major_minor_version %{major_version}.%{minor_version}
%global ruby_version %{major_minor_version}.%{teeny_version}
@ -22,15 +22,15 @@
%endif
%global release 136
%{!?release_string:%define release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
%global release 130
%{!?release_string:%define release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}.0.riscv64%{?dist}}
# The RubyGems library has to stay out of Ruby directory tree, since the
# RubyGems should be share by all Ruby implementations.
%global rubygems_dir %{_datadir}/rubygems
# Bundled libraries versions
%global rubygems_version 3.1.4
%global rubygems_version 3.1.2
%global rubygems_molinillo_version 0.5.7
# Default gems.
@ -44,7 +44,7 @@
%global bigdecimal_version 2.0.0
%global did_you_mean_version 1.4.0
%global io_console_version 0.5.6
%global irb_version 1.2.6
%global irb_version 1.2.3
%global json_version 2.3.0
%global net_telnet_version 0.2.0
%global openssl_version 2.1.2
@ -81,10 +81,6 @@
%bcond_without hardening_test
%endif
# LTO appears to cause some issue to SEGV handler.
# https://bugs.ruby-lang.org/issues/17052
%define _lto_cflags %{nil}
Summary: An interpreter of object-oriented scripting language
Name: ruby
Version: %{ruby_version}
@ -150,28 +146,26 @@ Patch9: ruby-2.3.1-Rely-on-ldd-to-detect-glibc.patch
# Revert commit which breaks bundled net-http-persistent version check.
# https://github.com/drbrain/net-http-persistent/pull/109
Patch10: ruby-2.7.0-Remove-RubyGems-dependency.patch
# Fix lchmod test failures.
# https://github.com/ruby/ruby/commit/a19228f878d955eaf2cce086bcf53f46fdf894b9
Patch11: ruby-2.8.0-Brace-the-fact-that-lchmod-can-EOPNOTSUPP.patch
# https://github.com/ruby/ruby/commit/72c02aa4b79731c7f25c9267f74b347f1946c704
Patch12: ruby-2.8.0-Moved-not-implemented-method-tests.patch
# Prevent issues with openssl loading when RubyGems are disabled.
# https://github.com/ruby/openssl/pull/242
Patch13: ruby-2.8.0-remove-unneeded-gem-require-for-ipaddr.patch
# Fix `require` behavior allowing to load libraries multiple times.
# https://github.com/rubygems/rubygems/issues/3647
# Because there were multiple fixes in `Kernel.require` in recent months,
# pickup all the changes one by one instead of squashing them.
# https://github.com/rubygems/rubygems/pull/3124
Patch15: rubygems-3.1.3-Fix-I-require-priority.patch
# https://github.com/rubygems/rubygems/pull/3133
Patch16: rubygems-3.1.3-Improve-require.patch
# https://github.com/rubygems/rubygems/pull/3153
Patch17: rubygems-3.1.3-Revert-Exclude-empty-suffix-from-I-require-loop.patch
# https://github.com/rubygems/rubygems/pull/3639
Patch18: rubygems-3.1.3-Fix-correctness-and-performance-regression-in-require.patch
# Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
# https://bugs.ruby-lang.org/issues/16492
Patch19: ruby-2.7.1-Timeout-the-test_bug_reporter_add-witout-raising-err.patch
# Enable arm64 optimizations.
# https://bugzilla.redhat.com/show_bug.cgi?id=1884728
# https://github.com/ruby/ruby/pull/3393
Patch20: ruby-3.0.0-preview1-Enable-arm64-optimizations-that-exist-for-power-x86.patch
# Add support for .include directive used by OpenSSL config files.
# https://github.com/ruby/openssl/pull/216
Patch22: ruby-2.6.0-config-support-include-directive.patch
# Disable pthread assert on Linux RISC-V (riscv64)
Patch30: abe2e7de4d1f2d5861d7c9ab9c7e778f2ee1dcd2.patch
# Same as for ARM.
# See: https://bugs.ruby-lang.org/issues/16007
# https://github.com/ruby/ruby/commit/324dd9d01f0c97631a2588f63231bcb651844cca
Patch31: ruby-2.7.1-disable-riscv64-clocks.patch
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Suggests: rubypick
@ -199,7 +193,6 @@ BuildRequires: procps
%{?with_hostname:BuildRequires: %{_bindir}/hostname}
BuildRequires: multilib-rpm-config
BuildRequires: gcc
BuildRequires: make
BuildRequires: zlib-devel
# This package provides %%{_bindir}/ruby-mri therefore it is marked by this
@ -277,7 +270,7 @@ libraries.
Summary: Macros and development tools for packaging RubyGems
Version: %{rubygems_version}
License: Ruby or MIT
Requires: ruby(rubygems) >= %{version}-%{release}
Requires: ruby(rubygems) = %{version}-%{release}
# Needed for RDoc documentation format generation.
Requires: rubygem(json) >= %{json_version}
Requires: rubygem(rdoc) >= %{rdoc_version}
@ -311,9 +304,6 @@ Summary: The Interactive Ruby
Version: %{irb_version}
Requires: ruby(release)
Requires: ruby(rubygems) >= %{rubygems_version}
# ruby-default-gems is required to run irb.
# https://bugs.ruby-lang.org/issues/16951
Requires: ruby-default-gems >= %{ruby_version}
Provides: irb = %{version}-%{release}
Provides: rubygem(irb) = %{version}-%{release}
# Obsoleted by Ruby 2.6 in F30 timeframe.
@ -582,13 +572,15 @@ rm -rf ext/fiddle/libffi*
%patch6 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch22 -p1
%ifarch riscv64
%patch30 -p1
%patch31 -p1
%endif
# Provide an example of usage of the tapset:
cp -a %{SOURCE3} .
@ -868,12 +860,30 @@ MSPECOPTS="$MSPECOPTS -P 'File.utime allows Time instances in the far future to
# Disable File.lchmod specs, which fails when building against glibc 2.31.9000.
# https://bugs.ruby-lang.org/issues/16749
MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not of the file'"
MSPECOPTS="$MSPECOPTS -P 'File.lchmod returns false from \#respond_to?'"
MSPECOPTS="$MSPECOPTS -P 'File.lchmod raises a NotImplementedError when called'"
# Give an option to increase the timeout in tests.
# https://bugs.ruby-lang.org/issues/16921
%{?test_timeout_scale:RUBY_TEST_TIMEOUT_SCALE="%{test_timeout_scale}"} \
make check TESTS="-v $DISABLE_TESTS" MSPECOPT="-fs $MSPECOPTS"
# Increase timeout for TestBugReporter#test_bug_reporter_add test, which fails
# quite often.
# https://bugs.ruby-lang.org/issues/16492
%ifarch s390x riscv64
sed -i '/assert_in_out_err/ s/)/, timeout: 30)/' test/-ext-/bug_reporter/test_bug_reporter.rb
%endif
%ifarch riscv64
# TestRubyOptions#test_segv_setproctitle: execution of assert_in_out_err expired timeout (10 sec)
# TestRubyOptions#test_segv_loaded_features: execution of assert_in_out_err expired timeout (10 sec)
# TestJIT#test_compile_insn_once: gcc: internal compiler error: Segmentation fault signal terminated program cc1
# The following timeout on QEMU:
# Racc::TestRaccCommand#test_cast: execution of assert_ruby_status expired timeout (10 sec)
# Racc::TestRaccCommand#test_riml: execution of assert_ruby_status expired timeout (10 sec)
# TestBugReporter#test_bug_reporter_add: execution of assert_in_out_err expired timeout (30 sec)
# TestFiber#test_many_fibers_with_threads: execution of assert_normal_exit expired timeout (60 sec)
# TestRubyOptions#test_segv_test: execution of assert_in_out_err expired timeout (10 sec)
DISABLE_TESTS="$DISABLE_TESTS -n !/test_segv_\(setproctitle\|loaded_features\)/ -n !/test_compile_insn_once/ -n !/test_cast/ -n !/test_riml/ -n !/test_bug_reporter_add/ -n !/test_many_fibers_with_threads/ -n !/test_segv_test/"
%endif
make check TESTS="-v $DISABLE_TESTS" MSPECOPT="-fs $MSPECOPTS"
%files
%license BSDL
@ -1156,7 +1166,7 @@ MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not
%{gem_dir}/specifications/default/racc-%{racc_version}.gemspec
%{gem_dir}/specifications/default/readline-0.0.2.gemspec
%{gem_dir}/specifications/default/readline-ext-0.1.0.gemspec
%{gem_dir}/specifications/default/reline-0.1.5.gemspec
%{gem_dir}/specifications/default/reline-0.1.3.gemspec
%{gem_dir}/specifications/default/rexml-3.2.3.gemspec
%{gem_dir}/specifications/default/rss-0.2.8.gemspec
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
@ -1286,29 +1296,8 @@ MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not
%changelog
* Tue Nov 24 18:16:02 CET 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.2-136
- Add explicit `BR: make`.
* Tue Oct 13 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.2-135
- Upgrade to Ruby 2.7.2.
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.1-134
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Mon Jul 27 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.1-133
- Disable LTO, which appear to cause issues with SIGSEV handler.
- Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
* Wed Jun 24 2020 Jun Aruga <jaruga@redhat.com> - 2.7.1-132
- Add ruby-default-gems dependency on irb.
Resolves: rhbz#1850541
* Wed Jun 24 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.1-132
- Fix `require` behavior allowing to load libraries multiple times.
Resolves: rhbz#1835836
* Fri May 15 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.1-131
- Relax rubygems-devel dependency on rubygems.
* Mon Apr 20 2020 David Abdurachmanov <david.abdurachmanov@sifive.com> - 2.7.1-130.0.riscv64
- Disable pthread assert on RISC-V (riscv64)
* Wed Apr 08 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.1-130
- Bundle did_you_mean into StdLib.

View File

@ -1,167 +0,0 @@
From 912d141a351053d0f6d915b5e7807f6a8f4c0631 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 4 Feb 2020 17:25:56 +0100
Subject: [PATCH 1/2] Make non "test_" method private
---
test/rubygems/test_require.rb | 2 ++
1 file changed, 2 insertions(+)
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index aa2675af5d..d618a93473 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -532,6 +532,8 @@ def test_require_bundler_with_bundler_version
end
end
+ private
+
def silence_warnings
old_verbose, $VERBOSE = $VERBOSE, false
yield
From b3944384f44b869985051863d8b05b545d09a585 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 4 Feb 2020 17:26:28 +0100
Subject: [PATCH 2/2] Fix require issue with file extension priority
If `require "a"` is run when two folders have been specified in the -I
option including a "a.rb" file and a "a.so" file respectively, the ruby
spec says that the ".rb" file should always be preferred. However, the
logic we added in https://github.com/rubygems/rubygems/commit/6b81076d9
to make the -I option always beat default gems does not respect this
spec, creating a difference from the original ruby-core's require.
[the ruby spec says]: https://github.com/ruby/spec/blob/d80a6e2b221d4f17a8cadcac75ef950c59cba901/core/kernel/shared/require.rb#L234-L246
---
lib/rubygems/core_ext/kernel_require.rb | 28 +++++------
test/rubygems/test_require.rb | 62 +++++++++++++++++++++++++
2 files changed, 74 insertions(+), 16 deletions(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 60f4d18712..369f2c743e 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -43,18 +43,18 @@ def require(path)
# https://github.com/rubygems/rubygems/pull/1868
resolved_path = begin
rp = nil
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
- begin
- if File.symlink? safe_lp # for backward compatibility
- next
+ Gem.suffixes.each do |s|
+ $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
+ begin
+ if File.symlink? safe_lp # for backward compatibility
+ next
+ end
+ rescue SecurityError
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ raise
end
- rescue SecurityError
- RUBYGEMS_ACTIVATION_MONITOR.exit
- raise
- end
- Gem.suffixes.each do |s|
full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
if File.file?(full_path)
rp = full_path
@@ -67,12 +67,8 @@ def require(path)
end
if resolved_path
- begin
- RUBYGEMS_ACTIVATION_MONITOR.exit
- return gem_original_require(resolved_path)
- rescue LoadError
- RUBYGEMS_ACTIVATION_MONITOR.enter
- end
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ return gem_original_require(resolved_path)
end
if spec = Gem.find_unresolved_default_spec(path)
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index d618a93473..7cffbfa7fe 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -120,6 +120,24 @@ def test_dash_i_beats_default_gems
Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
end
+ def test_dash_i_respects_default_library_extension_priority
+ skip "extensions don't quite work on jruby" if Gem.java_platform?
+
+ dash_i_ext_arg = util_install_extension_file('a')
+ dash_i_lib_arg = util_install_ruby_file('a')
+
+ lp = $LOAD_PATH.dup
+
+ begin
+ $LOAD_PATH.unshift dash_i_lib_arg
+ $LOAD_PATH.unshift dash_i_ext_arg
+ assert_require 'a'
+ assert_match(/a\.rb$/, $LOADED_FEATURES.last)
+ ensure
+ $LOAD_PATH.replace lp
+ end
+ end
+
def test_concurrent_require
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
@@ -541,4 +559,48 @@ def silence_warnings
$VERBOSE = old_verbose
end
+ def util_install_extension_file(name)
+ spec = quick_gem name
+ util_build_gem spec
+
+ spec.extensions << "extconf.rb"
+ write_file File.join(@tempdir, "extconf.rb") do |io|
+ io.write <<-RUBY
+ require "mkmf"
+ create_makefile("#{name}")
+ RUBY
+ end
+
+ write_file File.join(@tempdir, "#{name}.c") do |io|
+ io.write <<-C
+ #include <ruby.h>
+ void Init_#{name}() { }
+ C
+ end
+
+ spec.files += ["extconf.rb", "#{name}.c"]
+
+ so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
+ refute_path_exists so
+
+ path = Gem::Package.build spec
+ installer = Gem::Installer.at path
+ installer.install
+ assert_path_exists so
+
+ spec.gem_dir
+ end
+
+ def util_install_ruby_file(name)
+ dir_lib = Dir.mktmpdir("test_require_lib", @tempdir)
+ dash_i_lib_arg = File.join dir_lib
+
+ a_rb = File.join dash_i_lib_arg, "#{name}.rb"
+
+ FileUtils.mkdir_p File.dirname a_rb
+ File.open(a_rb, 'w') { |f| f.write "# #{name}.rb" }
+
+ dash_i_lib_arg
+ end
+
end

View File

@ -1,324 +0,0 @@
From 00d98eb8a3245fb93a475ecbbbc4c7ec7e6704cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 19 May 2020 14:00:00 +0200
Subject: [PATCH 1/5] Fix performance regression in `require`
Our check for `-I` paths should not go through all activated gems.
---
lib/rubygems.rb | 10 ++++++++++
lib/rubygems/core_ext/kernel_require.rb | 2 +-
lib/rubygems/test_case.rb | 1 +
test/rubygems/test_require.rb | 11 +++++++++++
4 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index 843cb49e4a..d1a9a1c7e1 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -662,10 +662,20 @@ def self.load_path_insert_index
index
end
+ ##
+ # The number of paths in the `$LOAD_PATH` from activated gems. Used to
+ # prioritize `-I` and `ENV['RUBYLIB`]` entries during `require`.
+
+ def self.activated_gem_paths
+ @activated_gem_paths ||= 0
+ end
+
##
# Add a list of paths to the $LOAD_PATH at the proper place.
def self.add_to_load_path(*paths)
+ @activated_gem_paths = activated_gem_paths + paths.size
+
insert_index = load_path_insert_index
if insert_index
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index ed24111bd5..7625ce1bee 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -47,7 +47,7 @@ def require(path)
load_path_insert_index = Gem.load_path_insert_index
break unless load_path_insert_index
- $LOAD_PATH[0...load_path_insert_index].each do |lp|
+ $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
safe_lp = lp.dup.tap(&Gem::UNTAINT)
begin
if File.symlink? safe_lp # for backward compatibility
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb
index a05a2898d1..53dd495aef 100644
--- a/lib/rubygems/test_case.rb
+++ b/lib/rubygems/test_case.rb
@@ -385,6 +385,7 @@ def setup
Gem::Security.reset
Gem.loaded_specs.clear
+ Gem.instance_variable_set(:@activated_gem_paths, 0)
Gem.clear_default_specs
Bundler.reset!
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index f36892f8cc..9f2fe3439a 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -382,6 +382,17 @@ def test_default_gem_require_activates_just_once
assert_equal 0, times_called
end
+ def test_second_gem_require_does_not_resolve_path_manually_before_going_through_standard_require
+ a1 = util_spec "a", "1", nil, "lib/test_gem_require_a.rb"
+ install_gem a1
+
+ assert_require "test_gem_require_a"
+
+ stub(:gem_original_require, ->(path) { assert_equal "test_gem_require_a", path }) do
+ require "test_gem_require_a"
+ end
+ end
+
def test_realworld_default_gem
testing_ruby_repo = !ENV["GEM_COMMAND"].nil?
skip "this test can't work under ruby-core setup" if testing_ruby_repo || java_platform?
From ae95885dff6189c5ac59bbdf685cb4ec4751fdef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 19 May 2020 14:08:19 +0200
Subject: [PATCH 2/5] Refactor `Gem.load_path_insert_index`
---
lib/rubygems.rb | 13 +++----------
lib/rubygems/core_ext/kernel_require.rb | 5 +----
2 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index d1a9a1c7e1..ca80326459 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -659,7 +659,7 @@ def self.load_path_insert_index
index = $LOAD_PATH.index RbConfig::CONFIG['sitelibdir']
- index
+ index || 0
end
##
@@ -676,15 +676,8 @@ def self.activated_gem_paths
def self.add_to_load_path(*paths)
@activated_gem_paths = activated_gem_paths + paths.size
- insert_index = load_path_insert_index
-
- if insert_index
- # gem directories must come after -I and ENV['RUBYLIB']
- $LOAD_PATH.insert(insert_index, *paths)
- else
- # we are probably testing in core, -I and RUBYLIB don't apply
- $LOAD_PATH.unshift(*paths)
- end
+ # gem directories must come after -I and ENV['RUBYLIB']
+ $LOAD_PATH.insert(Gem.load_path_insert_index, *paths)
end
@yaml_loaded = false
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 7625ce1bee..decf4829f1 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -44,10 +44,7 @@ def require(path)
resolved_path = begin
rp = nil
Gem.suffixes.each do |s|
- load_path_insert_index = Gem.load_path_insert_index
- break unless load_path_insert_index
-
- $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
+ $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
safe_lp = lp.dup.tap(&Gem::UNTAINT)
begin
if File.symlink? safe_lp # for backward compatibility
From da1492e9d7b28d068fbfbb0ba1cafcc516681567 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 19 May 2020 14:32:12 +0200
Subject: [PATCH 3/5] Extract a local outside the loop
---
lib/rubygems/core_ext/kernel_require.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index decf4829f1..6a7faaf2d1 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -43,8 +43,9 @@ def require(path)
# https://github.com/rubygems/rubygems/pull/1868
resolved_path = begin
rp = nil
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
Gem.suffixes.each do |s|
- $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
safe_lp = lp.dup.tap(&Gem::UNTAINT)
begin
if File.symlink? safe_lp # for backward compatibility
From 22ad5717c38feda2375b53628d15ae3db2195684 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Thu, 21 May 2020 15:20:57 +0200
Subject: [PATCH 4/5] Fix `$LOADED_FEATURES` cache sometimes not respected
In the cases where the initial manually `-I` path resolution succeeded,
we were passing a full path to the original require effectively skipping
the `$LOADED_FEATURES` cache. With this change, we _only_ do the
resolution when a matching requirable path is found in a default gem. In
that case, we skip activation of the default gem if we detect that the
required file will be picked up for a `-I` path.
---
lib/rubygems/core_ext/kernel_require.rb | 53 +++++++++++--------------
test/rubygems/test_require.rb | 29 ++++++++++++++
2 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 6a7faaf2d1..81e37b98bf 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -39,46 +39,41 @@ def require(path)
path = path.to_path if path.respond_to? :to_path
- # Ensure -I beats a default gem
- # https://github.com/rubygems/rubygems/pull/1868
- resolved_path = begin
- rp = nil
- load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
- Gem.suffixes.each do |s|
- $LOAD_PATH[0...load_path_check_index].each do |lp|
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
- begin
- if File.symlink? safe_lp # for backward compatibility
- next
+ if spec = Gem.find_unresolved_default_spec(path)
+ # Ensure -I beats a default gem
+ # https://github.com/rubygems/rubygems/pull/1868
+ resolved_path = begin
+ rp = nil
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
+ Gem.suffixes.each do |s|
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
+ begin
+ if File.symlink? safe_lp # for backward compatibility
+ next
+ end
+ rescue SecurityError
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ raise
end
- rescue SecurityError
- RUBYGEMS_ACTIVATION_MONITOR.exit
- raise
- end
- full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
- if File.file?(full_path)
- rp = full_path
- break
+ full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
+ if File.file?(full_path)
+ rp = full_path
+ break
+ end
end
+ break if rp
end
- break if rp
+ rp
end
- rp
- end
- if resolved_path
- RUBYGEMS_ACTIVATION_MONITOR.exit
- return gem_original_require(resolved_path)
- end
-
- if spec = Gem.find_unresolved_default_spec(path)
begin
Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease)
rescue Exception
RUBYGEMS_ACTIVATION_MONITOR.exit
raise
- end
+ end unless resolved_path
end
# If there are no unresolved deps, then we can use just try
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index 9f2fe3439a..2b11e26dfe 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -45,6 +45,35 @@ def refute_require(path)
refute require(path), "'#{path}' was not yet required"
end
+ def test_respect_loaded_features_caching_like_standard_require
+ dir = Dir.mktmpdir("test_require", @tempdir)
+
+ lp1 = File.join dir, 'foo1'
+ foo1 = File.join lp1, 'foo.rb'
+
+ FileUtils.mkdir_p lp1
+ File.open(foo1, 'w') { |f| f.write "class Object; HELLO = 'foo1' end" }
+
+ lp = $LOAD_PATH.dup
+
+ $LOAD_PATH.unshift lp1
+ assert_require 'foo'
+ assert_equal "foo1", ::Object::HELLO
+
+ lp2 = File.join dir, 'foo2'
+ foo2 = File.join lp2, 'foo.rb'
+
+ FileUtils.mkdir_p lp2
+ File.open(foo2, 'w') { |f| f.write "class Object; HELLO = 'foo2' end" }
+
+ $LOAD_PATH.unshift lp2
+ refute_require 'foo'
+ assert_equal "foo1", ::Object::HELLO
+ ensure
+ $LOAD_PATH.replace lp
+ Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
+ end
+
# Providing -I on the commandline should always beat gems
def test_dash_i_beats_gems
a1 = util_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb"
From db872c7a18d616f4447bdcca3130be6db9e5cb03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Sat, 23 May 2020 20:18:41 +0200
Subject: [PATCH 5/5] Remove direct reference to PR
The code is quite different now, so I think the link might be even
confusing. If you want to know more, use git history.
---
lib/rubygems/core_ext/kernel_require.rb | 1 -
1 file changed, 1 deletion(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 81e37b98bf..115ae0cb50 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -41,7 +41,6 @@ def require(path)
if spec = Gem.find_unresolved_default_spec(path)
# Ensure -I beats a default gem
- # https://github.com/rubygems/rubygems/pull/1868
resolved_path = begin
rp = nil
load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths

View File

@ -1,92 +0,0 @@
From c5197b2ab35ba389f48918e0c773b43b6dca2fa5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Fri, 7 Feb 2020 17:16:05 +0100
Subject: [PATCH 1/3] Tweaks to get test passing more reliably
---
test/rubygems/test_require.rb | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index 7cffbfa7fe..67c55416d4 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -567,18 +567,20 @@ def util_install_extension_file(name)
write_file File.join(@tempdir, "extconf.rb") do |io|
io.write <<-RUBY
require "mkmf"
+ CONFIG['LDSHARED'] = '$(TOUCH) $@ ||'
create_makefile("#{name}")
RUBY
end
write_file File.join(@tempdir, "#{name}.c") do |io|
io.write <<-C
- #include <ruby.h>
void Init_#{name}() { }
C
end
- spec.files += ["extconf.rb", "#{name}.c"]
+ write_file File.join(@tempdir, "depend")
+
+ spec.files += ["extconf.rb", "depend", "#{name}.c"]
so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
refute_path_exists so
From 7bfd7319cd751837c3ccaf1d97b02846eaaf39d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 11 Feb 2020 11:56:06 +0100
Subject: [PATCH 2/3] Fix bug bug calculating $LOAD_PATH's to check in
`require`
In `Gem.load_path_insert_index` is not set, we end up having
`$LOAD_PATH[0...-1]`, unintentionally skipping the last $LOAD_PATH entry
from the check.
The correct thing to do in that case is to not even try since we have no
way of distinguisng default LOAD_PATH entries from those added with -I.
---
lib/rubygems/core_ext/kernel_require.rb | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 369f2c743e..a8d170f13a 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -44,7 +44,10 @@ def require(path)
resolved_path = begin
rp = nil
Gem.suffixes.each do |s|
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
+ load_path_insert_index = Gem.load_path_insert_index
+ break unless load_path_insert_index
+
+ $LOAD_PATH[0...load_path_insert_index].each do |lp|
safe_lp = lp.dup.tap(&Gem::UNTAINT)
begin
if File.symlink? safe_lp # for backward compatibility
From 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Fri, 14 Feb 2020 02:03:04 +0100
Subject: [PATCH 3/3] Exclude empty suffix from `-I` require loop
---
lib/rubygems/core_ext/kernel_require.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index a8d170f13a..9712fb6ac0 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -43,7 +43,7 @@ def require(path)
# https://github.com/rubygems/rubygems/pull/1868
resolved_path = begin
rp = nil
- Gem.suffixes.each do |s|
+ Gem.suffixes[1..-1].each do |s|
load_path_insert_index = Gem.load_path_insert_index
break unless load_path_insert_index

View File

@ -1,29 +0,0 @@
From 301e30bf97dd603ca81d52b90186908575c4ddf8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
Date: Tue, 25 Feb 2020 15:01:44 +0100
Subject: [PATCH] Revert "Exclude empty suffix from `-I` require loop"
This reverts commit 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3.
Technically, extensionless ruby files are valid ruby files that can be
required. For example, `bin/bundle` is sometimes required from other
binstubs even if it's also runnable directly.
So, we should technically consider this kind of files too.
---
lib/rubygems/core_ext/kernel_require.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 9712fb6ac0..a8d170f13a 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -43,7 +43,7 @@ def require(path)
# https://github.com/rubygems/rubygems/pull/1868
resolved_path = begin
rp = nil
- Gem.suffixes[1..-1].each do |s|
+ Gem.suffixes.each do |s|
load_path_insert_index = Gem.load_path_insert_index
break unless load_path_insert_index

View File

@ -1 +1 @@
SHA512 (ruby-2.7.2.tar.xz) = 7972278b096aa768c7adf2befd26003e18781a29ca317640317d30d93d6e963ded197724c8e2f1dfe1e838c5647176d414a74732a62e931fb50d6f2e0f777349
SHA512 (ruby-2.7.1.tar.xz) = 79f98b1ea98e0b10ec79da1883e8fc84d48ffe5c09ae945cbebde94365e35a589d919aac965f74d70ca7e21370ecee631ac5a8f9c4eac61d62f5aa629f27bf31