From e2cf71a0858715eb884996b4fc2d6fd39b0c0f8c Mon Sep 17 00:00:00 2001 From: hsbt Date: Fri, 4 Dec 2015 06:21:53 +0000 Subject: [PATCH] * lib/rubygems: Update to RubyGems 2.5.0+ HEAD(fdab4c4). this version includes #1396, #1397, #1398, #1399 * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52880 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 +++++ lib/rubygems/basic_specification.rb | 23 +++++++---------- lib/rubygems/core_ext/kernel_require.rb | 4 +-- lib/rubygems/requirement.rb | 6 ++--- lib/rubygems/specification.rb | 24 ++++++++++++++---- lib/rubygems/stub_specification.rb | 2 ++ .../foo-0.0.1-x86-mswin32.gemspec | Bin 0 -> 269 bytes test/rubygems/test_gem_resolver.rb | 2 +- test/rubygems/test_gem_specification.rb | 15 +++++++++++ test/rubygems/test_gem_stub_specification.rb | 2 +- 10 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec diff --git a/ChangeLog b/ChangeLog index f27faf9c3d..d4a740b7fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Dec 4 15:21:45 2015 SHIBATA Hiroshi + + * lib/rubygems: Update to RubyGems 2.5.0+ HEAD(fdab4c4). + this version includes #1396, #1397, #1398, #1399 + * test/rubygems: ditto. + Fri Dec 4 11:22:40 2015 Nobuyoshi Nakada * thread.c (rb_thread_setname): name must be ascii-compatible, as diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index 3e411f33bc..53beb43402 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -65,22 +65,17 @@ class Gem::BasicSpecification # Return true if this spec can require +file+. def contains_requirable_file? file - @contains_requirable_file ||= {} - @contains_requirable_file[file] ||= - begin - if @ignored then - return false - elsif missing_extensions? then - @ignored = true + if @ignored then + return false + elsif missing_extensions? then + @ignored = true - warn "Ignoring #{full_name} because its extensions are not built. " + - "Try: gem pristine #{name} --version #{version}" - return false - end + warn "Ignoring #{full_name} because its extensions are not built. " + + "Try: gem pristine #{name} --version #{version}" + return false + end - have_file? file, Gem.suffixes - end ? :yes : :no - @contains_requirable_file[file] == :yes + have_file? file, Gem.suffixes end def default_gem? diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb index 0a073adb7b..f9b67ea5a6 100755 --- a/lib/rubygems/core_ext/kernel_require.rb +++ b/lib/rubygems/core_ext/kernel_require.rb @@ -60,9 +60,7 @@ module Kernel #-- # TODO request access to the C implementation of this to speed up RubyGems - spec = Gem::Specification.stubs.find { |s| - s.activated? and s.contains_requirable_file? path - } + spec = Gem::Specification.find_active_stub_by_path path begin RUBYGEMS_ACTIVATION_MONITOR.exit diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index 572bf9673e..de16926573 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -89,9 +89,9 @@ class Gem::Requirement # specification, like ">= 1.2", or a simple version number, # like "1.2". # - # parse("> 1.0") # => [">", "1.0"] - # parse("1.0") # => ["=", "1.0"] - # parse(Gem::Version.new("1.0")) # => ["=, "1.0"] + # parse("> 1.0") # => [">", Gem::Version.new("1.0")] + # parse("1.0") # => ["=", Gem::Version.new("1.0")] + # parse(Gem::Version.new("1.0")) # => ["=, Gem::Version.new("1.0")] def self.parse obj return ["=", obj] if Gem::Version === obj diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 1be285e4ef..50c27aa272 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -175,6 +175,11 @@ class Gem::Specification < Gem::BasicSpecification @@stubs_by_name = {} + # Sentinel object to represent "not found" stubs + NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc: + @@spec_with_requirable_file = {} + @@active_stub_with_requirable_file = {} + ###################################################################### # :section: Required gemspec attributes @@ -1027,10 +1032,10 @@ class Gem::Specification < Gem::BasicSpecification def self.find_by_path path path = path.dup.freeze - stub = stubs.find { |spec| - spec.contains_requirable_file? path - } - stub && stub.to_spec + spec = @@spec_with_requirable_file[path] ||= (stubs.find { |s| + s.contains_requirable_file? path + } || NOT_FOUND) + spec.to_spec end ## @@ -1044,6 +1049,13 @@ class Gem::Specification < Gem::BasicSpecification stub && stub.to_spec end + def self.find_active_stub_by_path path + stub = @@active_stub_with_requirable_file[path] ||= (stubs.find { |s| + s.activated? and s.contains_requirable_file? path + } || NOT_FOUND) + stub.this + end + ## # Return currently unresolved specs that contain the file matching +path+. @@ -1261,6 +1273,8 @@ class Gem::Specification < Gem::BasicSpecification @@all = nil @@stubs = nil @@stubs_by_name = {} + @@spec_with_requirable_file = {} + @@active_stub_with_requirable_file = {} _clear_load_cache unresolved = unresolved_deps unless unresolved.empty? then @@ -2847,7 +2861,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use: end warning_messages << "prerelease dependency on #{dep} is not recommended" if - prerelease_dep + prerelease_dep && !version.prerelease? overly_strict = dep.requirement.requirements.length == 1 && dep.requirement.requirements.any? do |op, version| diff --git a/lib/rubygems/stub_specification.rb b/lib/rubygems/stub_specification.rb index 7ba0964d15..482a75bd48 100644 --- a/lib/rubygems/stub_specification.rb +++ b/lib/rubygems/stub_specification.rb @@ -88,6 +88,8 @@ class Gem::StubSpecification < Gem::BasicSpecification end end + def this; self; end + def default_gem? @default_gem end diff --git a/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec b/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec new file mode 100644 index 0000000000000000000000000000000000000000..7fbc56429fba475c21ea03d9bfc6badd0a9bd862 GIT binary patch literal 269 zcmYL^%L>9U5Jg?*D=z6y>_gp1!G$Y7z@>=9cA^23)Ff34{dm(>G%y6_FmvuCNarcY zRJK;;TA~dy-3&dJz=!ryLRyO=E3zfDe<`zG;jS*TSh<9?IlTj8d(vfjXsA+BRU#;B zGD9!a7QOEo;4>pM;rF)SaV;OolbnwOUlz$In^)a^<>=gqaP!#W h$YUzL!0`RT@zZGWt=7VIf6ES0+>O^=NpnV~W*?5vOtAm} literal 0 HcmV?d00001 diff --git a/test/rubygems/test_gem_resolver.rb b/test/rubygems/test_gem_resolver.rb index c4b5251c82..a944a69d9a 100644 --- a/test/rubygems/test_gem_resolver.rb +++ b/test/rubygems/test_gem_resolver.rb @@ -516,7 +516,7 @@ class TestGemResolver < Gem::TestCase dependency = e.conflict.dependency - assert_equal 'a', dependency.name + assert_includes %w(a b), dependency.name assert_equal req('>= 0'), dependency.requirement activated = e.conflict.activated diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 1ca2046195..6c7ee6054a 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -2678,6 +2678,21 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: end end + def test_validate_prerelease_dependencies_with_prerelease_version + util_setup_validate + + Dir.chdir @tempdir do + @a1.version = '1.0.0.beta.1' + @a1.add_runtime_dependency 'b', '~> 1.2.0.beta.1' + + use_ui @ui do + @a1.validate + end + + assert_equal '', @ui.error, 'warning' + end + end + def test_validate_description util_setup_validate diff --git a/test/rubygems/test_gem_stub_specification.rb b/test/rubygems/test_gem_stub_specification.rb index 5488adc348..786a308556 100644 --- a/test/rubygems/test_gem_stub_specification.rb +++ b/test/rubygems/test_gem_stub_specification.rb @@ -3,7 +3,7 @@ require "rubygems/stub_specification" class TestStubSpecification < Gem::TestCase SPECIFICATIONS = File.expand_path(File.join("..", "specifications"), __FILE__) - FOO = File.join SPECIFICATIONS, "foo-0.0.1.gemspec" + FOO = File.join SPECIFICATIONS, "foo-0.0.1-x86-mswin32.gemspec" BAR = File.join SPECIFICATIONS, "bar-0.0.2.gemspec" def setup