parent
d064a7f405
commit
0ac9ccaebf
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index d261ea57b5..3c13076b82 100644
|
index d261ea57b5..3c13076b82 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3105,6 +3105,11 @@ AS_IF([test ${multiarch+set}], [
|
@@ -3115,6 +3115,11 @@ AS_IF([test ${multiarch+set}], [
|
||||||
])
|
])
|
||||||
|
|
||||||
archlibdir='${libdir}/${arch}'
|
archlibdir='${libdir}/${arch}'
|
||||||
|
|
|
@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index c42436c23d..d261ea57b5 100644
|
index c42436c23d..d261ea57b5 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3743,7 +3743,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
@@ -3753,7 +3753,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||||
|
|
||||||
if test -z "${ruby_version_dir_name}"; then
|
if test -z "${ruby_version_dir_name}"; then
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 3c13076b82..93af30321d 100644
|
index 3c13076b82..93af30321d 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3807,6 +3807,8 @@ AC_SUBST(vendorarchdir)dnl
|
@@ -3817,6 +3817,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 93af30321d..bc13397e0e 100644
|
index 93af30321d..bc13397e0e 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3779,6 +3779,10 @@ AC_ARG_WITH(vendorarchdir,
|
@@ -3789,6 +3789,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||||
[vendorarchdir=$withval],
|
[vendorarchdir=$withval],
|
||||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
[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}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
RUBY_EXEC_PREFIX=''
|
RUBY_EXEC_PREFIX=''
|
||||||
@@ -3803,6 +3807,7 @@ AC_SUBST(sitearchdir)dnl
|
@@ -3813,6 +3817,7 @@ AC_SUBST(sitearchdir)dnl
|
||||||
AC_SUBST(vendordir)dnl
|
AC_SUBST(vendordir)dnl
|
||||||
AC_SUBST(vendorlibdir)dnl
|
AC_SUBST(vendorlibdir)dnl
|
||||||
AC_SUBST(vendorarchdir)dnl
|
AC_SUBST(vendorarchdir)dnl
|
||||||
|
|
|
@ -20,7 +20,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 80b137e380..63cd3b4f8b 100644
|
index 80b137e380..63cd3b4f8b 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3694,9 +3694,6 @@ AS_CASE(["$target_os"],
|
@@ -3704,9 +3704,6 @@ AS_CASE(["$target_os"],
|
||||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||||
AC_ARG_WITH(rubyarchprefix,
|
AC_ARG_WITH(rubyarchprefix,
|
||||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||||
@@ -3719,56 +3716,62 @@ AC_ARG_WITH(ridir,
|
@@ -3729,56 +3726,62 @@ AC_ARG_WITH(ridir,
|
||||||
AC_SUBST(ridir)
|
AC_SUBST(ridir)
|
||||||
AC_SUBST(RI_BASE_NAME)
|
AC_SUBST(RI_BASE_NAME)
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
|
|
||||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
@@ -3785,6 +3788,7 @@ AC_SUBST(sitearchincludedir)dnl
|
@@ -3795,6 +3798,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||||
AC_SUBST(arch)dnl
|
AC_SUBST(arch)dnl
|
||||||
AC_SUBST(sitearch)dnl
|
AC_SUBST(sitearch)dnl
|
||||||
AC_SUBST(ruby_version)dnl
|
AC_SUBST(ruby_version)dnl
|
||||||
|
|
|
@ -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;
|
|
39
ruby.spec
39
ruby.spec
|
@ -1,6 +1,6 @@
|
||||||
%global major_version 2
|
%global major_version 2
|
||||||
%global minor_version 7
|
%global minor_version 7
|
||||||
%global teeny_version 2
|
%global teeny_version 3
|
||||||
%global major_minor_version %{major_version}.%{minor_version}
|
%global major_minor_version %{major_version}.%{minor_version}
|
||||||
|
|
||||||
%global ruby_version %{major_minor_version}.%{teeny_version}
|
%global ruby_version %{major_minor_version}.%{teeny_version}
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
||||||
%global release 135
|
%global release 136
|
||||||
%{!?release_string:%define release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
|
%{!?release_string:%define release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
|
||||||
|
|
||||||
# The RubyGems library has to stay out of Ruby directory tree, since the
|
# The RubyGems library has to stay out of Ruby directory tree, since the
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
%global rubygems_dir %{_datadir}/rubygems
|
%global rubygems_dir %{_datadir}/rubygems
|
||||||
|
|
||||||
# Bundled libraries versions
|
# Bundled libraries versions
|
||||||
%global rubygems_version 3.1.4
|
%global rubygems_version 3.1.6
|
||||||
%global rubygems_molinillo_version 0.5.7
|
%global rubygems_molinillo_version 0.5.7
|
||||||
|
|
||||||
# Default gems.
|
# Default gems.
|
||||||
|
@ -149,25 +149,9 @@ Patch10: ruby-2.7.0-Remove-RubyGems-dependency.patch
|
||||||
# Prevent issues with openssl loading when RubyGems are disabled.
|
# Prevent issues with openssl loading when RubyGems are disabled.
|
||||||
# https://github.com/ruby/openssl/pull/242
|
# https://github.com/ruby/openssl/pull/242
|
||||||
Patch13: ruby-2.8.0-remove-unneeded-gem-require-for-ipaddr.patch
|
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.
|
# Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
|
||||||
# https://bugs.ruby-lang.org/issues/16492
|
# https://bugs.ruby-lang.org/issues/16492
|
||||||
Patch19: ruby-2.7.1-Timeout-the-test_bug_reporter_add-witout-raising-err.patch
|
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
|
|
||||||
|
|
||||||
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
||||||
Suggests: rubypick
|
Suggests: rubypick
|
||||||
|
@ -578,12 +562,7 @@ rm -rf ext/fiddle/libffi*
|
||||||
%patch9 -p1
|
%patch9 -p1
|
||||||
%patch10 -p1
|
%patch10 -p1
|
||||||
%patch13 -p1
|
%patch13 -p1
|
||||||
%patch15 -p1
|
|
||||||
%patch16 -p1
|
|
||||||
%patch17 -p1
|
|
||||||
%patch18 -p1
|
|
||||||
%patch19 -p1
|
%patch19 -p1
|
||||||
%patch20 -p1
|
|
||||||
|
|
||||||
# Provide an example of usage of the tapset:
|
# Provide an example of usage of the tapset:
|
||||||
cp -a %{SOURCE3} .
|
cp -a %{SOURCE3} .
|
||||||
|
@ -780,6 +759,10 @@ sed -i 's/^/%lang(ja) /' .ruby-doc.ja
|
||||||
# https://github.com/ruby/rake/pull/333
|
# https://github.com/ruby/rake/pull/333
|
||||||
rm -rf %{buildroot}%{gem_dir}/gems/rake-%{rake_version}/.github
|
rm -rf %{buildroot}%{gem_dir}/gems/rake-%{rake_version}/.github
|
||||||
|
|
||||||
|
# Remove accidentaly added files
|
||||||
|
# https://bugs.ruby-lang.org/issues/17784
|
||||||
|
rm -rf %{buildroot}%{ruby_libdir}/exe/
|
||||||
|
|
||||||
%check
|
%check
|
||||||
%if 0%{?with_hardening_test}
|
%if 0%{?with_hardening_test}
|
||||||
# Check Ruby hardening.
|
# Check Ruby hardening.
|
||||||
|
@ -1178,7 +1161,7 @@ sed -i '/^ def test_ignored_interrupt$/,/^ end$/ s/^/#/' \
|
||||||
%{gem_dir}/specifications/default/readline-0.0.2.gemspec
|
%{gem_dir}/specifications/default/readline-0.0.2.gemspec
|
||||||
%{gem_dir}/specifications/default/readline-ext-0.1.0.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.5.gemspec
|
||||||
%{gem_dir}/specifications/default/rexml-3.2.3.gemspec
|
%{gem_dir}/specifications/default/rexml-3.2.3.1.gemspec
|
||||||
%{gem_dir}/specifications/default/rss-0.2.8.gemspec
|
%{gem_dir}/specifications/default/rss-0.2.8.gemspec
|
||||||
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
|
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/singleton-0.1.0.gemspec
|
%{gem_dir}/specifications/default/singleton-0.1.0.gemspec
|
||||||
|
@ -1187,7 +1170,7 @@ sed -i '/^ def test_ignored_interrupt$/,/^ end$/ s/^/#/' \
|
||||||
%{gem_dir}/specifications/default/timeout-0.1.0.gemspec
|
%{gem_dir}/specifications/default/timeout-0.1.0.gemspec
|
||||||
%{gem_dir}/specifications/default/tracer-0.1.0.gemspec
|
%{gem_dir}/specifications/default/tracer-0.1.0.gemspec
|
||||||
%{gem_dir}/specifications/default/uri-0.10.0.gemspec
|
%{gem_dir}/specifications/default/uri-0.10.0.gemspec
|
||||||
%{gem_dir}/specifications/default/webrick-1.6.0.gemspec
|
%{gem_dir}/specifications/default/webrick-1.6.1.gemspec
|
||||||
%{gem_dir}/specifications/default/yaml-0.1.0.gemspec
|
%{gem_dir}/specifications/default/yaml-0.1.0.gemspec
|
||||||
%{gem_dir}/specifications/default/zlib-1.1.0.gemspec
|
%{gem_dir}/specifications/default/zlib-1.1.0.gemspec
|
||||||
|
|
||||||
|
@ -1302,6 +1285,10 @@ sed -i '/^ def test_ignored_interrupt$/,/^ end$/ s/^/#/' \
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Apr 07 2021 Pavel Valena <pvalena@redhat.com> - 2.7.3-136
|
||||||
|
- Upgrade to Ruby 2.7.3.
|
||||||
|
Resolves: rhbz#1947938
|
||||||
|
|
||||||
* Tue Oct 13 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.2-135
|
* Tue Oct 13 2020 Vít Ondruch <vondruch@redhat.com> - 2.7.2-135
|
||||||
- Upgrade to Ruby 2.7.2.
|
- Upgrade to Ruby 2.7.2.
|
||||||
- Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
|
- Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
2
sources
2
sources
|
@ -1 +1 @@
|
||||||
SHA512 (ruby-2.7.2.tar.xz) = 7972278b096aa768c7adf2befd26003e18781a29ca317640317d30d93d6e963ded197724c8e2f1dfe1e838c5647176d414a74732a62e931fb50d6f2e0f777349
|
SHA512 (ruby-2.7.3.tar.xz) = b755d418b3bab2f9f6a8893afd13869269f17065643dde78b9e85ae3538a6d0617893db6e9c3908e00a40c7577a5c912a7c822d8f245cdcfb857be76dfb66c1e
|
||||||
|
|
Loading…
Reference in New Issue