The package rpms/ruby.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/ruby.git/commit/?id=ecbc53b331bd1....
Change:
-%ifarch aarch64
Thanks.
Full change:
============
commit ecbc53b331bd1e2cec6f51a36f4be869a2720630
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Tue Apr 10 09:09:46 2018 +0200
Revert "Use --with-setjmp-type=setjmp on aarch64 to work around gcc issue
(#1545239)"
This reverts commit a3207ebb169bacb722745448c114f015d63cd25c.
This should not be needed, since changes in GCC were reverted.
diff --git a/ruby.spec b/ruby.spec
index 70598d2..fb10f6e 100644
--- a/ruby.spec
+++ b/ruby.spec
@@ -560,9 +560,6 @@ autoconf
--with-ruby-version='' \
--enable-multiarch \
--with-prelude=./abrt_prelude.rb \
-%ifarch aarch64
- --with-setjmp-type=setjmp \
-%endif
# Q= makes the build output more verbose and allows to check Fedora
# compiler options.
@@ -1075,6 +1072,7 @@ make check TESTS="-v $DISABLE_TESTS"
%changelog
* Tue Apr 10 2018 Vít Ondruch <vondruch(a)redhat.com> - 2.5.1-92
- Conflict requirement needs to generate dependency.
+- Stop using --with-setjmp-type=setjmp on aarch64 (rhbz#1545239).
* Thu Mar 29 2018 Pavel Valena <pvalena(a)redhat.com> - 2.5.1-92
- Update to Ruby 2.5.1.
commit f571c557e21b5573dff83a279088b624f1095748
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Tue Apr 10 09:07:02 2018 +0200
Conflict requirement needs to generate dependency.
If there is only conflict requirement, this still menas that there is
dependency on that package and appropriate requirement must be generated
(rhbz#1561487)
diff --git a/ruby.spec b/ruby.spec
index c86034c..70598d2 100644
--- a/ruby.spec
+++ b/ruby.spec
@@ -1073,6 +1073,9 @@ make check TESTS="-v $DISABLE_TESTS"
%{gem_dir}/specifications/xmlrpc-%{xmlrpc_version}.gemspec
%changelog
+* Tue Apr 10 2018 Vít Ondruch <vondruch(a)redhat.com> - 2.5.1-92
+- Conflict requirement needs to generate dependency.
+
* Thu Mar 29 2018 Pavel Valena <pvalena(a)redhat.com> - 2.5.1-92
- Update to Ruby 2.5.1.
diff --git a/rubygems.req b/rubygems.req
index 6868bdd..d75247d 100644
--- a/rubygems.req
+++ b/rubygems.req
@@ -11,7 +11,13 @@ module RubyGemsReq
when '~>'
expand_pessimistic_requirement(r)
when '!='
- []
+ # If there is only the conflict requirement, we still need to depend
+ # on the specified gem.
+ if requirements.size == 1
+ Gem::Requirement.default.requirements
+ else
+ []
+ end
else
[r]
end
commit 793a1c36126fe96e3dbe8457685b7570b839022d
Author: Pavel Valena <pvalena(a)redhat.com>
Date: Thu Mar 29 15:25:06 2018 +0200
Update to Ruby 2.5.1.
diff --git a/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
b/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
index 66cb565..47bf9bc 100644
--- a/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
+++ b/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
@@ -39,7 +39,7 @@ diff --git a/configure.ac b/configure.ac
index 028ef7ca3e..cdeff87871 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4395,6 +4395,13 @@ AC_SUBST(rubyarchhdrdir)dnl
+@@ -4396,6 +4396,13 @@ AC_SUBST(rubyarchhdrdir)dnl
AC_SUBST(sitearchhdrdir)dnl
AC_SUBST(vendorarchhdrdir)dnl
diff --git a/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
b/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
index 41444c5..36ec460 100644
--- a/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
+++ b/ruby-2.1.0-Enable-configuration-of-archlibdir.patch
@@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
index 11fc237552..b77e88fc37 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -3640,6 +3640,11 @@ AS_IF([test ${multiarch+set}], [
+@@ -3641,6 +3641,11 @@ AS_IF([test ${multiarch+set}], [
])
archlibdir='${libdir}/${arch}'
diff --git a/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch
b/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch
index bdc074d..d0cffab 100644
--- a/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch
+++ b/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch
@@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
index 999e2d6d5d..11fc237552 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4250,7 +4250,8 @@ AS_CASE(["$ruby_version_dir_name"],
+@@ -4251,7 +4251,8 @@ AS_CASE(["$ruby_version_dir_name"],
ruby_version_dir=/'${ruby_version_dir_name}'
if test -z "${ruby_version_dir_name}"; then
diff --git a/ruby-2.1.0-always-use-i386.patch b/ruby-2.1.0-always-use-i386.patch
index 4864741..555ad45 100644
--- a/ruby-2.1.0-always-use-i386.patch
+++ b/ruby-2.1.0-always-use-i386.patch
@@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
index b77e88fc37..6bba453e3c 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4314,6 +4314,8 @@ AC_SUBST(vendorarchdir)dnl
+@@ -4315,6 +4315,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
diff --git a/ruby-2.1.0-custom-rubygems-location.patch
b/ruby-2.1.0-custom-rubygems-location.patch
index cc55c4a..cc45741 100644
--- a/ruby-2.1.0-custom-rubygems-location.patch
+++ b/ruby-2.1.0-custom-rubygems-location.patch
@@ -15,7 +15,7 @@ diff --git a/configure.ac b/configure.ac
index 6bba453e3c..028ef7ca3e 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4286,6 +4286,10 @@ AC_ARG_WITH(vendorarchdir,
+@@ -4287,6 +4287,10 @@ AC_ARG_WITH(vendorarchdir,
[vendorarchdir=$withval],
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
@@ -26,7 +26,7 @@ index 6bba453e3c..028ef7ca3e 100644
AS_IF([test "${LOAD_RELATIVE+set}"], [
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
RUBY_EXEC_PREFIX=''
-@@ -4310,6 +4314,7 @@ AC_SUBST(sitearchdir)dnl
+@@ -4311,6 +4315,7 @@ AC_SUBST(sitearchdir)dnl
AC_SUBST(vendordir)dnl
AC_SUBST(vendorlibdir)dnl
AC_SUBST(vendorarchdir)dnl
diff --git a/ruby-2.3.0-ruby_version.patch b/ruby-2.3.0-ruby_version.patch
index 5e24003..8f57319 100644
--- a/ruby-2.3.0-ruby_version.patch
+++ b/ruby-2.3.0-ruby_version.patch
@@ -20,7 +20,7 @@ diff --git a/configure.ac b/configure.ac
index 8ea969412f..a00f2b6776 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4201,9 +4201,6 @@ AS_CASE(["$target_os"],
+@@ -4202,9 +4202,6 @@ AS_CASE(["$target_os"],
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
])
@@ -30,7 +30,7 @@ index 8ea969412f..a00f2b6776 100644
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
AC_ARG_WITH(rubyarchprefix,
AS_HELP_STRING([--with-rubyarchprefix=DIR],
-@@ -4226,56 +4223,62 @@ AC_ARG_WITH(ridir,
+@@ -4227,56 +4224,62 @@ AC_ARG_WITH(ridir,
AC_SUBST(ridir)
AC_SUBST(RI_BASE_NAME)
@@ -120,7 +120,7 @@ index 8ea969412f..a00f2b6776 100644
AS_IF([test "${LOAD_RELATIVE+set}"], [
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
-@@ -4292,6 +4295,7 @@ AC_SUBST(sitearchincludedir)dnl
+@@ -4293,6 +4296,7 @@ AC_SUBST(sitearchincludedir)dnl
AC_SUBST(arch)dnl
AC_SUBST(sitearch)dnl
AC_SUBST(ruby_version)dnl
diff --git a/ruby-2.5.0-Disable-Tokyo-TZ-tests.patch
b/ruby-2.5.0-Disable-Tokyo-TZ-tests.patch
deleted file mode 100644
index 01632eb..0000000
--- a/ruby-2.5.0-Disable-Tokyo-TZ-tests.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
-index 20a57fe7dd..5b9e5a8bde 100644
---- a/test/ruby/test_time_tz.rb
-+++ b/test/ruby/test_time_tz.rb
-@@ -126,8 +126,8 @@ def test_asia_singapore
-
- def test_asia_tokyo
- with_tz(tz="Asia/Tokyo") {
-- assert_time_constructor(tz, "1951-05-06 03:00:00 +1000", :local,
[1951,5,6,2,0,0])
-- assert_time_constructor(tz, "1951-05-06 03:59:59 +1000", :local,
[1951,5,6,2,59,59])
-+# assert_time_constructor(tz, "1951-05-06 03:00:00 +1000", :local,
[1951,5,6,2,0,0])
-+# assert_time_constructor(tz, "1951-05-06 03:59:59 +1000", :local,
[1951,5,6,2,59,59])
- assert_time_constructor(tz, "2010-06-10 06:13:28 +0900", :local,
[2010,6,10,6,13,28])
- }
- end
-@@ -329,10 +329,10 @@ def self.gen_zdump_test(data)
- Asia/Singapore Sun Aug 8 16:30:00 1965 UTC = Mon Aug 9 00:00:00 1965 SGT isdst=0
gmtoff=27000
- Asia/Singapore Thu Dec 31 16:29:59 1981 UTC = Thu Dec 31 23:59:59 1981 SGT isdst=0
gmtoff=27000
- Asia/Singapore Thu Dec 31 16:30:00 1981 UTC = Fri Jan 1 00:30:00 1982 SGT isdst=0
gmtoff=28800
--Asia/Tokyo Sat May 5 16:59:59 1951 UTC = Sun May 6 01:59:59 1951 JST isdst=0
gmtoff=32400
--Asia/Tokyo Sat May 5 17:00:00 1951 UTC = Sun May 6 03:00:00 1951 JDT isdst=1
gmtoff=36000
--Asia/Tokyo Fri Sep 7 15:59:59 1951 UTC = Sat Sep 8 01:59:59 1951 JDT isdst=1
gmtoff=36000
--Asia/Tokyo Fri Sep 7 16:00:00 1951 UTC = Sat Sep 8 01:00:00 1951 JST isdst=0
gmtoff=32400
-+#Asia/Tokyo Sat May 5 16:59:59 1951 UTC = Sun May 6 01:59:59 1951 JST isdst=0
gmtoff=32400
-+#Asia/Tokyo Sat May 5 17:00:00 1951 UTC = Sun May 6 03:00:00 1951 JDT isdst=1
gmtoff=36000
-+#Asia/Tokyo Fri Sep 7 15:59:59 1951 UTC = Sat Sep 8 01:59:59 1951 JDT isdst=1
gmtoff=36000
-+#Asia/Tokyo Fri Sep 7 16:00:00 1951 UTC = Sat Sep 8 01:00:00 1951 JST isdst=0
gmtoff=32400
- America/St_Johns Sun Mar 11 03:30:59 2007 UTC = Sun Mar 11 00:00:59 2007 NST isdst=0
gmtoff=-12600
- America/St_Johns Sun Mar 11 03:31:00 2007 UTC = Sun Mar 11 01:01:00 2007 NDT isdst=1
gmtoff=-9000
- America/St_Johns Sun Nov 4 02:30:59 2007 UTC = Sun Nov 4 00:00:59 2007 NDT isdst=1
gmtoff=-9000
diff --git a/ruby-2.5.0-parse.y-assignable_error.patch
b/ruby-2.5.0-parse.y-assignable_error.patch
deleted file mode 100644
index ea7dad9..0000000
--- a/ruby-2.5.0-parse.y-assignable_error.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
-Date: Sun, 31 Dec 2017 11:25:38 +0000
-Subject: [PATCH] parse.y: assignable_error
-
-* parse.y (assignable_gen): should return valid NODE always even
- on errors. [ruby-core:84565] [Bug #14261]
-
-git-svn-id:
svn+ssh://ci.ruby-lang.org/ruby/trunk@61523
b2dd03c8-39d4-4d8f-98ff-823fe69b080e
----
- parse.c | 14 ++++----------
- test/ruby/test_parse.rb | 6 ++++++
- 2 files changed, 10 insertions(+), 10 deletions(-)
-
-diff --git a/parse.c b/parse.c
-index 08c3461f7096..c260a046dc33 100644
---- a/parse.c
-+++ b/parse.c
-@@ -6593,10 +6593,6 @@
- #line 1984 "parse.y" /* yacc.c:1646 */
- {
- (yyval.node) = assignable(var_field((yyvsp[0].id)), 0, &(yyloc));
-- /*%%%*/
-- if (!(yyval.node)) (yyval.node) = new_begin(0, &(yyloc));
-- /*%
-- %*/
- }
- #line 6598 "parse.c" /* yacc.c:1646 */
- break;
-@@ -6605,10 +6601,6 @@
- #line 1992 "parse.y" /* yacc.c:1646 */
- {
- (yyval.node) = assignable(var_field((yyvsp[0].id)), 0, &(yyloc));
-- /*%%%*/
-- if (!(yyval.node)) (yyval.node) = new_begin(0, &(yyloc));
-- /*%
-- %*/
- }
- #line 6610 "parse.c" /* yacc.c:1646 */
- break;
-@@ -16034,11 +16026,13 @@
- #ifdef RIPPER
- ID id = get_id(lhs);
- # define assignable_result(x) (lhs)
-+# define assignable_error() (lhs)
- # define parser_yyerror(parser, x) (lhs = assign_error_gen(parser, lhs))
- #else
- # define assignable_result(x) assignable_result0(x, location)
-+# define assignable_error() new_begin(0, location)
- #endif
-- if (!id) return assignable_result(0);
-+ if (!id) return assignable_error();
- switch (id) {
- case keyword_self:
- yyerror0("Can't change the value of self");
-@@ -16101,7 +16095,7 @@
- compile_error(PARSER_ARG "identifier %"PRIsVALUE" is not valid to
set", rb_id2str(id));
- }
- error:
-- return assignable_result(0);
-+ return assignable_error();
- #undef assignable_result
- #undef parser_yyerror
- }
-diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
-index e26bcdc07e19..15c6245bac2e 100644
---- a/test/ruby/test_parse.rb
-+++ b/test/ruby/test_parse.rb
-@@ -746,6 +746,12 @@ def foo
- end
- END
- end
-+ assert_raise(SyntaxError) do
-+ eval "#{<<~"begin;"}\n#{<<~'end;'}", nil,
__FILE__, __LINE__+1
-+ begin;
-+ x, true
-+ end;
-+ end
- end
-
- def test_block_dup
diff --git a/ruby-2.5.0-st.c-retry-operations-if-rebuilt.patch
b/ruby-2.5.0-st.c-retry-operations-if-rebuilt.patch
deleted file mode 100644
index 1e8e3b6..0000000
--- a/ruby-2.5.0-st.c-retry-operations-if-rebuilt.patch
+++ /dev/null
@@ -1,602 +0,0 @@
-From 4663c224fa6c925ce54af32fd1c1cbac9508f5ec Mon Sep 17 00:00:00 2001
-From: normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
-Date: Tue, 13 Feb 2018 10:02:07 +0000
-Subject: [PATCH] st.c: retry operations if rebuilt
-
-Calling the .eql? and .hash methods during a Hash operation can
-result in a thread switch or a signal handler to run: allowing
-one execution context to rebuild the hash table while another is
-still reading or writing the table. This results in a
-use-after-free bug affecting the thread_safe-0.3.6 test suite
-and likely other bugs.
-
-This bug did not affect users of commonly keys (String, Symbol,
-Fixnum) as those are optimized to avoid method dispatch
-for .eql? and .hash methods.
-
-A separate version of this change needs to be ported to Ruby 2.3.x
-which had a different implementation of st.c but was affected
-by the same bug.
-
-* st.c: Add comment about table rebuilding during comparison.
- (DO_PTR_EQUAL_CHECK): New macro.
- (REBUILT_TABLE_ENTRY_IND, REBUILT_TABLE_BIN_IND): New macros.
- (find_entry, find_table_entry_ind, find_table_bin_ind): Use new
- macros. Return the rebuild flag.
- (find_table_bin_ptr_and_reserve): Ditto.
- (st_lookup, st_get_key, st_insert, st_insert2): Retry the
- operation if the table was rebuilt.
- (st_general_delete, st_shift, st_update, st_general_foreach):
- Ditto.
- (st_rehash_linear, st_rehash_indexed): Use DO_PTR_EQUAL_CHECK.
- Return the rebuild flag.
- (st_rehash): Retry the operation if the table was rebuilt.
- [ruby-core:85510] [Ruby trunk Bug#14357]
-
-Thanks to Vit Ondruch for reporting the bug.
-
-From: Vladimir Makarov <vmakarov(a)redhat.com>
-
-git-svn-id:
svn+ssh://ci.ruby-lang.org/ruby/trunk@62396
b2dd03c8-39d4-4d8f-98ff-823fe69b080e
----
- st.c | 258 ++++++++++++++++++++++++++++++++++++++++++++++++-------------------
- 1 file changed, 185 insertions(+), 73 deletions(-)
-
-diff --git a/st.c b/st.c
-index 56ae30ce47..0c52e7a2ef 100644
---- a/st.c
-+++ b/st.c
-@@ -90,6 +90,11 @@
- o To save more memory we use 8-, 16-, 32- and 64- bit indexes in
- bins depending on the current hash table size.
-
-+ o The implementation takes into account that the table can be
-+ rebuilt during hashing or comparison functions. It can happen if
-+ the functions are implemented in Ruby and a thread switch occurs
-+ during their execution.
-+
- This implementation speeds up the Ruby hash table benchmarks in
- average by more 40% on Intel Haswell CPU.
-
-@@ -174,6 +179,15 @@ static const struct st_hash_type type_strcasehash = {
- #define PTR_EQUAL(tab, ptr, hash_val, key_) \
- ((ptr)->hash == (hash_val) && EQUAL((tab), (key_), (ptr)->key))
-
-+/* As PRT_EQUAL only its result is returned in RES. REBUILT_P is set
-+ up to TRUE if the table is rebuilt during the comparison. */
-+#define DO_PTR_EQUAL_CHECK(tab, ptr, hash_val, key, res, rebuilt_p) \
-+ do { \
-+ unsigned int _old_rebuilds_num = (tab)->rebuilds_num; \
-+ res = PTR_EQUAL(tab, ptr, hash_val, key); \
-+ rebuilt_p = _old_rebuilds_num != (tab)->rebuilds_num; \
-+ } while (FALSE)
-+
- /* Features of a table. */
- struct st_features {
- /* Power of 2 used for number of allocated entries. */
-@@ -380,6 +394,11 @@ set_bin(st_index_t *bins, int s, st_index_t n, st_index_t v)
- #define UNDEFINED_ENTRY_IND (~(st_index_t) 0)
- #define UNDEFINED_BIN_IND (~(st_index_t) 0)
-
-+/* Entry and bin values returned when we found a table rebuild during
-+ the search. */
-+#define REBUILT_TABLE_ENTRY_IND (~(st_index_t) 1)
-+#define REBUILT_TABLE_BIN_IND (~(st_index_t) 1)
-+
- /* Mark I-th bin of table TAB as corresponding to a deleted table
- entry. Update number of entries in the table and number of bins
- corresponding to deleted entries. */
-@@ -823,17 +842,22 @@ secondary_hash(st_index_t ind, st_table *tab, st_index_t *perterb)
-
- /* Find an entry with HASH_VALUE and KEY in TABLE using a linear
- search. Return the index of the found entry in array `entries`.
-- If it is not found, return UNDEFINED_ENTRY_IND. */
-+ If it is not found, return UNDEFINED_ENTRY_IND. If the table was
-+ rebuilt during the search, return REBUILT_TABLE_ENTRY_IND. */
- static inline st_index_t
- find_entry(st_table *tab, st_hash_t hash_value, st_data_t key)
- {
-+ int eq_p, rebuilt_p;
- st_index_t i, bound;
- st_table_entry *entries;
-
- bound = tab->entries_bound;
- entries = tab->entries;
- for (i = tab->entries_start; i < bound; i++) {
-- if (PTR_EQUAL(tab, &entries[i], hash_value, key))
-+ DO_PTR_EQUAL_CHECK(tab, &entries[i], hash_value, key, eq_p, rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return REBUILT_TABLE_ENTRY_IND;
-+ if (eq_p)
- return i;
- }
- return UNDEFINED_ENTRY_IND;
-@@ -845,10 +869,12 @@ find_entry(st_table *tab, st_hash_t hash_value, st_data_t key)
- /*#define QUADRATIC_PROBE*/
-
- /* Return index of entry with HASH_VALUE and KEY in table TAB. If
-- there is no such entry, return UNDEFINED_ENTRY_IND. */
-+ there is no such entry, return UNDEFINED_ENTRY_IND. If the table
-+ was rebuilt during the search, return REBUILT_TABLE_ENTRY_IND. */
- static st_index_t
- find_table_entry_ind(st_table *tab, st_hash_t hash_value, st_data_t key)
- {
-+ int eq_p, rebuilt_p;
- st_index_t ind;
- #ifdef QUADRATIC_PROBE
- st_index_t d;
-@@ -869,10 +895,13 @@ find_table_entry_ind(st_table *tab, st_hash_t hash_value, st_data_t
key)
- FOUND_BIN;
- for (;;) {
- bin = get_bin(tab->bins, get_size_ind(tab), ind);
-- if (! EMPTY_OR_DELETED_BIN_P(bin)
-- && PTR_EQUAL(tab, &entries[bin - ENTRY_BASE], hash_value, key))
-- break;
-- else if (EMPTY_BIN_P(bin))
-+ if (! EMPTY_OR_DELETED_BIN_P(bin)) {
-+ DO_PTR_EQUAL_CHECK(tab, &entries[bin - ENTRY_BASE], hash_value, key, eq_p,
rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return REBUILT_TABLE_ENTRY_IND;
-+ if (eq_p)
-+ break;
-+ } else if (EMPTY_BIN_P(bin))
- return UNDEFINED_ENTRY_IND;
- #ifdef QUADRATIC_PROBE
- ind = hash_bin(ind + d, tab);
-@@ -887,10 +916,12 @@ find_table_entry_ind(st_table *tab, st_hash_t hash_value, st_data_t
key)
-
- /* Find and return index of table TAB bin corresponding to an entry
- with HASH_VALUE and KEY. If there is no such bin, return
-- UNDEFINED_BIN_IND. */
-+ UNDEFINED_BIN_IND. If the table was rebuilt during the search,
-+ return REBUILT_TABLE_BIN_IND. */
- static st_index_t
- find_table_bin_ind(st_table *tab, st_hash_t hash_value, st_data_t key)
- {
-+ int eq_p, rebuilt_p;
- st_index_t ind;
- #ifdef QUADRATIC_PROBE
- st_index_t d;
-@@ -911,10 +942,13 @@ find_table_bin_ind(st_table *tab, st_hash_t hash_value, st_data_t
key)
- FOUND_BIN;
- for (;;) {
- bin = get_bin(tab->bins, get_size_ind(tab), ind);
-- if (! EMPTY_OR_DELETED_BIN_P(bin)
-- && PTR_EQUAL(tab, &entries[bin - ENTRY_BASE], hash_value, key))
-- break;
-- else if (EMPTY_BIN_P(bin))
-+ if (! EMPTY_OR_DELETED_BIN_P(bin)) {
-+ DO_PTR_EQUAL_CHECK(tab, &entries[bin - ENTRY_BASE], hash_value, key, eq_p,
rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return REBUILT_TABLE_BIN_IND;
-+ if (eq_p)
-+ break;
-+ } else if (EMPTY_BIN_P(bin))
- return UNDEFINED_BIN_IND;
- #ifdef QUADRATIC_PROBE
- ind = hash_bin(ind + d, tab);
-@@ -955,7 +989,7 @@ find_table_bin_ind_direct(st_table *tab, st_hash_t hash_value,
st_data_t key)
- bin = get_bin(tab->bins, get_size_ind(tab), ind);
- if (EMPTY_OR_DELETED_BIN_P(bin))
- return ind;
-- st_assert (! PTR_EQUAL(tab, &entries[bin - ENTRY_BASE], hash_value, key));
-+ st_assert (entries[bin - ENTRY_BASE].hash != hash_value);
- #ifdef QUADRATIC_PROBE
- ind = hash_bin(ind + d, tab);
- d++;
-@@ -973,11 +1007,13 @@ find_table_bin_ind_direct(st_table *tab, st_hash_t hash_value,
st_data_t key)
- bigger entries array. Although we can reuse a deleted bin, the
- result bin value is always empty if the table has no entry with
- KEY. Return the entries array index of the found entry or
-- UNDEFINED_ENTRY_IND if it is not found. */
-+ UNDEFINED_ENTRY_IND if it is not found. If the table was rebuilt
-+ during the search, return REBUILT_TABLE_ENTRY_IND. */
- static st_index_t
- find_table_bin_ptr_and_reserve(st_table *tab, st_hash_t *hash_value,
- st_data_t key, st_index_t *bin_ind)
- {
-+ int eq_p, rebuilt_p;
- st_index_t ind;
- st_hash_t curr_hash_value = *hash_value;
- #ifdef QUADRATIC_PROBE
-@@ -1015,7 +1051,10 @@ find_table_bin_ptr_and_reserve(st_table *tab, st_hash_t
*hash_value,
- break;
- }
- else if (! DELETED_BIN_P(entry_index)) {
-- if (PTR_EQUAL(tab, &entries[entry_index - ENTRY_BASE], curr_hash_value,
key))
-+ DO_PTR_EQUAL_CHECK(tab, &entries[entry_index - ENTRY_BASE], curr_hash_value,
key, eq_p, rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return REBUILT_TABLE_ENTRY_IND;
-+ if (eq_p)
- break;
- }
- else if (first_deleted_bin_ind == UNDEFINED_BIN_IND)
-@@ -1040,13 +1079,18 @@ st_lookup(st_table *tab, st_data_t key, st_data_t *value)
- st_index_t bin;
- st_hash_t hash = do_hash(key, tab);
-
-+ retry:
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- if (bin == UNDEFINED_ENTRY_IND)
- return 0;
- }
- else {
- bin = find_table_entry_ind(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- if (bin == UNDEFINED_ENTRY_IND)
- return 0;
- bin -= ENTRY_BASE;
-@@ -1064,13 +1108,18 @@ st_get_key(st_table *tab, st_data_t key, st_data_t *result)
- st_index_t bin;
- st_hash_t hash = do_hash(key, tab);
-
-+ retry:
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- if (bin == UNDEFINED_ENTRY_IND)
- return 0;
- }
- else {
- bin = find_table_entry_ind(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- if (bin == UNDEFINED_ENTRY_IND)
- return 0;
- bin -= ENTRY_BASE;
-@@ -1104,10 +1153,13 @@ st_insert(st_table *tab, st_data_t key, st_data_t value)
- st_index_t bin_ind;
- int new_p;
-
-- rebuild_table_if_necessary(tab);
- hash_value = do_hash(key, tab);
-+ retry:
-+ rebuild_table_if_necessary(tab);
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash_value, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- new_p = bin == UNDEFINED_ENTRY_IND;
- if (new_p)
- tab->num_entries++;
-@@ -1116,6 +1168,8 @@ st_insert(st_table *tab, st_data_t key, st_data_t value)
- else {
- bin = find_table_bin_ptr_and_reserve(tab, &hash_value,
- key, &bin_ind);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- new_p = bin == UNDEFINED_ENTRY_IND;
- bin -= ENTRY_BASE;
- }
-@@ -1192,10 +1246,13 @@ st_insert2(st_table *tab, st_data_t key, st_data_t value,
- st_index_t bin_ind;
- int new_p;
-
-- rebuild_table_if_necessary (tab);
- hash_value = do_hash(key, tab);
-+ retry:
-+ rebuild_table_if_necessary (tab);
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash_value, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- new_p = bin == UNDEFINED_ENTRY_IND;
- if (new_p)
- tab->num_entries++;
-@@ -1204,6 +1261,8 @@ st_insert2(st_table *tab, st_data_t key, st_data_t value,
- else {
- bin = find_table_bin_ptr_and_reserve(tab, &hash_value,
- key, &bin_ind);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- new_p = bin == UNDEFINED_ENTRY_IND;
- bin -= ENTRY_BASE;
- }
-@@ -1212,7 +1271,6 @@ st_insert2(st_table *tab, st_data_t key, st_data_t value,
- check = tab->rebuilds_num;
- key = (*func)(key);
- st_assert(check == tab->rebuilds_num);
-- st_assert(do_hash(key, tab) == hash_value);
- ind = tab->entries_bound++;
- entry = &tab->entries[ind];
- entry->hash = hash_value;
-@@ -1220,6 +1278,7 @@ st_insert2(st_table *tab, st_data_t key, st_data_t value,
- entry->record = value;
- if (bin_ind != UNDEFINED_BIN_IND)
- set_bin(tab->bins, get_size_ind(tab), bin_ind, ind + ENTRY_BASE);
-+ st_assert(do_hash(key, tab) == hash_value);
- #ifdef ST_DEBUG
- st_check(tab);
- #endif
-@@ -1281,8 +1340,11 @@ st_general_delete(st_table *tab, st_data_t *key, st_data_t
*value)
-
- st_assert(tab != NULL);
- hash = do_hash(*key, tab);
-+ retry:
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash, *key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- if (bin == UNDEFINED_ENTRY_IND) {
- if (value != 0) *value = 0;
- return 0;
-@@ -1290,6 +1352,8 @@ st_general_delete(st_table *tab, st_data_t *key, st_data_t *value)
- }
- else {
- bin_ind = find_table_bin_ind(tab, hash, *key);
-+ if (EXPECT(bin_ind == REBUILT_TABLE_BIN_IND, 0))
-+ goto retry;
- if (bin_ind == UNDEFINED_BIN_IND) {
- if (value != 0) *value = 0;
- return 0;
-@@ -1344,21 +1408,33 @@ st_shift(st_table *tab, st_data_t *key, st_data_t *value)
- for (i = tab->entries_start; i < bound; i++) {
- curr_entry_ptr = &entries[i];
- if (! DELETED_ENTRY_P(curr_entry_ptr)) {
-+ st_hash_t entry_hash = curr_entry_ptr->hash;
-+ st_data_t entry_key = curr_entry_ptr->key;
-+
- if (value != 0) *value = curr_entry_ptr->record;
-- *key = curr_entry_ptr->key;
-+ *key = entry_key;
-+ retry:
- if (tab->bins == NULL) {
-- bin = find_entry(tab, curr_entry_ptr->hash, curr_entry_ptr->key);
-+ bin = find_entry(tab, entry_hash, entry_key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0)) {
-+ entries = tab->entries;
-+ goto retry;
-+ }
- st_assert(bin != UNDEFINED_ENTRY_IND);
-- st_assert(&entries[bin] == curr_entry_ptr);
-+ curr_entry_ptr = &entries[bin];
- }
- else {
-- bin_ind = find_table_bin_ind(tab, curr_entry_ptr->hash,
-- curr_entry_ptr->key);
-+ bin_ind = find_table_bin_ind(tab, entry_hash, entry_key);
-+ if (EXPECT(bin_ind == REBUILT_TABLE_BIN_IND, 0)) {
-+ entries = tab->entries;
-+ goto retry;
-+ }
- st_assert(bin_ind != UNDEFINED_BIN_IND);
-- st_assert(&entries[get_bin(tab->bins, get_size_ind(tab), bin_ind)
-- - ENTRY_BASE] == curr_entry_ptr);
-+ curr_entry_ptr = &entries[get_bin(tab->bins, get_size_ind(tab), bin_ind)
-+ - ENTRY_BASE];
- MARK_BIN_DELETED(tab, bin_ind);
- }
-+ st_assert(entry_hash != curr_entry_ptr->hash && entry_key ==
curr_entry_ptr->key);
- MARK_ENTRY_DELETED(curr_entry_ptr);
- tab->num_entries--;
- update_range_for_deleted(tab, i);
-@@ -1402,15 +1478,20 @@ st_update(st_table *tab, st_data_t key,
- int retval, existing;
- st_hash_t hash = do_hash(key, tab);
-
-+ retry:
- entries = tab->entries;
- if (tab->bins == NULL) {
- bin = find_entry(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- existing = bin != UNDEFINED_ENTRY_IND;
- entry = &entries[bin];
- bin_ind = UNDEFINED_BIN_IND;
- }
- else {
- bin_ind = find_table_bin_ind(tab, hash, key);
-+ if (EXPECT(bin_ind == REBUILT_TABLE_BIN_IND, 0))
-+ goto retry;
- existing = bin_ind != UNDEFINED_BIN_IND;
- if (existing) {
- bin = get_bin(tab->bins, get_size_ind(tab), bin_ind) - ENTRY_BASE;
-@@ -1489,14 +1570,19 @@ st_general_foreach(st_table *tab, int (*func)(ANYARGS), st_data_t
arg,
- hash = curr_entry_ptr->hash;
- retval = (*func)(key, curr_entry_ptr->record, arg, 0);
- if (rebuilds_num != tab->rebuilds_num) {
-+ retry:
- entries = tab->entries;
- packed_p = tab->bins == NULL;
- if (packed_p) {
- i = find_entry(tab, hash, key);
-+ if (EXPECT(i == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- error_p = i == UNDEFINED_ENTRY_IND;
- }
- else {
- i = find_table_entry_ind(tab, hash, key);
-+ if (EXPECT(i == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto retry;
- error_p = i == UNDEFINED_ENTRY_IND;
- i -= ENTRY_BASE;
- }
-@@ -1512,36 +1598,44 @@ st_general_foreach(st_table *tab, int (*func)(ANYARGS), st_data_t
arg,
- }
- switch (retval) {
- case ST_CONTINUE:
-- break;
-+ break;
- case ST_CHECK:
-- if (check_p)
-- break;
-+ if (check_p)
-+ break;
- case ST_STOP:
- #ifdef ST_DEBUG
-- st_check(tab);
--#endif
-- return 0;
-- case ST_DELETE:
-- if (packed_p) {
-- bin = find_entry(tab, hash, curr_entry_ptr->key);
-- if (bin == UNDEFINED_ENTRY_IND)
-- break;
-- }
-- else {
-- bin_ind = find_table_bin_ind(tab, hash, curr_entry_ptr->key);
-- if (bin_ind == UNDEFINED_BIN_IND)
-- break;
-- bin = get_bin(tab->bins, get_size_ind(tab), bin_ind) - ENTRY_BASE;
-- MARK_BIN_DELETED(tab, bin_ind);
-- }
-- st_assert(&entries[bin] == curr_entry_ptr);
-- MARK_ENTRY_DELETED(curr_entry_ptr);
-- tab->num_entries--;
-- update_range_for_deleted(tab, bin);
-+ st_check(tab);
-+#endif
-+ return 0;
-+ case ST_DELETE: {
-+ st_data_t key = curr_entry_ptr->key;
-+
-+ again:
-+ if (packed_p) {
-+ bin = find_entry(tab, hash, key);
-+ if (EXPECT(bin == REBUILT_TABLE_ENTRY_IND, 0))
-+ goto again;
-+ if (bin == UNDEFINED_ENTRY_IND)
-+ break;
-+ }
-+ else {
-+ bin_ind = find_table_bin_ind(tab, hash, key);
-+ if (EXPECT(bin_ind == REBUILT_TABLE_BIN_IND, 0))
-+ goto again;
-+ if (bin_ind == UNDEFINED_BIN_IND)
-+ break;
-+ bin = get_bin(tab->bins, get_size_ind(tab), bin_ind) - ENTRY_BASE;
-+ MARK_BIN_DELETED(tab, bin_ind);
-+ }
-+ curr_entry_ptr = &entries[bin];
-+ MARK_ENTRY_DELETED(curr_entry_ptr);
-+ tab->num_entries--;
-+ update_range_for_deleted(tab, bin);
- #ifdef ST_DEBUG
-- st_check(tab);
-+ st_check(tab);
- #endif
-- break;
-+ break;
-+ }
- }
- }
- #ifdef ST_DEBUG
-@@ -2015,10 +2109,12 @@ st_expand_table(st_table *tab, st_index_t siz)
- free(tmp);
- }
-
--/* Rehash using linear search. */
--static void
-+/* Rehash using linear search. Return TRUE if we found that the table
-+ was rebuilt. */
-+static int
- st_rehash_linear(st_table *tab)
- {
-+ int eq_p, rebuilt_p;
- st_index_t i, j;
- st_table_entry *p, *q;
- if (tab->bins) {
-@@ -2033,7 +2129,10 @@ st_rehash_linear(st_table *tab)
- q = &tab->entries[j];
- if (DELETED_ENTRY_P(q))
- continue;
-- if (PTR_EQUAL(tab, p, q->hash, q->key)) {
-+ DO_PTR_EQUAL_CHECK(tab, p, q->hash, q->key, eq_p, rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return TRUE;
-+ if (eq_p) {
- st_assert(p < q);
- *p = *q;
- MARK_ENTRY_DELETED(q);
-@@ -2042,12 +2141,15 @@ st_rehash_linear(st_table *tab)
- }
- }
- }
-+ return FALSE;
- }
-
--/* Rehash using index */
--static void
-+/* Rehash using index. Return TRUE if we found that the table was
-+ rebuilt. */
-+static int
- st_rehash_indexed(st_table *tab)
- {
-+ int eq_p, rebuilt_p;
- st_index_t i;
- st_index_t const n = bins_size(tab);
- unsigned int const size_ind = get_size_ind(tab);
-@@ -2076,26 +2178,32 @@ st_rehash_indexed(st_table *tab)
- set_bin(bins, size_ind, ind, i + ENTRY_BASE);
- break;
- }
-- else if (PTR_EQUAL(tab, q, p->hash, p->key)) {
-- /* duplicated key; delete it */
-- st_assert(q < p);
-- q->record = p->record;
-- MARK_ENTRY_DELETED(p);
-- tab->num_entries--;
-- update_range_for_deleted(tab, bin);
-- break;
-- }
- else {
-- /* hash collision; skip it */
-+ DO_PTR_EQUAL_CHECK(tab, q, p->hash, p->key, eq_p, rebuilt_p);
-+ if (EXPECT(rebuilt_p, 0))
-+ return TRUE;
-+ if (eq_p) {
-+ /* duplicated key; delete it */
-+ st_assert(q < p);
-+ q->record = p->record;
-+ MARK_ENTRY_DELETED(p);
-+ tab->num_entries--;
-+ update_range_for_deleted(tab, bin);
-+ break;
-+ }
-+ else {
-+ /* hash collision; skip it */
- #ifdef QUADRATIC_PROBE
-- ind = hash_bin(ind + d, tab);
-- d++;
-+ ind = hash_bin(ind + d, tab);
-+ d++;
- #else
-- ind = secondary_hash(ind, tab, &peterb);
-+ ind = secondary_hash(ind, tab, &peterb);
- #endif
-- }
-+ }
-+ }
- }
- }
-+ return FALSE;
- }
-
- /* Reconstruct TAB's bins according to TAB's entries. This function
-@@ -2104,10 +2212,14 @@ st_rehash_indexed(st_table *tab)
- static void
- st_rehash(st_table *tab)
- {
-- if (tab->bin_power <= MAX_POWER2_FOR_TABLES_WITHOUT_BINS)
-- st_rehash_linear(tab);
-- else
-- st_rehash_indexed(tab);
-+ int rebuilt_p;
-+
-+ do {
-+ if (tab->bin_power <= MAX_POWER2_FOR_TABLES_WITHOUT_BINS)
-+ rebuilt_p = st_rehash_linear(tab);
-+ else
-+ rebuilt_p = st_rehash_indexed(tab);
-+ } while (rebuilt_p);
- }
-
- #ifdef RUBY
---
-2.16.1
-
diff --git a/ruby-2.5.1-TestTimeTZ-test-failures-Kiritimati-and-Lisbon.patch
b/ruby-2.5.1-TestTimeTZ-test-failures-Kiritimati-and-Lisbon.patch
new file mode 100644
index 0000000..fa5ad3e
--- /dev/null
+++ b/ruby-2.5.1-TestTimeTZ-test-failures-Kiritimati-and-Lisbon.patch
@@ -0,0 +1,115 @@
+From 584b5929f9b769c4d0b03e322a9fddf2b2dd3454 Mon Sep 17 00:00:00 2001
+From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
+Date: Sun, 1 Apr 2018 13:02:11 +0000
+Subject: [PATCH] test_time_tz.rb: Kiritimati tzdata fix
+
+* test/ruby/test_time_tz.rb (gen_zdump_test): fix the expected
+ data at the Kiritimati's skip of New Year's Eve 1994.
+ [Bug #14655]
+
+git-svn-id:
svn+ssh://ci.ruby-lang.org/ruby/trunk@63055
b2dd03c8-39d4-4d8f-98ff-823fe69b080e
+---
+ test/ruby/test_time_tz.rb | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
+index dfe139033ed3..ac5f81892878 100644
+--- a/test/ruby/test_time_tz.rb
++++ b/test/ruby/test_time_tz.rb
+@@ -364,9 +364,18 @@ def self.gen_zdump_test(data)
+ Europe/London Sun Aug 10 01:00:00 1947 UTC = Sun Aug 10 02:00:00 1947 BST isdst=1
gmtoff=3600
+ Europe/London Sun Nov 2 01:59:59 1947 UTC = Sun Nov 2 02:59:59 1947 BST isdst=1
gmtoff=3600
+ Europe/London Sun Nov 2 02:00:00 1947 UTC = Sun Nov 2 02:00:00 1947 GMT isdst=0
gmtoff=0
++End
++ if CORRECT_KIRITIMATI_SKIP_1994
++ gen_zdump_test <<'End'
++Pacific/Kiritimati Sat Dec 31 09:59:59 1994 UTC = Fri Dec 30 23:59:59 1994 LINT isdst=0
gmtoff=-36000
++Pacific/Kiritimati Sat Dec 31 10:00:00 1994 UTC = Sun Jan 1 00:00:00 1995 LINT isdst=0
gmtoff=50400
++End
++ else
++ gen_zdump_test <<'End'
+ Pacific/Kiritimati Sun Jan 1 09:59:59 1995 UTC = Sat Dec 31 23:59:59 1994 LINT isdst=0
gmtoff=-36000
+ Pacific/Kiritimati Sun Jan 1 10:00:00 1995 UTC = Mon Jan 2 00:00:00 1995 LINT isdst=0
gmtoff=50400
+ End
++ end
+ gen_zdump_test <<'End' if has_right_tz
+ right/America/Los_Angeles Fri Jun 30 23:59:60 1972 UTC = Fri Jun 30 16:59:60 1972 PDT
isdst=1 gmtoff=-25200
+ right/America/Los_Angeles Wed Dec 31 23:59:60 2008 UTC = Wed Dec 31 15:59:60 2008 PST
isdst=0 gmtoff=-28800
+--
+
+From 2965c2d4df78e6f5acf8759f84c88ce14a4e70f1 Mon Sep 17 00:00:00 2001
+From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
+Date: Sun, 1 Apr 2018 02:00:36 +0000
+Subject: [PATCH] test_time_tz.rb: Kiritimati tzdata fix
+
+* test/ruby/test_time_tz.rb (TestTimeTZ#test_pacific_kiritimati):
+ fix the expected data at the skip of New Year's Eve 1994.
+ [Bug #14655]
+
+git-svn-id:
svn+ssh://ci.ruby-lang.org/ruby/trunk@63054
b2dd03c8-39d4-4d8f-98ff-823fe69b080e
+---
+ test/ruby/test_time_tz.rb | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
+index 39b830d28a3d..dfe139033ed3 100644
+--- a/test/ruby/test_time_tz.rb
++++ b/test/ruby/test_time_tz.rb
+@@ -89,6 +89,9 @@ def group_by(e, &block)
+ Time.local(1951, 5, 6, 1, 0, 0).dst? # DST with fixed tzdata
+ end
+ }
++ CORRECT_KIRITIMATI_SKIP_1994 = with_tz("Pacific/Kiritimati") {
++ Time.local(1994, 12, 31, 0, 0, 0).year == 1995
++ }
+
+ def time_to_s(t)
+ t.to_s
+@@ -178,9 +181,17 @@ def test_europe_lisbon
+
+ def test_pacific_kiritimati
+ with_tz(tz="Pacific/Kiritimati") {
+- assert_time_constructor(tz, "1994-12-31 23:59:59 -1000", :local,
[1994,12,31,23,59,59])
+- assert_time_constructor(tz, "1995-01-02 00:00:00 +1400", :local,
[1995,1,1,0,0,0])
+- assert_time_constructor(tz, "1995-01-02 23:59:59 +1400", :local,
[1995,1,1,23,59,59])
++ assert_time_constructor(tz, "1994-12-30 00:00:00 -1000", :local,
[1994,12,30,0,0,0])
++ assert_time_constructor(tz, "1994-12-30 23:59:59 -1000", :local,
[1994,12,30,23,59,59])
++ if CORRECT_KIRITIMATI_SKIP_1994
++ assert_time_constructor(tz, "1995-01-01 00:00:00 +1400", :local,
[1994,12,31,0,0,0])
++ assert_time_constructor(tz, "1995-01-01 23:59:59 +1400", :local,
[1994,12,31,23,59,59])
++ assert_time_constructor(tz, "1995-01-01 00:00:00 +1400", :local,
[1995,1,1,0,0,0])
++ else
++ assert_time_constructor(tz, "1994-12-31 23:59:59 -1000", :local,
[1994,12,31,23,59,59])
++ assert_time_constructor(tz, "1995-01-02 00:00:00 +1400", :local,
[1995,1,1,0,0,0])
++ assert_time_constructor(tz, "1995-01-02 23:59:59 +1400", :local,
[1995,1,1,23,59,59])
++ end
+ assert_time_constructor(tz, "1995-01-02 00:00:00 +1400", :local,
[1995,1,2,0,0,0])
+ }
+ end
+--
+
+From a0e6607a8172f9eaf9a15f03065736deb2035771 Mon Sep 17 00:00:00 2001
+From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
+Date: Sun, 1 Apr 2018 13:16:14 +0000
+Subject: [PATCH] test_time_tz.rb: Lisbon tzdata fix
+
+* test/ruby/test_time_tz.rb (gen_variational_zdump_test): Update
+ Lisbon zdump data, which fixed the 1912-01-01 transition for
+ Portugual and its colonies. [Bug #14655]
+
+git-svn-id:
svn+ssh://ci.ruby-lang.org/ruby/trunk@63056
b2dd03c8-39d4-4d8f-98ff-823fe69b080e
+---
+ test/ruby/test_time_tz.rb | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
+index ac5f81892878..b32caff9c539 100644
+--- a/test/ruby/test_time_tz.rb
++++ b/test/ruby/test_time_tz.rb
+@@ -434,5 +434,6 @@ def self.gen_variational_zdump_test(hint, data)
+ gen_variational_zdump_test "lisbon", <<'End' if has_lisbon_tz
+ Europe/Lisbon Mon Jan 1 00:36:31 1912 UTC = Sun Dec 31 23:59:59 1911 LMT isdst=0
gmtoff=-2192
+ Europe/Lisbon Mon Jan 1 00:36:44 1912 UT = Sun Dec 31 23:59:59 1911 LMT isdst=0
gmtoff=-2205
++Europe/Lisbon Sun Dec 31 23:59:59 1911 UT = Sun Dec 31 23:23:14 1911 LMT isdst=0
gmtoff=-2205
+ End
+ end
diff --git a/ruby-2.6.0-library-options-to-MAINLIBS.patch
b/ruby-2.6.0-library-options-to-MAINLIBS.patch
index 7cc644f..199798d 100644
--- a/ruby-2.6.0-library-options-to-MAINLIBS.patch
+++ b/ruby-2.6.0-library-options-to-MAINLIBS.patch
@@ -27,7 +27,7 @@ index aebbae1969a5..733a0c992fd7 100644
AC_DEFUN([RUBY_RM_RECURSIVE], [
m4_version_prereq([2.70], [-1], [
-@@ -2937,13 +2938,11 @@ AS_IF([test x"$enable_pthread" = xyes], [
+@@ -2938,13 +2939,11 @@ AS_IF([test x"$enable_pthread" = xyes], [
AC_DEFINE(_THREAD_SAFE)
AC_DEFINE(HAVE_LIBPTHREAD)
AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>])
@@ -46,7 +46,7 @@ index aebbae1969a5..733a0c992fd7 100644
], [
AC_MSG_WARN("Don't know how to find pthread library on your system -- thread
support disabled")
])
-@@ -3622,7 +3621,7 @@ LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
+@@ -3623,7 +3622,7 @@ LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
LIBRUBY='$(LIBRUBY_A)'
LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
LIBRUBYARG='$(LIBRUBYARG_STATIC)'
@@ -55,7 +55,7 @@ index aebbae1969a5..733a0c992fd7 100644
AS_CASE(["$target_os"],
[cygwin*|mingw*|haiku*|darwin*], [
-@@ -3688,9 +3687,6 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3689,9 +3688,6 @@ AS_CASE("$enable_shared", [yes], [
LIBRUBY_RELATIVE=no
test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
ENABLE_SHARED=yes
@@ -65,7 +65,7 @@ index aebbae1969a5..733a0c992fd7 100644
# libdir can be overridden in config.site file (on OpenSUSE at least).
libdir_basename=lib
-@@ -3725,7 +3721,6 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3726,7 +3722,6 @@ AS_CASE("$enable_shared", [yes], [
])
],
[freebsd*|dragonfly*], [
@@ -73,7 +73,7 @@ index aebbae1969a5..733a0c992fd7 100644
LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
LIBRUBY_SONAME='$(LIBRUBY_SO)'
AS_IF([test "$rb_cv_binary_elf" != "yes" ], [
-@@ -3734,7 +3729,6 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3735,7 +3730,6 @@ AS_CASE("$enable_shared", [yes], [
])
],
[netbsd*], [
@@ -81,7 +81,7 @@ index aebbae1969a5..733a0c992fd7 100644
LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)'
RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)'
"$LDFLAGS_OPTDIR"])
-@@ -3745,11 +3739,9 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3746,11 +3740,9 @@ AS_CASE("$enable_shared", [yes], [
])
],
[openbsd*|mirbsd*], [
@@ -93,7 +93,7 @@ index aebbae1969a5..733a0c992fd7 100644
LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)'
LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
-@@ -3767,7 +3759,7 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3768,7 +3760,7 @@ AS_CASE("$enable_shared", [yes], [
[aix*], [
RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry"
"$XLDFLAGS" "$LDFLAGS_OPTDIR"])
LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
@@ -102,7 +102,7 @@ index aebbae1969a5..733a0c992fd7 100644
],
[darwin*], [
LIBRUBY_LDSHARED='$(CC) -dynamiclib'
-@@ -3787,7 +3779,6 @@ AS_CASE("$enable_shared", [yes], [
+@@ -3788,7 +3780,6 @@ AS_CASE("$enable_shared", [yes], [
LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)'
LIBRUBY_SONAME='lib$(RUBY_BASE_NAME).$(RUBY_API_VERSION).$(SOEXT)'
LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_INSTALL_NAME).$(SOEXT)'
@@ -110,7 +110,7 @@ index aebbae1969a5..733a0c992fd7 100644
],
[interix*], [
LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
-@@ -4030,7 +4021,6 @@ AS_CASE(["$target_os"],
+@@ -4031,7 +4022,6 @@ AS_CASE(["$target_os"],
])
LIBRUBY_ALIASES=''
FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
@@ -118,7 +118,7 @@ index aebbae1969a5..733a0c992fd7 100644
AS_IF([test x"$enable_shared" = xyes], [
LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
], [
-@@ -4130,6 +4120,13 @@ AS_IF([test "${universal_binary-no}" = yes ], [
+@@ -4131,6 +4121,13 @@ AS_IF([test "${universal_binary-no}" = yes ], [
[rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
])
diff --git a/ruby.spec b/ruby.spec
index 67eb27c..c86034c 100644
--- a/ruby.spec
+++ b/ruby.spec
@@ -1,6 +1,6 @@
%global major_version 2
%global minor_version 5
-%global teeny_version 0
+%global teeny_version 1
%global major_minor_version %{major_version}.%{minor_version}
%global ruby_version %{major_minor_version}.%{teeny_version}
@@ -21,7 +21,7 @@
%endif
-%global release 91
+%global release 92
%{!?release_string:%global release_string
%{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
# The RubyGems library has to stay out of Ruby directory three, since the
@@ -136,19 +136,9 @@ Patch9: ruby-2.3.1-Rely-on-ldd-to-detect-glibc.patch
# Add Gem.operating_system_defaults to allow packagers to override defaults.
#
https://github.com/rubygems/rubygems/pull/2116
Patch10: ruby-2.5.0-Add-Gem.operating_system_defaults.patch
-# Fix segfault during generating documentation.
-#
https://bugs.ruby-lang.org/issues/14343
-Patch11: ruby-2.5.0-parse.y-assignable_error.patch
-# Recent tzdata change breaks Ruby test suite.
-#
https://bugs.ruby-lang.org/issues/14438
-Patch12: ruby-2.5.0-Disable-Tokyo-TZ-tests.patch
-# Fix thread_safe tests suite segfaults.
-#
https://bugs.ruby-lang.org/issues/14357
-Patch13: ruby-2.5.0-st.c-retry-operations-if-rebuilt.patch
-# Fix: Multiple vulnerabilities in RubyGems
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1547431
-#
https://www.ruby-lang.org/en/news/2018/02/17/multiple-vulnerabilities-in-...
-Patch14: rubygems-2.5.0-multiple-vulnerabilities.patch
+# TestTimeTZ test failures Kiritimati and Lisbon
+#
https://bugs.ruby-lang.org/issues/14655
+Patch11: ruby-2.5.1-TestTimeTZ-test-failures-Kiritimati-and-Lisbon.patch
# Don't force libraries used to build Ruby to its dependencies.
#
https://bugs.ruby-lang.org/issues/14422
Patch15: ruby-2.6.0-library-options-to-MAINLIBS.patch
@@ -537,9 +527,6 @@ rm -rf ext/fiddle/libffi*
%patch9 -p1
%patch10 -p1
%patch11 -p1
-%patch12 -p1
-%patch13 -p1
-%patch14 -p0
%patch15 -p1
# Provide an example of usage of the tapset:
@@ -756,10 +743,6 @@ make runruby TESTRUN_SCRIPT="--enable-gems %{SOURCE13}"
DISABLE_TESTS=""
-#
https://bugs.ruby-lang.org/issues/11480
-# Once seen:
http://koji.fedoraproject.org/koji/taskinfo?taskID=12556650
-DISABLE_TESTS="$DISABLE_TESTS -x test_fork.rb"
-
# SIGSEV handler does not provide correct output on AArch64.
#
https://bugs.ruby-lang.org/issues/13758
%ifarch aarch64
@@ -1090,6 +1073,9 @@ make check TESTS="-v $DISABLE_TESTS"
%{gem_dir}/specifications/xmlrpc-%{xmlrpc_version}.gemspec
%changelog
+* Thu Mar 29 2018 Pavel Valena <pvalena(a)redhat.com> - 2.5.1-92
+- Update to Ruby 2.5.1.
+
* Mon Mar 05 2018 Vít Ondruch <vondruch(a)redhat.com> - 2.5.0-91
- Don't force libraries used to build Ruby to its dependencies.
- Re-enable GMP dependency.
diff --git a/rubygems-2.5.0-multiple-vulnerabilities.patch
b/rubygems-2.5.0-multiple-vulnerabilities.patch
deleted file mode 100644
index e32926a..0000000
--- a/rubygems-2.5.0-multiple-vulnerabilities.patch
+++ /dev/null
@@ -1,2349 +0,0 @@
-diff --git lib/rubygems.rb lib/rubygems.rb
-index 0475ced164..2762bfcb88 100644
---- lib/rubygems.rb
-+++ lib/rubygems.rb
-@@ -10,7 +10,7 @@
- require 'thread'
-
- module Gem
-- VERSION = "2.7.3"
-+ VERSION = "2.7.6"
- end
-
- # Must be first since it unloads the prelude from 1.9.2
-@@ -161,7 +161,7 @@ module Gem
- # these are defined in Ruby 1.8.7, hence the need for this convoluted setup.
-
- READ_BINARY_ERRORS = begin
-- read_binary_errors = [Errno::EACCES, Errno::EROFS]
-+ read_binary_errors = [Errno::EACCES, Errno::EROFS, Errno::ENOSYS]
- read_binary_errors << Errno::ENOTSUP if Errno.const_defined?(:ENOTSUP)
- read_binary_errors
- end.freeze
-@@ -171,7 +171,7 @@ module Gem
- # these are defined in Ruby 1.8.7.
-
- WRITE_BINARY_ERRORS = begin
-- write_binary_errors = []
-+ write_binary_errors = [Errno::ENOSYS]
- write_binary_errors << Errno::ENOTSUP if Errno.const_defined?(:ENOTSUP)
- write_binary_errors
- end.freeze
-@@ -871,19 +871,19 @@ def self.refresh
- # Safely read a file in binary mode on all platforms.
-
- def self.read_binary(path)
-- open path, 'rb+' do |f|
-+ File.open path, 'rb+' do |f|
- f.flock(File::LOCK_EX)
- f.read
- end
- rescue *READ_BINARY_ERRORS
-- open path, 'rb' do |f|
-+ File.open path, 'rb' do |f|
- f.read
- end
- rescue Errno::ENOLCK # NFS
- if Thread.main != Thread.current
- raise
- else
-- open path, 'rb' do |f|
-+ File.open path, 'rb' do |f|
- f.read
- end
- end
-diff --git lib/rubygems/commands/generate_index_command.rb
lib/rubygems/commands/generate_index_command.rb
-index 01f1f88405..0b677b73a9 100644
---- lib/rubygems/commands/generate_index_command.rb
-+++ lib/rubygems/commands/generate_index_command.rb
-@@ -68,7 +68,7 @@ def execute
-
- if not File.exist?(options[:directory]) or
- not File.directory?(options[:directory]) then
-- alert_error "unknown directory name #{directory}."
-+ alert_error "unknown directory name #{options[:directory]}."
- terminate_interaction 1
- else
- indexer = Gem::Indexer.new options.delete(:directory), options
-diff --git lib/rubygems/commands/owner_command.rb lib/rubygems/commands/owner_command.rb
-index 8e2271657a..637b5bdc4d 100644
---- lib/rubygems/commands/owner_command.rb
-+++ lib/rubygems/commands/owner_command.rb
-@@ -64,7 +64,7 @@ def show_owners name
- end
-
- with_response response do |resp|
-- owners = YAML.load resp.body
-+ owners = Gem::SafeYAML.load resp.body
-
- say "Owners for gem: #{name}"
- owners.each do |owner|
-diff --git lib/rubygems/commands/setup_command.rb lib/rubygems/commands/setup_command.rb
-index 5d1414d102..6966cde01a 100644
---- lib/rubygems/commands/setup_command.rb
-+++ lib/rubygems/commands/setup_command.rb
-@@ -350,7 +350,9 @@ def fake_spec.full_gem_path
- def install_default_bundler_gem
- return unless Gem::USE_BUNDLER_FOR_GEMDEPS
-
-- mkdir_p Gem::Specification.default_specifications_dir
-+ specs_dir = Gem::Specification.default_specifications_dir
-+ File.join(options[:destdir], specs_dir) unless Gem.win_platform?
-+ mkdir_p specs_dir
-
- # Workaround for non-git environment.
- gemspec = File.open('bundler/bundler.gemspec', 'rb'){|f|
f.read.gsub(/`git ls-files -z`/, "''") }
-@@ -359,23 +361,36 @@ def install_default_bundler_gem
- bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
- bundler_spec.files = Dir.chdir("bundler") {
Dir["{*.md,{lib,exe,man}/**/*}"] }
- bundler_spec.executables -= %w[bundler bundle_ruby]
-- Dir.entries(Gem::Specification.default_specifications_dir).
-+
-+ # Remove bundler-*.gemspec in default specification directory.
-+ Dir.entries(specs_dir).
- select {|gs| gs.start_with?("bundler-") }.
-- each {|gs| File.delete(File.join(Gem::Specification.default_specifications_dir,
gs)) }
-+ each {|gs| File.delete(File.join(specs_dir, gs)) }
-
-- default_spec_path = File.join(Gem::Specification.default_specifications_dir,
"#{bundler_spec.full_name}.gemspec")
-+ default_spec_path = File.join(specs_dir,
"#{bundler_spec.full_name}.gemspec")
- Gem.write_binary(default_spec_path, bundler_spec.to_ruby)
-
- bundler_spec = Gem::Specification.load(default_spec_path)
-
-+ # Remove gemspec that was same version of vendored bundler.
-+ normal_gemspec = File.join(Gem.default_dir, "specifications",
"bundler-#{bundler_spec.version}.gemspec")
-+ if File.file? normal_gemspec
-+ File.delete normal_gemspec
-+ end
-+
-+ # Remove gem files that were same version of vendored bundler.
- if File.directory? bundler_spec.gems_dir
- Dir.entries(bundler_spec.gems_dir).
-- select {|default_gem|
File.basename(default_gem).match(/^bundler-#{Gem::Version::VERSION_PATTERN}$/) }.
-+ select {|default_gem| File.basename(default_gem) ==
"bundler-#{bundler_spec.version}" }.
- each {|default_gem| rm_r File.join(bundler_spec.gems_dir, default_gem) }
- end
-
-- mkdir_p bundler_spec.bin_dir
-- bundler_spec.executables.each {|e| cp File.join("bundler",
bundler_spec.bindir, e), File.join(bundler_spec.bin_dir, e) }
-+ bundler_bin_dir = File.join(Gem.default_dir, 'gems', bundler_spec.full_name,
bundler_spec.bindir)
-+ File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform?
-+ mkdir_p bundler_bin_dir
-+ bundler_spec.executables.each do |e|
-+ cp File.join("bundler", bundler_spec.bindir, e),
File.join(bundler_bin_dir, e)
-+ end
-
- if Gem.win_platform?
- require 'rubygems/installer'
-diff --git lib/rubygems/commands/unpack_command.rb
lib/rubygems/commands/unpack_command.rb
-index eb7f550673..b873f20d28 100644
---- lib/rubygems/commands/unpack_command.rb
-+++ lib/rubygems/commands/unpack_command.rb
-@@ -94,7 +94,7 @@ def execute
-
- spec_file = File.basename spec.spec_file
-
-- open spec_file, 'w' do |io|
-+ File.open spec_file, 'w' do |io|
- io.write metadata
- end
- else
-@@ -176,7 +176,7 @@ def get_metadata path, security_policy = nil
-
- metadata = nil
-
-- open path, Gem.binary_mode do |io|
-+ File.open path, Gem.binary_mode do |io|
- tar = Gem::Package::TarReader.new io
- tar.each_entry do |entry|
- case entry.full_name
-diff --git lib/rubygems/config_file.rb lib/rubygems/config_file.rb
-index a4efed0f5a..c0d19dbfc2 100644
---- lib/rubygems/config_file.rb
-+++ lib/rubygems/config_file.rb
-@@ -458,7 +458,7 @@ def to_yaml # :nodoc:
-
- # Writes out this config file, replacing its source.
- def write
-- open config_file_name, 'w' do |io|
-+ File.open config_file_name, 'w' do |io|
- io.write to_yaml
- end
- end
-diff --git lib/rubygems/ext/builder.rb lib/rubygems/ext/builder.rb
-index a1619c97d7..eb9db199d5 100644
---- lib/rubygems/ext/builder.rb
-+++ lib/rubygems/ext/builder.rb
-@@ -212,7 +212,7 @@ def write_gem_make_out output # :nodoc:
-
- FileUtils.mkdir_p @spec.extension_dir
-
-- open destination, 'wb' do |io| io.puts output end
-+ File.open destination, 'wb' do |io| io.puts output end
-
- destination
- end
-diff --git lib/rubygems/indexer.rb lib/rubygems/indexer.rb
-index 871cc09d8d..3ea994414b 100644
---- lib/rubygems/indexer.rb
-+++ lib/rubygems/indexer.rb
-@@ -2,6 +2,7 @@
- require 'rubygems'
- require 'rubygems/package'
- require 'time'
-+require 'tmpdir'
-
- begin
- gem 'builder'
-@@ -64,7 +65,7 @@ def initialize(directory, options = {})
- @build_modern = options[:build_modern]
-
- @dest_directory = directory
-- @directory = File.join(Dir.tmpdir, "gem_generate_index_#{$$}")
-+ @directory = Dir.mktmpdir 'gem_generate_index'
-
- marshal_name = "Marshal.#{Gem.marshal_version}"
-
-@@ -123,7 +124,7 @@ def build_marshal_gemspecs specs
- marshal_name = File.join @quick_marshal_dir, spec_file_name
-
- marshal_zipped = Gem.deflate Marshal.dump(spec)
-- open marshal_name, 'wb' do |io| io.write marshal_zipped end
-+ File.open marshal_name, 'wb' do |io| io.write marshal_zipped end
-
- files << marshal_name
-
-@@ -261,7 +262,7 @@ def compress(filename, extension)
-
- zipped = Gem.deflate data
-
-- open "#{filename}.#{extension}", 'wb' do |io|
-+ File.open "#{filename}.#{extension}", 'wb' do |io|
- io.write zipped
- end
- end
-@@ -427,7 +428,7 @@ def update_specs_index(index, source, dest)
-
- specs_index = compact_specs specs_index.uniq.sort
-
-- open dest, 'wb' do |io|
-+ File.open dest, 'wb' do |io|
- Marshal.dump specs_index, io
- end
- end
-diff --git lib/rubygems/installer.rb lib/rubygems/installer.rb
-index 0cbca0791b..ee5fedeb64 100644
---- lib/rubygems/installer.rb
-+++ lib/rubygems/installer.rb
-@@ -206,7 +206,7 @@ def check_executable_overwrite filename # :nodoc:
- ruby_executable = false
- existing = nil
-
-- open generated_bin, 'rb' do |io|
-+ File.open generated_bin, 'rb' do |io|
- next unless io.gets =~ /^#!/ # shebang
- io.gets # blankline
-
-@@ -427,7 +427,7 @@ def default_spec_file
- # specifications directory.
-
- def write_spec
-- open spec_file, 'w' do |file|
-+ File.open spec_file, 'w' do |file|
- spec.installed_by_version = Gem.rubygems_version
-
- file.puts spec.to_ruby_for_cache
-@@ -464,7 +464,12 @@ def generate_windows_script(filename, bindir)
- def generate_bin # :nodoc:
- return if spec.executables.nil? or spec.executables.empty?
-
-- Dir.mkdir @bin_dir unless File.exist? @bin_dir
-+ begin
-+ Dir.mkdir @bin_dir
-+ rescue SystemCallError
-+ raise unless File.directory? @bin_dir
-+ end
-+
- raise Gem::FilePermissionError.new(@bin_dir) unless File.writable? @bin_dir
-
- spec.executables.each do |filename|
-@@ -863,7 +868,7 @@ def write_build_info_file
-
- build_info_file = File.join build_info_dir, "#{spec.full_name}.info"
-
-- open build_info_file, 'w' do |io|
-+ File.open build_info_file, 'w' do |io|
- @build_args.each do |arg|
- io.puts arg
- end
-diff --git lib/rubygems/package.rb lib/rubygems/package.rb
-index 77811ed5ec..b924122827 100644
---- lib/rubygems/package.rb
-+++ lib/rubygems/package.rb
-@@ -219,7 +219,7 @@ def add_files tar # :nodoc:
- next unless stat.file?
-
- tar.add_file_simple file, stat.mode, stat.size do |dst_io|
-- open file, 'rb' do |src_io|
-+ File.open file, 'rb' do |src_io|
- dst_io.write src_io.read 16384 until src_io.eof?
- end
- end
-@@ -378,9 +378,9 @@ def extract_tar_gz io, destination_dir, pattern = "*" #
:nodoc:
- File.dirname destination
- end
-
-- FileUtils.mkdir_p mkdir, mkdir_options
-+ mkdir_p_safe mkdir, mkdir_options, destination_dir, entry.full_name
-
-- open destination, 'wb' do |out|
-+ File.open destination, 'wb' do |out|
- out.write entry.read
- FileUtils.chmod entry.header.mode, destination
- end if entry.file?
-@@ -416,20 +416,35 @@ def install_location filename, destination_dir # :nodoc:
- raise Gem::Package::PathError.new(filename, destination_dir) if
- filename.start_with? '/'
-
-- destination_dir = File.realpath destination_dir if
-- File.respond_to? :realpath
-+ destination_dir = realpath destination_dir
- destination_dir = File.expand_path destination_dir
-
- destination = File.join destination_dir, filename
- destination = File.expand_path destination
-
- raise Gem::Package::PathError.new(destination, destination_dir) unless
-- destination.start_with? destination_dir
-+ destination.start_with? destination_dir + '/'
-
- destination.untaint
- destination
- end
-
-+ def mkdir_p_safe mkdir, mkdir_options, destination_dir, file_name
-+ destination_dir = realpath File.expand_path(destination_dir)
-+ parts = mkdir.split(File::SEPARATOR)
-+ parts.reduce do |path, basename|
-+ path = realpath path unless path == ""
-+ path = File.expand_path(path + File::SEPARATOR + basename)
-+ lstat = File.lstat path rescue nil
-+ if !lstat || !lstat.directory?
-+ unless path.start_with? destination_dir and (FileUtils.mkdir path, mkdir_options
rescue false)
-+ raise Gem::Package::PathError.new(file_name, destination_dir)
-+ end
-+ end
-+ path
-+ end
-+ end
-+
- ##
- # Loads a Gem::Specification from the TarEntry +entry+
-
-@@ -603,6 +618,10 @@ def verify_files gem
- raise Gem::Package::FormatError.new \
- 'package content (data.tar.gz) is missing', @gem
- end
-+
-+ if duplicates = @files.group_by {|f| f }.select {|k,v| v.size > 1
}.map(&:first) and duplicates.any?
-+ raise Gem::Security::Exception, "duplicate files in the package:
(#{duplicates.map(&:inspect).join(', ')})"
-+ end
- end
-
- ##
-@@ -616,6 +635,16 @@ def verify_gz entry # :nodoc:
- raise Gem::Package::FormatError.new(e.message, entry.full_name)
- end
-
-+ if File.respond_to? :realpath
-+ def realpath file
-+ File.realpath file
-+ end
-+ else
-+ def realpath file
-+ file
-+ end
-+ end
-+
- end
-
- require 'rubygems/package/digest_io'
-diff --git lib/rubygems/package/file_source.rb lib/rubygems/package/file_source.rb
-index 1a4dc4c824..ecc3a68677 100644
---- lib/rubygems/package/file_source.rb
-+++ lib/rubygems/package/file_source.rb
-@@ -23,11 +23,11 @@ def present?
- end
-
- def with_write_io &block
-- open path, 'wb', &block
-+ File.open path, 'wb', &block
- end
-
- def with_read_io &block
-- open path, 'rb', &block
-+ File.open path, 'rb', &block
- end
-
- end
-diff --git lib/rubygems/package/old.rb lib/rubygems/package/old.rb
-index f6e6e67c38..322d682ca8 100644
---- lib/rubygems/package/old.rb
-+++ lib/rubygems/package/old.rb
-@@ -80,7 +80,7 @@ def extract_files destination_dir
-
- FileUtils.mkdir_p File.dirname destination
-
-- open destination, 'wb', entry['mode'] do |out|
-+ File.open destination, 'wb', entry['mode'] do |out|
- out.write file_data
- end
-
-diff --git lib/rubygems/package/tar_header.rb lib/rubygems/package/tar_header.rb
-index c54bd14d57..d557357114 100644
---- lib/rubygems/package/tar_header.rb
-+++ lib/rubygems/package/tar_header.rb
-@@ -104,25 +104,30 @@ def self.from(stream)
- fields = header.unpack UNPACK_FORMAT
-
- new :name => fields.shift,
-- :mode => fields.shift.oct,
-- :uid => fields.shift.oct,
-- :gid => fields.shift.oct,
-- :size => fields.shift.oct,
-- :mtime => fields.shift.oct,
-- :checksum => fields.shift.oct,
-+ :mode => strict_oct(fields.shift),
-+ :uid => strict_oct(fields.shift),
-+ :gid => strict_oct(fields.shift),
-+ :size => strict_oct(fields.shift),
-+ :mtime => strict_oct(fields.shift),
-+ :checksum => strict_oct(fields.shift),
- :typeflag => fields.shift,
- :linkname => fields.shift,
- :magic => fields.shift,
-- :version => fields.shift.oct,
-+ :version => strict_oct(fields.shift),
- :uname => fields.shift,
- :gname => fields.shift,
-- :devmajor => fields.shift.oct,
-- :devminor => fields.shift.oct,
-+ :devmajor => strict_oct(fields.shift),
-+ :devminor => strict_oct(fields.shift),
- :prefix => fields.shift,
-
- :empty => empty
- end
-
-+ def self.strict_oct(str)
-+ return str.oct if str =~ /\A[0-7]*\z/
-+ raise ArgumentError, "#{str.inspect} is not an octal string"
-+ end
-+
- ##
- # Creates a new TarHeader using +vals+
-
-diff --git lib/rubygems/package/tar_writer.rb lib/rubygems/package/tar_writer.rb
-index f68b8d4c5e..390f7851a3 100644
---- lib/rubygems/package/tar_writer.rb
-+++ lib/rubygems/package/tar_writer.rb
-@@ -196,6 +196,8 @@ def add_file_signed name, mode, signer
- digest_name == signer.digest_name
- end
-
-+ raise "no #{signer.digest_name} in #{digests.values.compact}" unless
signature_digest
-+
- if signer.key then
- signature = signer.sign signature_digest.digest
-
-diff --git lib/rubygems/request_set/lockfile.rb lib/rubygems/request_set/lockfile.rb
-index 7f6eadb939..76ad17d486 100644
---- lib/rubygems/request_set/lockfile.rb
-+++ lib/rubygems/request_set/lockfile.rb
-@@ -223,7 +223,7 @@ def to_s
- def write
- content = to_s
-
-- open "#{(a)gem_deps_file}.lock", 'w' do |io|
-+ File.open "#{(a)gem_deps_file}.lock", 'w' do |io|
- io.write content
- end
- end
-diff --git lib/rubygems/security.rb lib/rubygems/security.rb
-index 4690dd9230..236577c5a3 100644
---- lib/rubygems/security.rb
-+++ lib/rubygems/security.rb
-@@ -578,7 +578,7 @@ def self.trusted_certificates &block
- def self.write pemmable, path, permissions = 0600, passphrase = nil, cipher =
KEY_CIPHER
- path = File.expand_path path
-
-- open path, 'wb', permissions do |io|
-+ File.open path, 'wb', permissions do |io|
- if passphrase and cipher
- io.write pemmable.to_pem cipher, passphrase
- else
-diff --git lib/rubygems/security/trust_dir.rb lib/rubygems/security/trust_dir.rb
-index bf44975cc6..849cf3cd3e 100644
---- lib/rubygems/security/trust_dir.rb
-+++ lib/rubygems/security/trust_dir.rb
-@@ -93,7 +93,7 @@ def trust_cert certificate
-
- destination = cert_path certificate
-
-- open destination, 'wb', @permissions[:trusted_cert] do |io|
-+ File.open destination, 'wb', @permissions[:trusted_cert] do |io|
- io.write certificate.to_pem
- end
- end
-diff --git lib/rubygems/server.rb lib/rubygems/server.rb
-index 93b3af36f8..62c3dfe9cf 100644
---- lib/rubygems/server.rb
-+++ lib/rubygems/server.rb
-@@ -623,6 +623,18 @@ def root(req, res)
- executables = nil if executables.empty?
- executables.last["is_last"] = true if executables
-
-+ # Pre-process spec homepage for safety reasons
-+ begin
-+ homepage_uri = URI.parse(spec.homepage)
-+ if [URI::HTTP, URI::HTTPS].member? homepage_uri.class
-+ homepage_uri = spec.homepage
-+ else
-+ homepage_uri = "."
-+ end
-+ rescue URI::InvalidURIError
-+ homepage_uri = "."
-+ end
-+
- specs << {
- "authors" => spec.authors.sort.join(", "),
- "date" => spec.date.to_s,
-@@ -632,7 +644,7 @@ def root(req, res)
- "only_one_executable" => (executables && executables.size
== 1),
- "full_name" => spec.full_name,
- "has_deps" => !deps.empty?,
-- "homepage" => spec.homepage,
-+ "homepage" => homepage_uri,
- "name" => spec.name,
- "rdoc_installed" => Gem::RDoc.new(spec).rdoc_installed?,
- "ri_installed" => Gem::RDoc.new(spec).ri_installed?,
-diff --git lib/rubygems/source.rb lib/rubygems/source.rb
-index bd84c217a7..b28b850660 100644
---- lib/rubygems/source.rb
-+++ lib/rubygems/source.rb
-@@ -160,7 +160,7 @@ def fetch_spec name_tuple
- if update_cache? then
- FileUtils.mkdir_p cache_dir
-
-- open local_spec, 'wb' do |io|
-+ File.open local_spec, 'wb' do |io|
- io.write spec
- end
- end
-diff --git lib/rubygems/specification.rb lib/rubygems/specification.rb
-index efc08c4738..2560324b7a 100644
---- lib/rubygems/specification.rb
-+++ lib/rubygems/specification.rb
-@@ -15,6 +15,7 @@
- require 'rubygems/stub_specification'
- require 'rubygems/util/list'
- require 'stringio'
-+require 'uri'
-
- ##
- # The Specification class contains the information for a Gem. Typically
-@@ -2822,10 +2823,16 @@ def validate packaging = true
- raise Gem::InvalidSpecificationException, "#{lazy} is not a summary"
- end
-
-- if homepage and not homepage.empty? and
-- homepage !~ /\A[a-z][a-z\d+.-]*:/i then
-- raise Gem::InvalidSpecificationException,
-- "\"#{homepage}\" is not a URI"
-+ # Make sure a homepage is valid HTTP/HTTPS URI
-+ if homepage and not homepage.empty?
-+ begin
-+ homepage_uri = URI.parse(homepage)
-+ unless [URI::HTTP, URI::HTTPS].member? homepage_uri.class
-+ raise Gem::InvalidSpecificationException, "\"#{homepage}\" is
not a valid HTTP URI"
-+ end
-+ rescue URI::InvalidURIError
-+ raise Gem::InvalidSpecificationException, "\"#{homepage}\" is not
a valid HTTP URI"
-+ end
- end
-
- # Warnings
-diff --git lib/rubygems/stub_specification.rb lib/rubygems/stub_specification.rb
-index 8337375ab4..ae2effbc84 100644
---- lib/rubygems/stub_specification.rb
-+++ lib/rubygems/stub_specification.rb
-@@ -113,6 +113,8 @@ def data
- unless @data
- begin
- saved_lineno = $.
-+
-+ # TODO It should be use `File.open`, but bundler-1.16.1 example expects
Kernel#open.
- open loaded_from, OPEN_MODE do |file|
- begin
- file.readline # discard encoding line
-diff --git lib/rubygems/test_case.rb lib/rubygems/test_case.rb
-index f7f216e5e3..39aa4fc9a7 100644
---- lib/rubygems/test_case.rb
-+++ lib/rubygems/test_case.rb
-@@ -488,7 +488,7 @@ def git_gem name = 'a', version = 1
-
- gemspec = "#{name}.gemspec"
-
-- open File.join(directory, gemspec), 'w' do |io|
-+ File.open File.join(directory, gemspec), 'w' do |io|
- io.write git_spec.to_ruby
- end
-
-@@ -592,7 +592,7 @@ def mu_pp(obj)
- # Reads a Marshal file at +path+
-
- def read_cache(path)
-- open path.dup.untaint, 'rb' do |io|
-+ File.open path.dup.untaint, 'rb' do |io|
- Marshal.load io.read
- end
- end
-@@ -612,7 +612,7 @@ def write_file(path)
- dir = File.dirname path
- FileUtils.mkdir_p dir unless File.directory? dir
-
-- open path, 'wb' do |io|
-+ File.open path, 'wb' do |io|
- yield io if block_given?
- end
-
-@@ -727,7 +727,7 @@ def install_default_gems(*specs)
- install_default_specs(*specs)
-
- specs.each do |spec|
-- open spec.loaded_from, 'w' do |io|
-+ File.open spec.loaded_from, 'w' do |io|
- io.write spec.to_ruby_for_cache
- end
- end
-@@ -1363,7 +1363,7 @@ def save_gemspec name = 'a', version = 1, directory =
'.'
- yield specification if block_given?
- end
-
-- open File.join(directory, "#{name}.gemspec"), 'w' do |io|
-+ File.open File.join(directory, "#{name}.gemspec"), 'w' do |io|
- io.write vendor_spec.to_ruby
- end
-
-diff --git lib/rubygems/test_utilities.rb lib/rubygems/test_utilities.rb
-index 686916ea02..83c9d2d0fe 100644
---- lib/rubygems/test_utilities.rb
-+++ lib/rubygems/test_utilities.rb
-@@ -346,7 +346,7 @@ def spec name, version, dependencies = nil, &block
- end
-
- def write_spec spec # :nodoc:
-- open spec.spec_file, 'w' do |io|
-+ File.open spec.spec_file, 'w' do |io|
- io.write spec.to_ruby_for_cache
- end
- end
-diff --git lib/rubygems/util.rb lib/rubygems/util.rb
-index 2de45c900b..6c75910004 100644
---- lib/rubygems/util.rb
-+++ lib/rubygems/util.rb
-@@ -114,7 +114,8 @@ def self.traverse_parents directory, &block
-
- here = File.expand_path directory
- loop do
-- Dir.chdir here, &block
-+ Dir.chdir here, &block rescue Errno::EACCES
-+
- new_here = File.expand_path('..', here)
- return if new_here == here # toplevel
- here = new_here
-diff --git lib/rubygems/validator.rb lib/rubygems/validator.rb
-index 83448229bb..6842e4fa9c 100644
---- lib/rubygems/validator.rb
-+++ lib/rubygems/validator.rb
-@@ -34,7 +34,7 @@ def verify_gem(gem_data)
- # gem_path:: [String] Path to gem file
-
- def verify_gem_file(gem_path)
-- open gem_path, Gem.binary_mode do |file|
-+ File.open gem_path, Gem.binary_mode do |file|
- gem_data = file.read
- verify_gem gem_data
- end
-@@ -109,7 +109,7 @@ def alien(gems=[])
-
- good, gone, unreadable = nil, nil, nil, nil
-
-- open gem_path, Gem.binary_mode do |file|
-+ File.open gem_path, Gem.binary_mode do |file|
- package = Gem::Package.new gem_path
-
- good, gone = package.contents.partition { |file_name|
-@@ -134,7 +134,7 @@ def alien(gems=[])
-
- source = File.join gem_directory, entry['path']
-
-- open source, Gem.binary_mode do |f|
-+ File.open source, Gem.binary_mode do |f|
- unless f.read == data then
- errors[gem_name][entry['path']] = "Modified from
original"
- end
-diff --git test/rubygems/test_gem.rb test/rubygems/test_gem.rb
-index 8a11cc2ecf..183771f0f3 100644
---- test/rubygems/test_gem.rb
-+++ test/rubygems/test_gem.rb
-@@ -7,7 +7,7 @@
- require 'tmpdir'
-
- # TODO: push this up to test_case.rb once battle tested
--$SAFE=1
-+
- $LOAD_PATH.map! do |path|
- path.dup.untaint
- end
-@@ -463,7 +463,7 @@ def test_self_ensure_gem_directories_missing_parents
- assert File.directory?(util_cache_dir)
- end
-
-- unless win_platform? then # only for FS that support write protection
-+ unless win_platform? || Process.uid.zero? then # only for FS that support write
protection
- def test_self_ensure_gem_directories_write_protected
- gemdir = File.join @tempdir, "egd"
- FileUtils.rm_r gemdir rescue nil
-@@ -775,7 +775,7 @@ def test_self_prefix_sitelibdir
- end
-
- def test_self_read_binary
-- open 'test', 'w' do |io|
-+ File.open 'test', 'w' do |io|
- io.write "\xCF\x80"
- end
-
-@@ -1643,7 +1643,7 @@ def test_use_gemdeps
- spec = Gem::Specification.find { |s| s == spec }
- refute spec.activated?
-
-- open gem_deps_file, 'w' do |io|
-+ File.open gem_deps_file, 'w' do |io|
- io.write 'gem "a"'
- end
-
-@@ -1662,7 +1662,7 @@ def test_use_gemdeps_ENV
-
- refute spec.activated?
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.write 'gem "a"'
- end
-
-@@ -1706,7 +1706,7 @@ def test_use_gemdeps_automatic
-
- refute spec.activated?
-
-- open 'Gemfile', 'w' do |io|
-+ File.open 'Gemfile', 'w' do |io|
- io.write 'gem "a"'
- end
-
-@@ -1735,7 +1735,7 @@ def test_use_gemdeps_disabled
-
- refute spec.activated?
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.write 'gem "a"'
- end
-
-@@ -1750,7 +1750,7 @@ def test_use_gemdeps_missing_gem
- skip 'Insecure operation - read' if RUBY_VERSION <= "1.8.7"
- rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'],
'x'
-
-- open 'x', 'w' do |io|
-+ File.open 'x', 'w' do |io|
- io.write 'gem "a"'
- end
-
-@@ -1791,7 +1791,7 @@ def test_use_gemdeps_specific
- spec = Gem::Specification.find { |s| s == spec }
- refute spec.activated?
-
-- open 'x', 'w' do |io|
-+ File.open 'x', 'w' do |io|
- io.write 'gem "a"'
- end
-
-diff --git test/rubygems/test_gem_commands_cleanup_command.rb
test/rubygems/test_gem_commands_cleanup_command.rb
-index c55e195975..60d208fcc0 100644
---- test/rubygems/test_gem_commands_cleanup_command.rb
-+++ test/rubygems/test_gem_commands_cleanup_command.rb
-@@ -158,7 +158,7 @@ def test_execute_all_user_no_sudo
- assert_path_exists @a_1_1.gem_dir
- ensure
- FileUtils.chmod 0755, @gemhome
-- end unless win_platform?
-+ end unless win_platform? || Process.uid.zero?
-
- def test_execute_dry_run
- @cmd.options[:args] = %w[a]
-diff --git test/rubygems/test_gem_commands_install_command.rb
test/rubygems/test_gem_commands_install_command.rb
-index dd86a85038..822d40e3f3 100644
---- test/rubygems/test_gem_commands_install_command.rb
-+++ test/rubygems/test_gem_commands_install_command.rb
-@@ -131,6 +131,7 @@ def test_execute_local_transitive_prerelease
-
- def test_execute_no_user_install
- skip 'skipped on MS Windows (chmod has no effect)' if win_platform?
-+ skip 'skipped in root privilege' if Process.uid.zero?
-
- specs = spec_fetcher do |fetcher|
- fetcher.gem 'a', 2
-diff --git test/rubygems/test_gem_commands_owner_command.rb
test/rubygems/test_gem_commands_owner_command.rb
-index 44652c1093..53cac4ce87 100644
---- test/rubygems/test_gem_commands_owner_command.rb
-+++ test/rubygems/test_gem_commands_owner_command.rb
-@@ -43,6 +43,31 @@ def test_show_owners
- assert_match %r{- 4}, @ui.output
- end
-
-+ def test_show_owners_dont_load_objects
-+ skip "testing a psych-only API" unless defined?(::Psych::DisallowedClass)
-+
-+ response = <<EOF
-+---
-+- email: !ruby/object:Object {}
-+ id: 1
-+ handle: user1
-+- email: user2(a)example.com
-+- id: 3
-+ handle: user3
-+- id: 4
-+EOF
-+
-+ @fetcher.data["#{Gem.host}/api/v1/gems/freewill/owners.yaml"] = [response,
200, 'OK']
-+
-+ assert_raises Psych::DisallowedClass do
-+ use_ui @ui do
-+ @cmd.show_owners("freewill")
-+ end
-+ end
-+
-+ end
-+
-+
- def test_show_owners_setting_up_host_through_env_var
- response = "- email: user1(a)example.com\n"
- host = "http://rubygems.example"
-diff --git test/rubygems/test_gem_commands_push_command.rb
test/rubygems/test_gem_commands_push_command.rb
-index b888a741f0..1c5dbfe23e 100644
---- test/rubygems/test_gem_commands_push_command.rb
-+++ test/rubygems/test_gem_commands_push_command.rb
-@@ -132,7 +132,7 @@ def test_sending_gem_to_metadata_host
- }
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
- Gem.configuration.load_api_keys
-@@ -166,7 +166,7 @@ def test_sending_gem_to_allowed_push_host
- }
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
- Gem.configuration.load_api_keys
-@@ -193,7 +193,7 @@ def test_sending_gem_to_allowed_push_host_with_basic_credentials
- }
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
- Gem.configuration.load_api_keys
-@@ -235,7 +235,7 @@ def test_sending_gem_to_disallowed_push_host
- }
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
- Gem.configuration.load_api_keys
-@@ -266,7 +266,7 @@ def test_sending_gem_defaulting_to_allowed_push_host
- }
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
- Gem.configuration.load_api_keys
-diff --git test/rubygems/test_gem_commands_setup_command.rb
test/rubygems/test_gem_commands_setup_command.rb
-index 2136edb1be..f2541a24c7 100644
---- test/rubygems/test_gem_commands_setup_command.rb
-+++ test/rubygems/test_gem_commands_setup_command.rb
-@@ -6,6 +6,13 @@
-
- class TestGemCommandsSetupCommand < Gem::TestCase
-
-+ bundler_gemspec =
File.expand_path("../../../bundler/lib/bundler/version.rb", __FILE__)
-+ if File.exist?(bundler_gemspec)
-+ BUNDLER_VERS = File.read(bundler_gemspec).match(/VERSION =
"(#{Gem::Version::VERSION_PATTERN})"/)[1]
-+ else
-+ BUNDLER_VERS = "1.16.1"
-+ end
-+
- def setup
- super
-
-@@ -16,27 +23,27 @@ def setup
- FileUtils.mkdir_p 'bin'
- FileUtils.mkdir_p 'lib/rubygems/ssl_certs/rubygems.org'
-
-- open 'bin/gem', 'w' do |io| io.puts '#
gem' end
-- open 'lib/rubygems.rb', 'w' do |io| io.puts '#
rubygems.rb' end
-- open 'lib/rubygems/test_case.rb', 'w' do |io| io.puts '#
test_case.rb' end
-- open 'lib/rubygems/ssl_certs/rubygems.org/foo.pem', 'w' do |io|
io.puts 'PEM' end
-+ File.open 'bin/gem', 'w' do |io| io.puts '#
gem' end
-+ File.open 'lib/rubygems.rb', 'w' do |io| io.puts '#
rubygems.rb' end
-+ File.open 'lib/rubygems/test_case.rb', 'w' do |io| io.puts '#
test_case.rb' end
-+ File.open 'lib/rubygems/ssl_certs/rubygems.org/foo.pem', 'w' do |io|
io.puts 'PEM' end
-
- FileUtils.mkdir_p 'bundler/exe'
- FileUtils.mkdir_p 'bundler/lib/bundler'
-
-- open 'bundler/exe/bundle', 'w' do |io| io.puts '#
bundle' end
-- open 'bundler/lib/bundler.rb', 'w' do |io| io.puts '#
bundler.rb' end
-- open 'bundler/lib/bundler/b.rb', 'w' do |io| io.puts '#
b.rb' end
-+ File.open 'bundler/exe/bundle', 'w' do |io| io.puts '#
bundle' end
-+ File.open 'bundler/lib/bundler.rb', 'w' do |io| io.puts '#
bundler.rb' end
-+ File.open 'bundler/lib/bundler/b.rb', 'w' do |io| io.puts '#
b.rb' end
-
- FileUtils.mkdir_p 'default/gems'
-
- gemspec = Gem::Specification.new
- gemspec.name = "bundler"
-- gemspec.version = "1.16.0"
-+ gemspec.version = BUNDLER_VERS
- gemspec.bindir = "exe"
- gemspec.executables = ["bundle"]
-
-- open 'bundler/bundler.gemspec', 'w' do |io|
-+ File.open 'bundler/bundler.gemspec', 'w' do |io|
- io.puts gemspec.to_ruby
- end
-
-@@ -46,6 +53,11 @@ def setup
- end
-
- FileUtils.mkdir_p File.join(Gem.default_dir, "specifications")
-+
-+ open(File.join(Gem.default_dir, "specifications",
"bundler-#{BUNDLER_VERS}.gemspec"), 'w') do |io|
-+ io.puts "# bundler-#{BUNDLER_VERS}"
-+ end
-+
- open(File.join(Gem.default_dir, "specifications",
"bundler-audit-1.0.0.gemspec"), 'w') do |io|
- io.puts '# bundler-audit'
- end
-@@ -134,13 +146,25 @@ def test_install_default_bundler_gem
-
- default_dir = Gem::Specification.default_specifications_dir
-
-+ # expect to remove other versions of bundler gemspecs on default specification
directory.
- refute_path_exists File.join(default_dir, "bundler-1.15.4.gemspec")
-- refute_path_exists 'default/gems/bundler-1.15.4'
--
-- assert_path_exists File.join(default_dir, "bundler-1.16.0.gemspec")
-- assert_path_exists 'default/gems/bundler-1.16.0'
-+ assert_path_exists File.join(default_dir,
"bundler-#{BUNDLER_VERS}.gemspec")
-
-+ # expect to not remove bundler-* gemspecs.
- assert_path_exists File.join(Gem.default_dir, "specifications",
"bundler-audit-1.0.0.gemspec")
-+
-+ # expect to remove normal gem that was same version. because it's promoted
default gems.
-+ refute_path_exists File.join(Gem.default_dir, "specifications",
"bundler-#{BUNDLER_VERS}.gemspec")
-+
-+ # expect to install default gems. It location was `site_ruby` directory on real
world.
-+ assert_path_exists "default/gems/bundler-#{BUNDLER_VERS}"
-+
-+ # expect to not remove other versions of bundler on `site_ruby`
-+ assert_path_exists 'default/gems/bundler-1.15.4'
-+
-+ # TODO: We need to assert to remove same version of bundler on gem_dir
directory(It's not site_ruby dir)
-+
-+ # expect to not remove bundler-* direcotyr.
- assert_path_exists 'default/gems/bundler-audit-1.0.0'
- end if Gem::USE_BUNDLER_FOR_GEMDEPS
-
-@@ -162,14 +186,14 @@ def test_remove_old_lib_files
- FileUtils.mkdir_p lib_rubygems_defaults
- FileUtils.mkdir_p lib_bundler
-
-- open securerandom_rb, 'w' do |io| io.puts '# securerandom.rb'
end
-+ File.open securerandom_rb, 'w' do |io| io.puts '#
securerandom.rb' end
-
-- open old_builder_rb, 'w' do |io| io.puts '# builder.rb'
end
-- open old_format_rb, 'w' do |io| io.puts '# format.rb'
end
-- open old_bundler_c_rb, 'w' do |io| io.puts '# c.rb'
end
-+ File.open old_builder_rb, 'w' do |io| io.puts '# builder.rb'
end
-+ File.open old_format_rb, 'w' do |io| io.puts '# format.rb'
end
-+ File.open old_bundler_c_rb, 'w' do |io| io.puts '# c.rb'
end
-
-- open engine_defaults_rb, 'w' do |io| io.puts '# jruby.rb'
end
-- open os_defaults_rb, 'w' do |io| io.puts '# operating_system.rb'
end
-+ File.open engine_defaults_rb, 'w' do |io| io.puts '# jruby.rb'
end
-+ File.open os_defaults_rb, 'w' do |io| io.puts '#
operating_system.rb' end
-
- @cmd.remove_old_lib_files lib
-
-@@ -191,7 +215,7 @@ def test_show_release_notes
-
- @cmd.options[:previous_version] = Gem::Version.new '2.0.2'
-
-- open 'History.txt', 'w' do |io|
-+ File.open 'History.txt', 'w' do |io|
- io.puts <<-History_txt
- # coding: UTF-8
-
-diff --git test/rubygems/test_gem_commands_uninstall_command.rb
test/rubygems/test_gem_commands_uninstall_command.rb
-index 2097ca7d43..2fdff706e7 100644
---- test/rubygems/test_gem_commands_uninstall_command.rb
-+++ test/rubygems/test_gem_commands_uninstall_command.rb
-@@ -92,7 +92,7 @@ def test_execute_removes_executable
- # Evil hack to prevent false removal success
- FileUtils.rm_f @executable
-
-- open @executable, "wb+" do |f| f.puts "binary" end
-+ File.open @executable, "wb+" do |f| f.puts "binary" end
-
- @cmd.options[:executables] = true
- @cmd.options[:args] = [@spec.name]
-@@ -204,7 +204,7 @@ def test_execute_with_force_ignores_dependencies
- end
-
- assert Gem::Specification.find_all_by_name('dep_x').length > 0
-- assert Gem::Specification.find_all_by_name('x').length == 0
-+ assert Gem::Specification.find_all_by_name('x').length.zero?
- end
-
- def test_execute_all
-diff --git test/rubygems/test_gem_dependency_installer.rb
test/rubygems/test_gem_dependency_installer.rb
-index e55cc75682..3d76291668 100644
---- test/rubygems/test_gem_dependency_installer.rb
-+++ test/rubygems/test_gem_dependency_installer.rb
-@@ -424,7 +424,7 @@ def test_install_dependency_existing_extension
- extconf_rb = File.join @gemhome, 'gems', 'e-1',
'extconf.rb'
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |io|
-+ File.open extconf_rb, 'w' do |io|
- io.write <<-EXTCONF_RB
- require 'mkmf'
- create_makefile 'e'
-diff --git test/rubygems/test_gem_doctor.rb test/rubygems/test_gem_doctor.rb
-index 39b8a11692..8db65d70ce 100644
---- test/rubygems/test_gem_doctor.rb
-+++ test/rubygems/test_gem_doctor.rb
-@@ -24,7 +24,7 @@ def test_doctor
-
- FileUtils.rm b.spec_file
-
-- open c.spec_file, 'w' do |io|
-+ File.open c.spec_file, 'w' do |io|
- io.write 'this will raise an exception when evaluated.'
- end
-
-@@ -77,7 +77,7 @@ def test_doctor_dry_run
-
- FileUtils.rm b.spec_file
-
-- open c.spec_file, 'w' do |io|
-+ File.open c.spec_file, 'w' do |io|
- io.write 'this will raise an exception when evaluated.'
- end
-
-diff --git test/rubygems/test_gem_ext_builder.rb test/rubygems/test_gem_ext_builder.rb
-index d142ef28da..3dabd3e350 100644
---- test/rubygems/test_gem_ext_builder.rb
-+++ test/rubygems/test_gem_ext_builder.rb
-@@ -32,7 +32,7 @@ def test_class_make
- results = []
-
- Dir.chdir @ext do
-- open 'Makefile', 'w' do |io|
-+ File.open 'Makefile', 'w' do |io|
- io.puts <<-MAKEFILE
- all:
- \t(a)#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}"
-@@ -72,7 +72,7 @@ def test_class_make_no_clean
- results = []
-
- Dir.chdir @ext do
-- open 'Makefile', 'w' do |io|
-+ File.open 'Makefile', 'w' do |io|
- io.puts <<-MAKEFILE
- all:
- \t(a)#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}"
-@@ -107,7 +107,7 @@ def test_build_extensions
-
- extconf_rb = File.join ext_dir, 'extconf.rb'
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
- require 'mkmf'
-
-@@ -168,7 +168,7 @@ def Gem.install_extension_in_lib
-
- extconf_rb = File.join ext_dir, 'extconf.rb'
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
- require 'mkmf'
-
-@@ -290,7 +290,7 @@ def test_build_extensions_with_build_args
-
- FileUtils.mkdir_p @spec.gem_dir
-
-- open File.join((a)spec.gem_dir, "extconf.rb"), "w" do |f|
-+ File.open File.join((a)spec.gem_dir, "extconf.rb"), "w" do |f|
- f.write <<-'RUBY'
- puts "IN EXTCONF"
- extconf_args = File.join File.dirname(__FILE__), 'extconf_args'
-@@ -323,7 +323,7 @@ def test_initialize
-
- build_info_file = File.join build_info_dir, "#{(a)spec.full_name}.info"
-
-- open build_info_file, 'w' do |io|
-+ File.open build_info_file, 'w' do |io|
- io.puts '--with-foo-dir=/nonexistent'
- end
-
-diff --git test/rubygems/test_gem_gem_runner.rb test/rubygems/test_gem_gem_runner.rb
-index 0a1faa404a..d68ac4da81 100644
---- test/rubygems/test_gem_gem_runner.rb
-+++ test/rubygems/test_gem_gem_runner.rb
-@@ -1,38 +1,6 @@
- # frozen_string_literal: true
- require 'rubygems/test_case'
--begin
-- gem_home_files = lambda{
-- if Dir.exist?(ENV["GEM_HOME"])
-- require "find"
-- ary = Find.find(ENV["GEM_HOME"]).to_a
-- else
-- []
-- end
-- }
-- prev_gem_home = ENV["GEM_HOME"]
-- prev_gem_home_files = gem_home_files.call
-- prev_threads = Thread.list.map{|e| e.inspect}
--
-- require 'rubygems/gem_runner'
--ensure
-- if $!
-- msg = <<eom
--***************
--PREV
-- GEM_HOME: #{prev_gem_home}
-- Files in GEM_HOME: #{prev_gem_home_files.inspect}
-- Threads: #{prev_threads.inspect}
--Current:
-- GEM_HOME: #{ENV["GEM_HOME"]}
-- Files in GEM_HOME: #{gem_home_files.call}
-- Threads: #{Thread.list.map{|e| e.inspect}.inspect}
--Exception: #{$!.message}
--eom
-- p $!.class
-- p $!.message.frozen?
-- raise $!.class, msg, $!.backtrace
-- end
--end
-+require 'rubygems/gem_runner'
-
- class TestGemGemRunner < Gem::TestCase
-
-diff --git test/rubygems/test_gem_gemcutter_utilities.rb
test/rubygems/test_gem_gemcutter_utilities.rb
-index c3f9a7ea18..286d59a787 100644
---- test/rubygems/test_gem_gemcutter_utilities.rb
-+++ test/rubygems/test_gem_gemcutter_utilities.rb
-@@ -31,7 +31,7 @@ def test_alternate_key_alternate_host
-
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
-
-@@ -46,7 +46,7 @@ def test_api_key
- keys = { :rubygems_api_key => 'KEY' }
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
-
-@@ -59,7 +59,7 @@ def test_api_key_override
- keys = { :rubygems_api_key => 'KEY', :other => 'OTHER' }
- FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
-
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write keys.to_yaml
- end
-
-@@ -163,7 +163,7 @@ def test_sign_in_with_other_credentials_doesnt_overwrite_other_keys
- other_api_key = 'f46dbb18bb6a9c97cdc61b5b85c186a17403cdcbf'
-
- FileUtils.mkdir_p File.dirname(Gem.configuration.credentials_path)
-- open Gem.configuration.credentials_path, 'w' do |f|
-+ File.open Gem.configuration.credentials_path, 'w' do |f|
- f.write Hash[:other_api_key, other_api_key].to_yaml
- end
- util_sign_in [api_key, 200, 'OK']
-diff --git test/rubygems/test_gem_indexer.rb test/rubygems/test_gem_indexer.rb
-index a4a966e8de..5a9075e676 100644
---- test/rubygems/test_gem_indexer.rb
-+++ test/rubygems/test_gem_indexer.rb
-@@ -39,8 +39,7 @@ def setup
-
- def test_initialize
- assert_equal @tempdir, @indexer.dest_directory
-- assert_equal File.join(Dir.tmpdir, "gem_generate_index_#{$$}"),
-- @indexer.directory
-+ assert_match %r{#{Dir.mktmpdir('gem_generate_index').match(/.*-/)}},
@indexer.directory
-
- indexer = Gem::Indexer.new @tempdir
- assert indexer.build_modern
-diff --git test/rubygems/test_gem_install_update_options.rb
test/rubygems/test_gem_install_update_options.rb
-index e2d546307d..371e408d27 100644
---- test/rubygems/test_gem_install_update_options.rb
-+++ test/rubygems/test_gem_install_update_options.rb
-@@ -141,6 +141,8 @@ def test_user_install_enabled
- def test_user_install_disabled_read_only
- if win_platform?
- skip('test_user_install_disabled_read_only test skipped on MS Windows')
-+ elsif Process.uid.zero?
-+ skip('test_user_install_disabled_read_only test skipped in root
privilege')
- else
- @cmd.handle_options %w[--no-user-install]
-
-diff --git test/rubygems/test_gem_installer.rb test/rubygems/test_gem_installer.rb
-index 39095c7dee..93b0482407 100644
---- test/rubygems/test_gem_installer.rb
-+++ test/rubygems/test_gem_installer.rb
-@@ -140,7 +140,7 @@ def test_check_executable_overwrite_format_executable
- s.require_path = 'lib'
- end
-
-- open File.join(util_inst_bindir, 'executable'), 'w' do |io|
-+ File.open File.join(util_inst_bindir, 'executable'), 'w' do |io|
- io.write <<-EXEC
- #!/usr/local/bin/ruby
- #
-@@ -437,6 +437,8 @@ def test_generate_bin_script_no_perms
-
- if win_platform?
- skip('test_generate_bin_script_no_perms skipped on MS Windows')
-+ elsif Process.uid.zero?
-+ skip('test_generate_bin_script_no_perms skipped in root privilege')
- else
- FileUtils.chmod 0000, util_inst_bindir
-
-@@ -529,6 +531,8 @@ def test_generate_bin_symlink_no_perms
-
- if win_platform?
- skip('test_generate_bin_symlink_no_perms skipped on MS Windows')
-+ elsif Process.uid.zero?
-+ skip('test_user_install_disabled_read_only test skipped in root
privilege')
- else
- FileUtils.chmod 0000, util_inst_bindir
-
-diff --git test/rubygems/test_gem_package.rb test/rubygems/test_gem_package.rb
-index cec1981c4c..d1664cf285 100644
---- test/rubygems/test_gem_package.rb
-+++ test/rubygems/test_gem_package.rb
-@@ -24,7 +24,7 @@ def setup
- end
-
- def test_class_new_old_format
-- open 'old_format.gem', 'wb' do |io|
-+ File.open 'old_format.gem', 'wb' do |io|
- io.write SIMPLE_GEM
- end
-
-@@ -45,7 +45,7 @@ def test_add_checksums
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -110,8 +110,8 @@ def test_add_files
-
- FileUtils.mkdir_p 'lib/empty'
-
-- open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb'
end
-- open 'lib/extra.rb', 'w' do |io| io.write '# lib/extra.rb'
end
-+ File.open 'lib/code.rb', 'w' do |io| io.write '#
lib/code.rb' end
-+ File.open 'lib/extra.rb', 'w' do |io| io.write '#
lib/extra.rb' end
-
- package = Gem::Package.new 'bogus.gem'
- package.spec = spec
-@@ -140,7 +140,7 @@ def test_add_files_symlink
- spec.files = %w[lib/code.rb lib/code_sym.rb]
-
- FileUtils.mkdir_p 'lib'
-- open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb'
end
-+ File.open 'lib/code.rb', 'w' do |io| io.write '#
lib/code.rb' end
-
- # NOTE: 'code.rb' is correct, because it's relative to lib/code_sym.rb
- File.symlink('code.rb', 'lib/code_sym.rb')
-@@ -179,7 +179,7 @@ def test_build
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -218,7 +218,7 @@ def test_build_auto_signed
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -261,7 +261,7 @@ def test_build_auto_signed_encrypted_key
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -311,7 +311,7 @@ def test_build_signed
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -348,7 +348,7 @@ def test_build_signed_encrypted_key
-
- FileUtils.mkdir 'lib'
-
-- open 'lib/code.rb', 'w' do |io|
-+ File.open 'lib/code.rb', 'w' do |io|
- io.write '# lib/code.rb'
- end
-
-@@ -408,7 +408,7 @@ def test_extract_files_empty
- end
- end
-
-- open 'empty.gem', 'wb' do |io|
-+ File.open 'empty.gem', 'wb' do |io|
- io.write gem.string
- end
-
-@@ -455,6 +455,31 @@ def test_extract_tar_gz_symlink_relative_path
- File.read(extracted)
- end
-
-+ def test_extract_symlink_parent
-+ skip 'symlink not supported' if Gem.win_platform?
-+
-+ package = Gem::Package.new @gem
-+
-+ tgz_io = util_tar_gz do |tar|
-+ tar.mkdir 'lib', 0755
-+ tar.add_symlink 'lib/link', '../..', 0644
-+ tar.add_file 'lib/link/outside.txt', 0644 do |io| io.write 'hi'
end
-+ end
-+
-+ # Extract into a subdirectory of @destination; if this test fails it writes
-+ # a file outside destination_subdir, but we want the file to remain inside
-+ # @destination so it will be cleaned up.
-+ destination_subdir = File.join @destination, 'subdir'
-+ FileUtils.mkdir_p destination_subdir
-+
-+ e = assert_raises Gem::Package::PathError do
-+ package.extract_tar_gz tgz_io, destination_subdir
-+ end
-+
-+ assert_equal("installing into parent path lib/link/outside.txt of " +
-+ "#{destination_subdir} is not allowed", e.message)
-+ end
-+
- def test_extract_tar_gz_directory
- package = Gem::Package.new @gem
-
-@@ -566,6 +591,21 @@ def test_install_location_relative
- "#{@destination} is not allowed", e.message)
- end
-
-+ def test_install_location_suffix
-+ package = Gem::Package.new @gem
-+
-+ filename = "../#{File.basename((a)destination)}suffix.rb"
-+
-+ e = assert_raises Gem::Package::PathError do
-+ package.install_location filename, @destination
-+ end
-+
-+ parent = File.expand_path File.join @destination, filename
-+
-+ assert_equal("installing into parent path #{parent} of " +
-+ "#{@destination} is not allowed", e.message)
-+ end
-+
- def test_load_spec
- entry = StringIO.new Gem.gzip @spec.to_yaml
- def entry.full_name() 'metadata.gz' end
-@@ -620,7 +660,7 @@ def test_verify_checksum_bad
- end
- end
-
-- open 'mismatch.gem', 'wb' do |io|
-+ File.open 'mismatch.gem', 'wb' do |io|
- io.write gem.string
- end
-
-@@ -670,7 +710,7 @@ def test_verify_checksum_missing
- end
- end
-
-- open 'data_checksum_missing.gem', 'wb' do |io|
-+ File.open 'data_checksum_missing.gem', 'wb' do |io|
- io.write gem.string
- end
-
-@@ -723,6 +763,32 @@ def test_verify_nonexistent
- assert_match %r%nonexistent.gem$%, e.message
- end
-
-+ def test_verify_duplicate_file
-+ FileUtils.mkdir_p 'lib'
-+ FileUtils.touch 'lib/code.rb'
-+
-+ build = Gem::Package.new @gem
-+ build.spec = @spec
-+ build.setup_signer
-+ open @gem, 'wb' do |gem_io|
-+ Gem::Package::TarWriter.new gem_io do |gem|
-+ build.add_metadata gem
-+ build.add_contents gem
-+
-+ gem.add_file_simple 'a.sig', 0444, 0
-+ gem.add_file_simple 'a.sig', 0444, 0
-+ end
-+ end
-+
-+ package = Gem::Package.new @gem
-+
-+ e = assert_raises Gem::Security::Exception do
-+ package.verify
-+ end
-+
-+ assert_equal 'duplicate files in the package: ("a.sig")',
e.message
-+ end
-+
- def test_verify_security_policy
- skip 'openssl is missing' unless defined?(OpenSSL::SSL)
-
-@@ -773,14 +839,20 @@ def test_verify_security_policy_checksum_missing
- FileUtils.mkdir 'lib'
- FileUtils.touch 'lib/code.rb'
-
-- open @gem, 'wb' do |gem_io|
-+ File.open @gem, 'wb' do |gem_io|
- Gem::Package::TarWriter.new gem_io do |gem|
- build.add_metadata gem
- build.add_contents gem
-
- # write bogus data.tar.gz to foil signature
- bogus_data = Gem.gzip 'hello'
-- gem.add_file_simple 'data.tar.gz', 0444, bogus_data.length do |io|
-+ fake_signer = Class.new do
-+ def digest_name; 'SHA512'; end
-+ def digest_algorithm; Digest(:SHA512); end
-+ def key; 'key'; end
-+ def sign(*); 'fake_sig'; end
-+ end
-+ gem.add_file_signed 'data2.tar.gz', 0444, fake_signer.new do |io|
- io.write bogus_data
- end
-
-@@ -804,7 +876,7 @@ def test_verify_security_policy_checksum_missing
- end
-
- def test_verify_truncate
-- open 'bad.gem', 'wb' do |io|
-+ File.open 'bad.gem', 'wb' do |io|
- io.write File.read(@gem, 1024) # don't care about newlines
- end
-
-diff --git test/rubygems/test_gem_package_old.rb test/rubygems/test_gem_package_old.rb
-index c15475b0c7..604981b3c1 100644
---- test/rubygems/test_gem_package_old.rb
-+++ test/rubygems/test_gem_package_old.rb
-@@ -7,7 +7,7 @@ class TestGemPackageOld < Gem::TestCase
- def setup
- super
-
-- open 'old_format.gem', 'wb' do |io|
-+ File.open 'old_format.gem', 'wb' do |io|
- io.write SIMPLE_GEM
- end
-
-diff --git test/rubygems/test_gem_package_tar_header.rb
test/rubygems/test_gem_package_tar_header.rb
-index d33877057d..43f508df45 100644
---- test/rubygems/test_gem_package_tar_header.rb
-+++ test/rubygems/test_gem_package_tar_header.rb
-@@ -143,5 +143,26 @@ def test_update_checksum
- assert_equal '012467', @tar_header.checksum
- end
-
-+ def test_from_bad_octal
-+ test_cases = [
-+ "00000006,44\000", # bogus character
-+ "00000006789\000", # non-octal digit
-+ "+0000001234\000", # positive sign
-+ "-0000001000\000", # negative sign
-+ "0x000123abc\000", # radix prefix
-+ ]
-+
-+ test_cases.each do |val|
-+ header_s = @tar_header.to_s
-+ # overwrite the size field
-+ header_s[124, 12] = val
-+ io = TempIO.new header_s
-+ assert_raises ArgumentError do
-+ new_header = Gem::Package::TarHeader.from io
-+ end
-+ io.close! if io.respond_to? :close!
-+ end
-+ end
-+
- end
-
-diff --git test/rubygems/test_gem_rdoc.rb test/rubygems/test_gem_rdoc.rb
-index 76ca8c45a9..0355883cb3 100644
---- test/rubygems/test_gem_rdoc.rb
-+++ test/rubygems/test_gem_rdoc.rb
-@@ -223,6 +223,7 @@ def test_remove
-
- def test_remove_unwritable
- skip 'chmod not supported' if Gem.win_platform?
-+ skip 'skipped in root privilege' if Process.uid.zero?
- FileUtils.mkdir_p @a.base_dir
- FileUtils.chmod 0, @a.base_dir
-
-@@ -251,6 +252,7 @@ def test_setup
-
- def test_setup_unwritable
- skip 'chmod not supported' if Gem.win_platform?
-+ skip 'skipped in root privilege' if Process.uid.zero?
- FileUtils.mkdir_p @a.doc_dir
- FileUtils.chmod 0, @a.doc_dir
-
-diff --git test/rubygems/test_gem_remote_fetcher.rb
test/rubygems/test_gem_remote_fetcher.rb
-index ee5ac77717..20e34e84e1 100644
---- test/rubygems/test_gem_remote_fetcher.rb
-+++ test/rubygems/test_gem_remote_fetcher.rb
-@@ -431,7 +431,7 @@ def test_download_install_dir
- assert File.exist?(a1_cache_gem)
- end
-
-- unless win_platform? # File.chmod doesn't work
-+ unless win_platform? || Process.uid.zero? # File.chmod doesn't work
- def test_download_local_read_only
- FileUtils.mv @a1_gem, @tempdir
- local_path = File.join @tempdir, @a1.file_name
-diff --git test/rubygems/test_gem_request_set.rb test/rubygems/test_gem_request_set.rb
-index 3a48827481..5dc6c1518d 100644
---- test/rubygems/test_gem_request_set.rb
-+++ test/rubygems/test_gem_request_set.rb
-@@ -52,7 +52,7 @@ def test_install_from_gemdeps
- rs = Gem::RequestSet.new
- installed = []
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts 'gem "a"'
- io.flush
-
-@@ -78,7 +78,7 @@ def test_install_from_gemdeps_explain
-
- rs = Gem::RequestSet.new
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts 'gem "a"'
- io.flush
-
-@@ -104,7 +104,7 @@ def test_install_from_gemdeps_install_dir
- rs = Gem::RequestSet.new
- installed = []
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts 'gem "a"'
- end
-
-@@ -128,7 +128,7 @@ def test_install_from_gemdeps_local
-
- rs = Gem::RequestSet.new
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts 'gem "a"'
- io.flush
-
-@@ -150,7 +150,7 @@ def test_install_from_gemdeps_lockfile
- rs = Gem::RequestSet.new
- installed = []
-
-- open 'gem.deps.rb.lock', 'w' do |io|
-+ File.open 'gem.deps.rb.lock', 'w' do |io|
- io.puts <<-LOCKFILE
- GEM
- remote: #{@gem_repo}
-@@ -167,7 +167,7 @@ def test_install_from_gemdeps_lockfile
- LOCKFILE
- end
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts 'gem "b"'
- end
-
-@@ -190,7 +190,7 @@ def test_install_from_gemdeps_version_mismatch
- rs = Gem::RequestSet.new
- installed = []
-
-- open 'gem.deps.rb', 'w' do |io|
-+ File.open 'gem.deps.rb', 'w' do |io|
- io.puts <<-GEM_DEPS
- gem "a"
- ruby "0"
-diff --git test/rubygems/test_gem_request_set_lockfile.rb
test/rubygems/test_gem_request_set_lockfile.rb
-index 908f97303e..7460b7efad 100644
---- test/rubygems/test_gem_request_set_lockfile.rb
-+++ test/rubygems/test_gem_request_set_lockfile.rb
-@@ -31,7 +31,7 @@ def lockfile
- def write_lockfile lockfile
- @lock_file = File.expand_path "#{(a)gem_deps_file}.lock"
-
-- open @lock_file, 'w' do |io|
-+ File.open @lock_file, 'w' do |io|
- io.write lockfile
- end
- end
-@@ -387,7 +387,7 @@ def test_to_s_git
- s.add_dependency 'c', '~> 1.0'
- end
-
-- open 'b.gemspec', 'w' do |io|
-+ File.open 'b.gemspec', 'w' do |io|
- io.write b.to_ruby
- end
-
-@@ -400,7 +400,7 @@ def test_to_s_git
- Dir.chdir 'c' do
- c = Gem::Specification.new 'c', 1
-
-- open 'c.gemspec', 'w' do |io|
-+ File.open 'c.gemspec', 'w' do |io|
- io.write c.to_ruby
- end
-
-@@ -455,7 +455,7 @@ def test_write_error
-
- gem_deps_lock_file = "#{(a)gem_deps_file}.lock"
-
-- open gem_deps_lock_file, 'w' do |io|
-+ File.open gem_deps_lock_file, 'w' do |io|
- io.write 'hello'
- end
-
-diff --git test/rubygems/test_gem_request_set_lockfile_parser.rb
test/rubygems/test_gem_request_set_lockfile_parser.rb
-index 9946c522d9..f3517da43a 100644
---- test/rubygems/test_gem_request_set_lockfile_parser.rb
-+++ test/rubygems/test_gem_request_set_lockfile_parser.rb
-@@ -536,7 +536,7 @@ def test_parse_missing
- end
-
- def write_lockfile lockfile
-- open @lock_file, 'w' do |io|
-+ File.open @lock_file, 'w' do |io|
- io.write lockfile
- end
- end
-diff --git test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
-index ab506a14e6..f4aba6d94a 100644
---- test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
-+++ test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
-@@ -295,7 +295,7 @@ def test_unget
- end
-
- def write_lockfile lockfile
-- open @lock_file, 'w' do |io|
-+ File.open @lock_file, 'w' do |io|
- io.write lockfile
- end
- end
-diff --git test/rubygems/test_gem_resolver_git_specification.rb
test/rubygems/test_gem_resolver_git_specification.rb
-index 9e8e2c5715..211757eb20 100644
---- test/rubygems/test_gem_resolver_git_specification.rb
-+++ test/rubygems/test_gem_resolver_git_specification.rb
-@@ -70,7 +70,7 @@ def test_install_extension
- Dir.chdir 'git/a' do
- FileUtils.mkdir_p 'ext/lib'
-
-- open 'ext/extconf.rb', 'w' do |io|
-+ File.open 'ext/extconf.rb', 'w' do |io|
- io.puts 'require "mkmf"'
- io.puts 'create_makefile "a"'
- end
-diff --git test/rubygems/test_gem_server.rb test/rubygems/test_gem_server.rb
-index 6fe02e480f..a018e65512 100644
---- test/rubygems/test_gem_server.rb
-+++ test/rubygems/test_gem_server.rb
-@@ -100,7 +100,7 @@ def test_latest_specs_gemdirs
- specs_dir = File.join dir, 'specifications'
- FileUtils.mkdir_p specs_dir
-
-- open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
- io.write spec.to_ruby
- end
-
-@@ -198,7 +198,7 @@ def test_quick_gemdirs
-
- FileUtils.mkdir_p specs_dir
-
-- open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
- io.write spec.to_ruby
- end
-
-@@ -339,7 +339,7 @@ def test_root_gemdirs
- specs_dir = File.join dir, 'specifications'
- FileUtils.mkdir_p specs_dir
-
-- open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
- io.write spec.to_ruby
- end
-
-@@ -353,6 +353,171 @@ def test_root_gemdirs
- assert_match 'z 9', @res.body
- end
-
-+
-+ def test_xss_homepage_fix_289313
-+ data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
-+ dir = "#{@gemhome}2"
-+
-+ spec = util_spec 'xsshomepagegem', 1
-+ spec.homepage = "javascript:confirm(document.domain)"
-+
-+ specs_dir = File.join dir, 'specifications'
-+ FileUtils.mkdir_p specs_dir
-+
-+ open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ io.write spec.to_ruby
-+ end
-+
-+ server = Gem::Server.new dir, process_based_port, false
-+
-+ @req.parse data
-+
-+ server.root @req, @res
-+
-+ assert_equal 200, @res.status
-+ assert_match 'xsshomepagegem 1', @res.body
-+
-+ # This verifies that the homepage for this spec is not displayed and is set to
".", because it's not a
-+ # valid HTTP/HTTPS URL and could be unsafe in an HTML context. We would prefer to
throw an exception here,
-+ # but spec.homepage is currently free form and not currently required to be a URL,
this behavior may be
-+ # validated in future versions of Gem::Specification.
-+ #
-+ # There are two variant we're checking here, one where rdoc is not present, and
one where rdoc is present in the same regex:
-+ #
-+ # Variant #1 - rdoc not installed
-+ #
-+ # <b>xsshomepagegem 1</b>
-+ #
-+ #
-+ # <span title="rdoc not installed">[rdoc]</span>
-+ #
-+ #
-+ #
-+ # <a href="." title=".">[www]</a>
-+ #
-+ # Variant #2 - rdoc installed
-+ #
-+ # <b>xsshomepagegem 1</b>
-+ #
-+ #
-+ # <a href="\/doc_root\/xsshomepagegem-1\/">\[rdoc\]<\/a>
-+ #
-+ #
-+ #
-+ # <a href="." title=".">[www]</a>
-+ regex_match = /xsshomepagegem 1<\/b>[\n\s]+(<span title="rdoc not
installed">\[rdoc\]<\/span>|<a
href="\/doc_root\/xsshomepagegem-1\/">\[rdoc\]<\/a>)[\n\s]+<a
href="\." title="\.">\[www\]<\/a>/
-+ assert_match regex_match, @res.body
-+ end
-+
-+ def test_invalid_homepage
-+ data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
-+ dir = "#{@gemhome}2"
-+
-+ spec = util_spec 'invalidhomepagegem', 1
-+ spec.homepage = "notavalidhomepageurl"
-+
-+ specs_dir = File.join dir, 'specifications'
-+ FileUtils.mkdir_p specs_dir
-+
-+ open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ io.write spec.to_ruby
-+ end
-+
-+ server = Gem::Server.new dir, process_based_port, false
-+
-+ @req.parse data
-+
-+ server.root @req, @res
-+
-+ assert_equal 200, @res.status
-+ assert_match 'invalidhomepagegem 1', @res.body
-+
-+ # This verifies that the homepage for this spec is not displayed and is set to
".", because it's not a
-+ # valid HTTP/HTTPS URL and could be unsafe in an HTML context. We would prefer to
throw an exception here,
-+ # but spec.homepage is currently free form and not currently required to be a URL,
this behavior may be
-+ # validated in future versions of Gem::Specification.
-+ #
-+ # There are two variant we're checking here, one where rdoc is not present, and
one where rdoc is present in the same regex:
-+ #
-+ # Variant #1 - rdoc not installed
-+ #
-+ # <b>invalidhomepagegem 1</b>
-+ #
-+ #
-+ # <span title="rdoc not installed">[rdoc]</span>
-+ #
-+ #
-+ #
-+ # <a href="." title=".">[www]</a>
-+ #
-+ # Variant #2 - rdoc installed
-+ #
-+ # <b>invalidhomepagegem 1</b>
-+ #
-+ #
-+ # <a href="\/doc_root\/invalidhomepagegem-1\/">\[rdoc\]<\/a>
-+ #
-+ #
-+ #
-+ # <a href="." title=".">[www]</a>
-+ regex_match = /invalidhomepagegem 1<\/b>[\n\s]+(<span title="rdoc not
installed">\[rdoc\]<\/span>|<a
href="\/doc_root\/invalidhomepagegem-1\/">\[rdoc\]<\/a>)[\n\s]+<a
href="\." title="\.">\[www\]<\/a>/
-+ assert_match regex_match, @res.body
-+ end
-+
-+ def test_valid_homepage_http
-+ data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
-+ dir = "#{@gemhome}2"
-+
-+ spec = util_spec 'validhomepagegemhttp', 1
-+ spec.homepage = "http://rubygems.org"
-+
-+ specs_dir = File.join dir, 'specifications'
-+ FileUtils.mkdir_p specs_dir
-+
-+ open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ io.write spec.to_ruby
-+ end
-+
-+ server = Gem::Server.new dir, process_based_port, false
-+
-+ @req.parse data
-+
-+ server.root @req, @res
-+
-+ assert_equal 200, @res.status
-+ assert_match 'validhomepagegemhttp 1', @res.body
-+
-+ regex_match = /validhomepagegemhttp 1<\/b>[\n\s]+(<span title="rdoc
not installed">\[rdoc\]<\/span>|<a
href="\/doc_root\/validhomepagegemhttp-1\/">\[rdoc\]<\/a>)[\n\s]+<a
href="http:\/\/rubygems\.org"
title="http:\/\/rubygems\.org">\[www\]<\/a>/
-+ assert_match regex_match, @res.body
-+ end
-+
-+ def test_valid_homepage_https
-+ data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
-+ dir = "#{@gemhome}2"
-+
-+ spec = util_spec 'validhomepagegemhttps', 1
-+ spec.homepage = "https://rubygems.org"
-+
-+ specs_dir = File.join dir, 'specifications'
-+ FileUtils.mkdir_p specs_dir
-+
-+ open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ io.write spec.to_ruby
-+ end
-+
-+ server = Gem::Server.new dir, process_based_port, false
-+
-+ @req.parse data
-+
-+ server.root @req, @res
-+
-+ assert_equal 200, @res.status
-+ assert_match 'validhomepagegemhttps 1', @res.body
-+
-+ regex_match = /validhomepagegemhttps 1<\/b>[\n\s]+(<span title="rdoc
not installed">\[rdoc\]<\/span>|<a
href="\/doc_root\/validhomepagegemhttps-1\/">\[rdoc\]<\/a>)[\n\s]+<a
href="https:\/\/rubygems\.org"
title="https:\/\/rubygems\.org">\[www\]<\/a>/
-+ assert_match regex_match, @res.body
-+ end
-+
- def test_specs
- data = StringIO.new "GET /specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
- @req.parse data
-@@ -378,7 +543,7 @@ def test_specs_gemdirs
- specs_dir = File.join dir, 'specifications'
- FileUtils.mkdir_p specs_dir
-
-- open File.join(specs_dir, spec.spec_name), 'w' do |io|
-+ File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
- io.write spec.to_ruby
- end
-
-diff --git test/rubygems/test_gem_source.rb test/rubygems/test_gem_source.rb
-index 4a93e222f8..8805a9b404 100644
---- test/rubygems/test_gem_source.rb
-+++ test/rubygems/test_gem_source.rb
-@@ -110,7 +110,7 @@ def test_fetch_spec_cached
-
- cache_file = File.join cache_dir, a1.spec_name
-
-- open cache_file, 'wb' do |io|
-+ File.open cache_file, 'wb' do |io|
- Marshal.dump a1, io
- end
-
-@@ -163,7 +163,7 @@ def test_load_specs_cached
-
- cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
-
-- open cache_file, 'wb' do |io|
-+ File.open cache_file, 'wb' do |io|
- Marshal.dump latest_specs, io
- end
-
-@@ -187,7 +187,7 @@ def test_load_specs_cached_empty
-
- cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
-
-- open cache_file, 'wb' do |io|
-+ File.open cache_file, 'wb' do |io|
- # Setup invalid data in the cache:
- io.write Marshal.dump(latest_specs)[0, 10]
- end
-diff --git test/rubygems/test_gem_source_git.rb test/rubygems/test_gem_source_git.rb
-index 0e13a11e7e..8f5d3ee745 100644
---- test/rubygems/test_gem_source_git.rb
-+++ test/rubygems/test_gem_source_git.rb
-@@ -229,7 +229,7 @@ def test_specs
- Dir.chdir 'b' do
- b = Gem::Specification.new 'b', 1
-
-- open 'b.gemspec', 'w' do |io|
-+ File.open 'b.gemspec', 'w' do |io|
- io.write b.to_ruby
- end
-
-diff --git test/rubygems/test_gem_specification.rb
test/rubygems/test_gem_specification.rb
-index bb6acbc7de..badb297eee 100644
---- test/rubygems/test_gem_specification.rb
-+++ test/rubygems/test_gem_specification.rb
-@@ -922,7 +922,7 @@ def test_self_load
- end
-
- def test_self_load_relative
-- open 'a-2.gemspec', 'w' do |io|
-+ File.open 'a-2.gemspec', 'w' do |io|
- io.write @a2.to_ruby_for_cache
- end
-
-@@ -948,6 +948,9 @@ def test_self_load_tainted
- @a2.files.clear
-
- assert_equal @a2, spec
-+
-+ ensure
-+ $SAFE = 0
- end
-
- def test_self_load_escape_curly
-@@ -1111,7 +1114,7 @@ def test_self_remove_spec
- end
-
- def test_self_remove_spec_removed
-- open @a1.spec_file, 'w' do |io|
-+ File.open @a1.spec_file, 'w' do |io|
- io.write @a1.to_ruby
- end
-
-@@ -1363,13 +1366,13 @@ def test_build_args
-
- assert_empty @ext.build_args
-
-- open @ext.build_info_file, 'w' do |io|
-+ File.open @ext.build_info_file, 'w' do |io|
- io.puts
- end
-
- assert_empty @ext.build_args
-
-- open @ext.build_info_file, 'w' do |io|
-+ File.open @ext.build_info_file, 'w' do |io|
- io.puts '--with-foo-dir=wherever'
- end
-
-@@ -1385,9 +1388,9 @@ def test_build_extensions
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-@@ -1435,9 +1438,9 @@ def test_build_extensions_default_gem
- extconf_rb = File.join spec.gem_dir, spec.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
- end
-@@ -1461,6 +1464,7 @@ def test_build_extensions_error
-
- def test_build_extensions_extensions_dir_unwritable
- skip 'chmod not supported' if Gem.win_platform?
-+ skip 'skipped in root privilege' if Process.uid.zero?
-
- ext_spec
-
-@@ -1469,9 +1473,9 @@ def test_build_extensions_extensions_dir_unwritable
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-@@ -1486,7 +1490,7 @@ def test_build_extensions_extensions_dir_unwritable
- @ext.build_extensions
- refute_path_exists @ext.extension_dir
- ensure
-- unless ($DEBUG or win_platform?) then
-+ unless ($DEBUG or win_platform? or Process.uid.zero?) then
- FileUtils.chmod 0755, File.join((a)ext.base_dir, 'extensions')
- FileUtils.chmod 0755, @ext.base_dir
- end
-@@ -1502,9 +1506,9 @@ def test_build_extensions_no_extensions_dir_unwritable
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-@@ -1551,9 +1555,9 @@ def test_build_extensions_preview
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-@@ -2882,7 +2886,22 @@ def test_validate_homepage
- @a1.validate
- end
-
-- assert_equal '"over at my cool site" is not a URI', e.message
-+ assert_equal '"over at my cool site" is not a valid HTTP URI',
e.message
-+
-+ @a1.homepage = 'ftp://rubygems.org'
-+
-+ e = assert_raises Gem::InvalidSpecificationException do
-+ @a1.validate
-+ end
-+
-+ assert_equal '"ftp://rubygems.org" is not a valid HTTP URI',
e.message
-+
-+ @a1.homepage = 'http://rubygems.org'
-+ assert_equal true, @a1.validate
-+
-+ @a1.homepage = 'https://rubygems.org'
-+ assert_equal true, @a1.validate
-+
- end
- end
-
-@@ -3418,9 +3437,9 @@ def test_missing_extensions_eh
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-diff --git test/rubygems/test_gem_stub_specification.rb
test/rubygems/test_gem_stub_specification.rb
-index 43680265c7..f9a3a236c0 100644
---- test/rubygems/test_gem_stub_specification.rb
-+++ test/rubygems/test_gem_stub_specification.rb
-@@ -127,9 +127,9 @@ def test_missing_extensions_eh
- extconf_rb = File.join s.gem_dir, s.extensions.first
- FileUtils.mkdir_p File.dirname extconf_rb
-
-- open extconf_rb, 'w' do |f|
-+ File.open extconf_rb, 'w' do |f|
- f.write <<-'RUBY'
-- open 'Makefile', 'w' do |f|
-+ File.open 'Makefile', 'w' do |f|
- f.puts "clean:\n\techo clean"
- f.puts "default:\n\techo built"
- f.puts "install:\n\techo installed"
-@@ -149,7 +149,7 @@ def test_missing_extensions_eh_default_gem
- spec = new_default_spec 'default', 1
- spec.extensions << 'extconf.rb'
-
-- open spec.loaded_from, 'w' do |io|
-+ File.open spec.loaded_from, 'w' do |io|
- io.write spec.to_ruby_for_cache
- end
-
-@@ -198,7 +198,7 @@ def test_to_spec_missing_extensions
-
- def stub_with_version
- spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
-- open spec, 'w' do |io|
-+ File.open spec, 'w' do |io|
- io.write <<-STUB
- # -*- encoding: utf-8 -*-
- # stub: stub_v 2 ruby lib
-@@ -221,7 +221,7 @@ def stub_with_version
-
- def stub_without_version
- spec = File.join @gemhome, 'specifications', 'stub-2.gemspec'
-- open spec, 'w' do |io|
-+ File.open spec, 'w' do |io|
- io.write <<-STUB
- # -*- encoding: utf-8 -*-
- # stub: stub_v ruby lib
-@@ -245,7 +245,7 @@ def stub_without_version
-
- def stub_with_extension
- spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
-- open spec, 'w' do |io|
-+ File.open spec, 'w' do |io|
- io.write <<-STUB
- # -*- encoding: utf-8 -*-
- # stub: stub_e 2 ruby lib
-@@ -271,7 +271,7 @@ def stub_with_extension
-
- def stub_without_extension
- spec = File.join @gemhome, 'specifications', 'stub-2.gemspec'
-- open spec, 'w' do |io|
-+ File.open spec, 'w' do |io|
- io.write <<-STUB
- # -*- encoding: utf-8 -*-
- # stub: stub 2 ruby lib
-diff --git test/rubygems/test_gem_util.rb test/rubygems/test_gem_util.rb
-index b85db44d51..3b7887d931 100644
---- test/rubygems/test_gem_util.rb
-+++ test/rubygems/test_gem_util.rb
-@@ -5,6 +5,7 @@
- class TestGemUtil < Gem::TestCase
-
- def test_class_popen
-+ skip "MJIT executes process and it's caught by Process.wait(-1)" if
defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
- assert_equal "0\n", Gem::Util.popen(Gem.ruby, '-e', 'p
0')
-
- assert_raises Errno::ECHILD do
-@@ -29,6 +30,30 @@ def test_traverse_parents
- loop { break if enum.next.nil? } # exhaust the enumerator
- end
-
-+ def test_traverse_parents_does_not_crash_on_permissions_error
-+ skip 'skipped on MS Windows (chmod has no effect)' if win_platform?
-+
-+ FileUtils.mkdir_p 'd/e/f'
-+ # remove 'execute' permission from "e" directory and make it
-+ # impossible to cd into it and its children
-+ FileUtils.chmod(0666, 'd/e')
-+
-+ paths = Gem::Util.traverse_parents('d/e/f').to_a
-+
-+ assert_equal File.join(@tempdir, 'd'), paths[0]
-+ assert_equal @tempdir, paths[1]
-+ if File.respond_to?(:realpath)
-+ assert_equal File.realpath(Dir.tmpdir), paths[2]
-+ assert_equal File.realpath("..", Dir.tmpdir), paths[3]
-+ elsif RUBY_PLATFORM !~ /darwin/
-+ assert_equal Dir.tmpdir, paths[2]
-+ assert_equal '/', paths[3]
-+ end
-+ ensure
-+ # restore default permissions, allow the directory to be removed
-+ FileUtils.chmod(0775, 'd/e') unless win_platform?
-+ end
-+
- def test_linked_list_find
- list = [1,2,3,4,5].inject(Gem::List.new(0)) { |m,o|
- Gem::List.new o, m
-diff --git test/rubygems/test_gem_version.rb test/rubygems/test_gem_version.rb
-index 56c818663e..792ad5f084 100644
---- test/rubygems/test_gem_version.rb
-+++ test/rubygems/test_gem_version.rb
-@@ -2,6 +2,8 @@
- require 'rubygems/test_case'
- require "rubygems/version"
-
-+require "minitest/benchmark"
-+
- class TestGemVersion < Gem::TestCase
-
- class V < ::Gem::Version
-@@ -102,6 +104,15 @@ def test_initialize_invalid
- end
- end
-
-+ def bench_anchored_version_pattern
-+ assert_performance_linear 0.5 do |count|
-+ version_string = count.times.map {|i| "0" * i.succ }.join(".")
<< "."
-+ version_string =~ Gem::Version::ANCHORED_VERSION_PATTERN
-+ end
-+ rescue RegexpError
-+ skip "It fails to allocate the memory for regex pattern of
Gem::Version::ANCHORED_VERSION_PATTERN"
-+ end
-+
- def test_empty_version
- ["", " ", " "].each do |empty|
- assert_equal "0", Gem::Version.new(empty).version
-diff --git test/rubygems/test_require.rb test/rubygems/test_require.rb
-index a846f46833..e292ce226d 100644
---- test/rubygems/test_require.rb
-+++ test/rubygems/test_require.rb
-@@ -38,18 +38,6 @@ def assert_require(path)
- assert require(path), "'#{path}' was already required"
- end
-
-- def append_latch spec
-- dir = spec.gem_dir
-- Dir.chdir dir do
-- spec.files.each do |file|
-- File.open file, 'a' do |fp|
-- fp.puts "FILE_ENTERED_LATCH.release"
-- fp.puts "FILE_EXIT_LATCH.await"
-- end
-- end
-- end
-- end
--
- # Providing -I on the commandline should always beat gems
- def test_dash_i_beats_gems
- a1 = new_spec "a", "1", {"b" => "= 1"},
"lib/test_gem_require_a.rb"
-@@ -80,6 +68,17 @@ def test_dash_i_beats_gems
- Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
- end
-
-+ def create_sync_thread
-+ Thread.new do
-+ begin
-+ yield
-+ ensure
-+ FILE_ENTERED_LATCH.release
-+ FILE_EXIT_LATCH.await
-+ end
-+ end
-+ end
-+
- def test_concurrent_require
- skip 'deadlock' if /^1\.8\./ =~ RUBY_VERSION
-
-@@ -91,11 +90,8 @@ def test_concurrent_require
-
- install_specs a1, b1
-
-- append_latch a1
-- append_latch b1
--
-- t1 = Thread.new { assert_require 'a' }
-- t2 = Thread.new { assert_require 'b' }
-+ t1 = create_sync_thread{ assert_require 'a' }
-+ t2 = create_sync_thread{ assert_require 'b' }
-
- # wait until both files are waiting on the exit latch
- FILE_ENTERED_LATCH.await
-@@ -106,10 +102,8 @@ def test_concurrent_require
- assert t1.join, "thread 1 should exit"
- assert t2.join, "thread 2 should exit"
- ensure
-- return if $! # skipping
--
-- Object.send :remove_const, :FILE_ENTERED_LATCH
-- Object.send :remove_const, :FILE_EXIT_LATCH
-+ Object.send :remove_const, :FILE_ENTERED_LATCH if Object.const_defined?
:FILE_ENTERED_LATCH
-+ Object.send :remove_const, :FILE_EXIT_LATCH if Object.const_defined?
:FILE_EXIT_LATCH
- end
-
- def test_require_is_not_lazy_with_exact_req
diff --git a/sources b/sources
index a289e4c..7ef486c 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (ruby-2.5.0.tar.xz) =
55714a33d7661fe8b432f73c34fd67b49699f8b79df1cbd680a74899124d31111ab0f444677672aac1ba725820182940d485efb2db0bf2bc96737c5d40c54578
+SHA512 (ruby-2.5.1.tar.xz) =
31bacf58469953282cd5d8b51862dcf4b84dedb927c1871bc3fca32fc157fe49187631575a70838705fe246f4555647577a7ecc26894445a7d64de5503dc11b4