Bug #14481 » rubygems-276-for-ruby25.patch
| lib/rubygems.rb | ||
|---|---|---|
| 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 | ||
| ... | ... | |
|   # 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 | ||
| ... | ... | |
|   # 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 | ||
| ... | ... | |
|   # 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 | ||
| lib/rubygems/commands/generate_index_command.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/commands/owner_command.rb | ||
|---|---|---|
|     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| | ||
| lib/rubygems/commands/setup_command.rb | ||
|---|---|---|
|   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`/, "''") } | ||
| ... | ... | |
|     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' | ||
| lib/rubygems/commands/unpack_command.rb | ||
|---|---|---|
|         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 | ||
| ... | ... | |
|     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 | ||
| lib/rubygems/config_file.rb | ||
|---|---|---|
|   # 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 | ||
| lib/rubygems/ext/builder.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/indexer.rb | ||
|---|---|---|
| require 'rubygems' | ||
| require 'rubygems/package' | ||
| require 'time' | ||
| require 'tmpdir' | ||
| begin | ||
|   gem 'builder' | ||
| ... | ... | |
|     @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}" | ||
| ... | ... | |
|         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 | ||
| ... | ... | |
|     zipped = Gem.deflate data | ||
|     open "#{filename}.#{extension}", 'wb' do |io| | ||
|     File.open "#{filename}.#{extension}", 'wb' do |io| | ||
|       io.write zipped | ||
|     end | ||
|   end | ||
| ... | ... | |
|     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 | ||
| lib/rubygems/installer.rb | ||
|---|---|---|
|     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 | ||
| ... | ... | |
|   # 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 | ||
| ... | ... | |
|   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| | ||
| ... | ... | |
|     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 | ||
| lib/rubygems/package.rb | ||
|---|---|---|
|       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 | ||
| ... | ... | |
|             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? | ||
| ... | ... | |
|     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+ | ||
| ... | ... | |
|       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 | ||
|   ## | ||
| ... | ... | |
|     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' | ||
| lib/rubygems/package/file_source.rb | ||
|---|---|---|
|   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 | ||
| lib/rubygems/package/old.rb | ||
|---|---|---|
|         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 | ||
| lib/rubygems/package/tar_header.rb | ||
|---|---|---|
|     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+ | ||
| lib/rubygems/package/tar_writer.rb | ||
|---|---|---|
|       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 | ||
| lib/rubygems/request_set/lockfile.rb | ||
|---|---|---|
|   def write | ||
|     content = to_s | ||
|     open "#{@gem_deps_file}.lock", 'w' do |io| | ||
|     File.open "#{@gem_deps_file}.lock", 'w' do |io| | ||
|       io.write content | ||
|     end | ||
|   end | ||
| lib/rubygems/security.rb | ||
|---|---|---|
|   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 | ||
| lib/rubygems/security/trust_dir.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/server.rb | ||
|---|---|---|
|       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, | ||
| ... | ... | |
|         "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?, | ||
| lib/rubygems/source.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/specification.rb | ||
|---|---|---|
| require 'rubygems/stub_specification' | ||
| require 'rubygems/util/list' | ||
| require 'stringio' | ||
| require 'uri' | ||
| ## | ||
| # The Specification class contains the information for a Gem.  Typically | ||
| ... | ... | |
|       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 | ||
| lib/rubygems/stub_specification.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/test_case.rb | ||
|---|---|---|
|     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 | ||
| ... | ... | |
|   # 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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|       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 | ||
| lib/rubygems/test_utilities.rb | ||
|---|---|---|
|   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 | ||
| lib/rubygems/util.rb | ||
|---|---|---|
|     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 | ||
| lib/rubygems/validator.rb | ||
|---|---|---|
|   # 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 | ||
| ... | ... | |
|         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| | ||
| ... | ... | |
|               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 | ||
| test/rubygems/test_gem.rb | ||
|---|---|---|
| require 'tmpdir' | ||
| # TODO: push this up to test_case.rb once battle tested | ||
| $SAFE=1 | ||
| $LOAD_PATH.map! do |path| | ||
|   path.dup.untaint | ||
| end | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|   end | ||
|   def test_self_read_binary | ||
|     open 'test', 'w' do |io| | ||
|     File.open 'test', 'w' do |io| | ||
|       io.write "\xCF\x80" | ||
|     end | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     refute spec.activated? | ||
|     open 'gem.deps.rb', 'w' do |io| | ||
|     File.open 'gem.deps.rb', 'w' do |io| | ||
|       io.write 'gem "a"' | ||
|     end | ||
| ... | ... | |
|     refute spec.activated? | ||
|     open 'Gemfile', 'w' do |io| | ||
|     File.open 'Gemfile', 'w' do |io| | ||
|       io.write 'gem "a"' | ||
|     end | ||
| ... | ... | |
|     refute spec.activated? | ||
|     open 'gem.deps.rb', 'w' do |io| | ||
|     File.open 'gem.deps.rb', 'w' do |io| | ||
|       io.write 'gem "a"' | ||
|     end | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| test/rubygems/test_gem_commands_cleanup_command.rb | ||
|---|---|---|
|     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] | ||
| test/rubygems/test_gem_commands_install_command.rb | ||
|---|---|---|
|   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 | ||
| test/rubygems/test_gem_commands_owner_command.rb | ||
|---|---|---|
|     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@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@example.com\n" | ||
|     host = "http://rubygems.example" | ||
| test/rubygems/test_gem_commands_push_command.rb | ||
|---|---|---|
|     } | ||
|     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 | ||
| ... | ... | |
|     } | ||
|     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 | ||
| ... | ... | |
|     } | ||
|     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 | ||
| ... | ... | |
|     } | ||
|     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 | ||
| ... | ... | |
|     } | ||
|     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 | ||
| test/rubygems/test_gem_commands_setup_command.rb | ||
|---|---|---|
| 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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     @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 | ||
| test/rubygems/test_gem_commands_uninstall_command.rb | ||
|---|---|---|
|     # 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] | ||
| ... | ... | |
|     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 | ||
| test/rubygems/test_gem_dependency_installer.rb | ||
|---|---|---|
|     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' | ||
| test/rubygems/test_gem_doctor.rb | ||
|---|---|---|
|     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 | ||
| ... | ... | |
|     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 | ||
| test/rubygems/test_gem_ext_builder.rb | ||
|---|---|---|
|     results = [] | ||
|     Dir.chdir @ext do | ||
|       open 'Makefile', 'w' do |io| | ||
|       File.open 'Makefile', 'w' do |io| | ||
|         io.puts <<-MAKEFILE | ||
| all: | ||
| \t@#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}" | ||
| ... | ... | |
|     results = [] | ||
|     Dir.chdir @ext do | ||
|       open 'Makefile', 'w' do |io| | ||
|       File.open 'Makefile', 'w' do |io| | ||
|         io.puts <<-MAKEFILE | ||
| all: | ||
| \t@#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}" | ||
| ... | ... | |
|     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' | ||
| ... | ... | |
|     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' | ||
| ... | ... | |
|     FileUtils.mkdir_p @spec.gem_dir | ||
|     open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f| | ||
|     File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f| | ||
|       f.write <<-'RUBY' | ||
|         puts "IN EXTCONF" | ||
|         extconf_args = File.join File.dirname(__FILE__), 'extconf_args' | ||
| ... | ... | |
|     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| | ||
|       io.puts '--with-foo-dir=/nonexistent' | ||
|     end | ||
| test/rubygems/test_gem_gem_runner.rb | ||
|---|---|---|
| # 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 | ||
| test/rubygems/test_gem_gemcutter_utilities.rb | ||
|---|---|---|
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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'] | ||
| test/rubygems/test_gem_indexer.rb | ||
|---|---|---|
|   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 | ||
| test/rubygems/test_gem_install_update_options.rb | ||
|---|---|---|
|   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] | ||
| test/rubygems/test_gem_installer.rb | ||
|---|---|---|
|       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 | ||
| # | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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 | ||
| test/rubygems/test_gem_package.rb | ||
|---|---|---|
|   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 | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|     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') | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|     FileUtils.mkdir 'lib' | ||
|     open 'lib/code.rb', 'w' do |io| | ||
|     File.open 'lib/code.rb', 'w' do |io| | ||
|       io.write '# lib/code.rb' | ||
|     end | ||
| ... | ... | |
|       end | ||
|     end | ||
|     open 'empty.gem', 'wb' do |io| | ||
|     File.open 'empty.gem', 'wb' do |io| | ||
|       io.write gem.string | ||
|     end | ||
| ... | ... | |
|                  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 | ||
| ... | ... | |
|                  "#{@destination} is not allowed", e.message) | ||
|   end | ||
|   def test_install_location_suffix | ||
|     package = Gem::Package.new @gem | ||
|     filename = "../#{File.basename(@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 | ||
| ... | ... | |
|       end | ||
|     end | ||
|     open 'mismatch.gem', 'wb' do |io| | ||
|     File.open 'mismatch.gem', 'wb' do |io| | ||
|       io.write gem.string | ||
|     end | ||
| ... | ... | |
|       end | ||
|     end | ||
|     open 'data_checksum_missing.gem', 'wb' do |io| | ||
|     File.open 'data_checksum_missing.gem', 'wb' do |io| | ||
|       io.write gem.string | ||
|     end | ||
| ... | ... | |
|     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) | ||
| ... | ... | |
|     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 | ||
| ... | ... | |
|   end | ||