diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | lib/rubygems/basic_specification.rb | 25 | ||||
-rwxr-xr-x | lib/rubygems/core_ext/kernel_require.rb | 4 | ||||
-rw-r--r-- | lib/rubygems/requirement.rb | 6 | ||||
-rw-r--r-- | lib/rubygems/specification.rb | 24 | ||||
-rw-r--r-- | lib/rubygems/stub_specification.rb | 2 | ||||
-rw-r--r-- | test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec | bin | 0 -> 269 bytes | |||
-rw-r--r-- | test/rubygems/test_gem_resolver.rb | 2 | ||||
-rw-r--r-- | test/rubygems/test_gem_specification.rb | 15 | ||||
-rw-r--r-- | test/rubygems/test_gem_stub_specification.rb | 2 |
10 files changed, 58 insertions, 28 deletions
@@ -1,3 +1,9 @@ +Fri Dec 4 15:21:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org> + + * 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 <nobu@ruby-lang.org> * 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 - - warn "Ignoring #{full_name} because its extensions are not built. " + - "Try: gem pristine #{name} --version #{version}" - return false - end + 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 - 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 <tt>">= 1.2"</tt>, or a simple version number, # like <tt>"1.2"</tt>. # - # 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 Binary files differnew file mode 100644 index 0000000000..7fbc56429f --- /dev/null +++ b/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec 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 |