mirror of
https://github.com/ruby/ruby.git
synced 2025-09-20 02:53:57 +02:00
Backport r35374 and r35375
* lib/rubygems: Update to RubyGems 1.8.22 plus r33517 and r35337 which were ported to the rubygems git repository. See https://github.com/rubygems/rubygems/blob/1.8/History.txt for changes since 1.8.11. * test/rubygems: ditto. * lib/rubygems/version.rb: Fixed init_with warning by calling into yaml_initialize (for syck) from psych's init_with git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@35402 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b51081308b
commit
de280961df
37 changed files with 1190 additions and 153 deletions
|
@ -262,18 +262,19 @@ class Gem::Specification
|
|||
|
||||
def self._all # :nodoc:
|
||||
unless defined?(@@all) && @@all then
|
||||
specs = []
|
||||
specs = {}
|
||||
|
||||
self.dirs.reverse_each { |dir|
|
||||
self.dirs.each { |dir|
|
||||
Dir[File.join(dir, "*.gemspec")].each { |path|
|
||||
spec = Gem::Specification.load path.untaint
|
||||
# #load returns nil if the spec is bad, so we just ignore
|
||||
# it at this stage
|
||||
specs << spec if spec
|
||||
specs[spec.full_name] ||= spec if spec
|
||||
}
|
||||
}
|
||||
|
||||
@@all = specs
|
||||
@@all = specs.values
|
||||
|
||||
_resort!
|
||||
end
|
||||
@@all
|
||||
|
@ -484,6 +485,8 @@ class Gem::Specification
|
|||
# +input+ can be anything that YAML.load() accepts: String or IO.
|
||||
|
||||
def self.from_yaml(input)
|
||||
Gem.load_yaml
|
||||
|
||||
input = normalize_yaml_input input
|
||||
spec = YAML.load input
|
||||
|
||||
|
@ -535,7 +538,7 @@ class Gem::Specification
|
|||
file = file.dup.untaint
|
||||
|
||||
code = if defined? Encoding
|
||||
File.read file, :encoding => "UTF-8"
|
||||
File.read file, :mode => 'r:UTF-8:-'
|
||||
else
|
||||
File.read file
|
||||
end
|
||||
|
@ -663,11 +666,16 @@ class Gem::Specification
|
|||
raise TypeError, "invalid Gem::Specification format #{array.inspect}"
|
||||
end
|
||||
|
||||
# Cleanup any YAML::PrivateType. They only show up for an old bug
|
||||
# where nil => null, so just convert them to nil based on the type.
|
||||
|
||||
array.map! { |e| e.kind_of?(YAML::PrivateType) ? nil : e }
|
||||
|
||||
spec.instance_variable_set :@rubygems_version, array[0]
|
||||
# spec version
|
||||
spec.instance_variable_set :@name, array[2]
|
||||
spec.instance_variable_set :@version, array[3]
|
||||
spec.instance_variable_set :@date, array[4]
|
||||
spec.date = array[4]
|
||||
spec.instance_variable_set :@summary, array[5]
|
||||
spec.instance_variable_set :@required_ruby_version, array[6]
|
||||
spec.instance_variable_set :@required_rubygems_version, array[7]
|
||||
|
@ -756,8 +764,16 @@ class Gem::Specification
|
|||
|
||||
def activate_dependencies
|
||||
self.runtime_dependencies.each do |spec_dep|
|
||||
# TODO: check for conflicts! not just name!
|
||||
next if Gem.loaded_specs.include? spec_dep.name
|
||||
if loaded = Gem.loaded_specs[spec_dep.name]
|
||||
next if spec_dep.matches_spec? loaded
|
||||
|
||||
msg = "can't satisfy '#{spec_dep}', already activated '#{loaded.full_name}'"
|
||||
e = Gem::LoadError.new msg
|
||||
e.name = spec_dep.name
|
||||
|
||||
raise e
|
||||
end
|
||||
|
||||
specs = spec_dep.to_specs
|
||||
|
||||
if specs.size == 1 then
|
||||
|
@ -986,6 +1002,12 @@ class Gem::Specification
|
|||
when String then
|
||||
if /\A(\d{4})-(\d{2})-(\d{2})\Z/ =~ date then
|
||||
Time.utc($1.to_i, $2.to_i, $3.to_i)
|
||||
|
||||
# Workaround for where the date format output from psych isn't
|
||||
# parsed as a Time object by syck and thus comes through as a
|
||||
# string.
|
||||
elsif /\A(\d{4})-(\d{2})-(\d{2}) \d{2}:\d{2}:\d{2}\.\d+?Z\z/ =~ date then
|
||||
Time.utc($1.to_i, $2.to_i, $3.to_i)
|
||||
else
|
||||
raise(Gem::InvalidSpecificationException,
|
||||
"invalid date format in specification: #{date.inspect}")
|
||||
|
@ -1362,7 +1384,7 @@ class Gem::Specification
|
|||
val = other_spec.instance_variable_get(name)
|
||||
if val then
|
||||
instance_variable_set name, val.dup
|
||||
else
|
||||
elsif Gem.configuration.really_verbose
|
||||
warn "WARNING: #{full_name} has an invalid nil value for #{name}"
|
||||
end
|
||||
rescue TypeError
|
||||
|
@ -1912,7 +1934,22 @@ class Gem::Specification
|
|||
|
||||
def to_yaml(opts = {}) # :nodoc:
|
||||
if YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck? then
|
||||
super.gsub(/ !!null \n/, " \n")
|
||||
# Because the user can switch the YAML engine behind our
|
||||
# back, we have to check again here to make sure that our
|
||||
# psych code was properly loaded, and load it if not.
|
||||
unless Gem.const_defined?(:NoAliasYAMLTree)
|
||||
require 'rubygems/psych_tree'
|
||||
end
|
||||
|
||||
builder = Gem::NoAliasYAMLTree.new({})
|
||||
builder << self
|
||||
ast = builder.tree
|
||||
|
||||
io = StringIO.new
|
||||
|
||||
Psych::Visitors::Emitter.new(io).accept(ast)
|
||||
|
||||
io.string.gsub(/ !!null \n/, " \n")
|
||||
else
|
||||
YAML.quick_emit object_id, opts do |out|
|
||||
out.map taguri, to_yaml_style do |map|
|
||||
|
@ -2097,7 +2134,13 @@ class Gem::Specification
|
|||
# FIX: have this handle the platform/new_platform/original_platform bullshit
|
||||
def yaml_initialize(tag, vals) # :nodoc:
|
||||
vals.each do |ivar, val|
|
||||
instance_variable_set "@#{ivar}", val
|
||||
case ivar
|
||||
when "date"
|
||||
# Force Date to go through the extra coerce logic in date=
|
||||
self.date = val.untaint
|
||||
else
|
||||
instance_variable_set "@#{ivar}", val.untaint
|
||||
end
|
||||
end
|
||||
|
||||
@original_platform = @platform # for backwards compatibility
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue