diff options
author | Hiroshi SHIBATA <[email protected]> | 2021-01-04 10:09:05 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2021-01-04 13:14:43 +0900 |
commit | 5537adf719a37a30b17d39111cc03700f353aa2d () | |
tree | 7523de9950b8a0118143f4ee0029aee17d043e04 | |
parent | 35c3a24c8cbcccff1108079360e2063fc354b4bd (diff) |
Track RubyGems master(3.3.0.dev) branch at 55634a8af18a52df86c4275d70fa1179118bcc20
Notes: Merged: https://.com/ruby/ruby/pull/4021
31 files changed, 258 insertions, 217 deletions
@@ -8,7 +8,7 @@ require 'rbconfig' module Gem - VERSION = "3.2.3".freeze end # Must be first since it unloads the prelude from 1.9.2 @@ -188,7 +188,7 @@ class Gem::CommandManager raise Gem::CommandLineError, "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]" elsif possibilities.empty? - raise Gem::CommandLineError, "Unknown command #{cmd_name}" end self[possibilities.first] @@ -27,6 +27,8 @@ class Gem::Commands::InstallCommand < Gem::Command :without_groups => [], }) super 'install', 'Install a gem into the local repository', defaults add_install_update_options @@ -43,8 +45,9 @@ class Gem::Commands::InstallCommand < Gem::Command end def defaults_str # :nodoc: - "--both --version '#{Gem::Requirement.default}' --document --no-force\n" + - "--install-dir #{Gem.dir} --lock" end def description # :nodoc: @@ -6,8 +6,8 @@ require 'rubygems/command' # RubyGems checkout or tarball. class Gem::Commands::SetupCommand < Gem::Command - HISTORY_HEADER = /^===\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze - VERSION_MATCHER = /^===\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze ENV_PATHS = %w[/usr/bin/env /bin/env].freeze @@ -167,19 +167,18 @@ By default, this RubyGems will install gem as: extend MakeDirs lib_dir, bin_dir = make_destination_dirs install_destdir - man_dir = make_man_dir install_destdir install_lib lib_dir - install_man man_dir - install_executables bin_dir remove_old_bin_files bin_dir remove_old_lib_files lib_dir - remove_old_man_files man_dir install_default_bundler_gem bin_dir @@ -330,21 +329,6 @@ By default, this RubyGems will install gem as: end end - def install_man(man_dir) - mans = { 'Bundler' => 'bundler/man' } - mans.each do |tool, path| - say "Installing #{tool} manpages" if @verbose - - bundler_man1_files = bundler_man1_files_in(path) - bundler_man5_files = bundler_man5_files_in(path) - - Dir.chdir path do - install_file_list(bundler_man1_files, "#{man_dir}/man1") - install_file_list(bundler_man5_files, "#{man_dir}/man5") - end - end - end - def install_rdoc gem_doc_dir = File.join Gem.dir, 'doc' rubygems_name = "rubygems-#{Gem::VERSION}" @@ -391,9 +375,7 @@ By default, this RubyGems will install gem as: specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform? mkdir_p specs_dir, :mode => 0755 - 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] # Remove bundler-*.gemspec in default specification directory. Dir.entries(specs_dir). @@ -455,19 +437,12 @@ By default, this RubyGems will install gem as: return lib_dir, bin_dir end - def make_man_dir(install_destdir) - man_dir = generate_default_man_dir(install_destdir) - - mkdir_p man_dir, :mode => 0755 - - return man_dir - end - def generate_default_man_dir(install_destdir) prefix = options[:prefix] if prefix.empty? man_dir = RbConfig::CONFIG['mandir'] else man_dir = File.join prefix, 'man' end @@ -518,20 +493,6 @@ By default, this RubyGems will install gem as: end end - # for installation of bundler as default gems - def bundler_man1_files_in(dir) - Dir.chdir dir do - Dir['bundle*.1'] - end - end - - # for installation of bundler as default gems - def bundler_man5_files_in(dir) - Dir.chdir dir do - Dir['gemfile.5'] - end - end - def remove_old_bin_files(bin_dir) old_bin_files = { 'gem_mirror' => 'gem mirror', @@ -585,33 +546,26 @@ abort "#{deprecation_message}" end end - def remove_old_man_files(man_dir) - man_dirs = { man_dir => "bundler/man" } - man_dirs.each do |old_man_dir, new_man_dir| - man1_files = bundler_man1_files_in(new_man_dir) - - old_man1_dir = "#{old_man_dir}/man1" - old_man1_files = bundler_man1_files_in(old_man1_dir) - old_man1_files += Dir.chdir(old_man1_dir) { Dir["bundle*.1.{txt,ronn}"] } - man1_to_remove = old_man1_files - man1_files remove_file_list(man1_to_remove, old_man1_dir) - man5_files = bundler_man5_files_in(new_man_dir) - - old_man5_dir = "#{old_man_dir}/man5" - old_man5_files = bundler_man5_files_in(old_man5_dir) - old_man5_files += Dir.chdir(old_man5_dir) { Dir["gemfile.5.{txt,ronn}"] } - man5_to_remove = old_man5_files - man5_files remove_file_list(man5_to_remove, old_man5_dir) end end def show_release_notes - release_notes = File.join Dir.pwd, 'History.txt' release_notes = if File.exist? release_notes @@ -19,9 +19,13 @@ class Gem::Commands::UpdateCommand < Gem::Command attr_reader :updated # :nodoc: def initialize - super 'update', 'Update installed gems to the latest version', - :document => %w[rdoc ri], - :force => false add_install_update_options @@ -51,7 +55,8 @@ class Gem::Commands::UpdateCommand < Gem::Command end def defaults_str # :nodoc: - "--document --no-force --install-dir #{Gem.dir}" end def description # :nodoc: @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'rubygems/deprecate' ## # Base exception class for RubyGems. All exception raised by RubyGems are a @@ -9,6 +10,30 @@ class Gem::Exception < RuntimeError; end class Gem::CommandLineError < Gem::Exception; end class Gem::DependencyError < Gem::Exception; end class Gem::DependencyRemovalException < Gem::Exception; end @@ -29,7 +29,7 @@ class Gem::Ext::Builder make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make' end - destdir = '"DESTDIR=%s"' % ENV['DESTDIR'] ['clean', '', 'install'].each do |target| # Pass DESTDIR via command line to override what's in MAKEFLAGS @@ -37,7 +37,7 @@ class Gem::Ext::Builder make_program, destdir, target, - ].join(' ').rstrip begin run(cmd, results, "make #{target}".rstrip, make_dir) rescue Gem::InstallError @@ -56,19 +56,21 @@ class Gem::Ext::Builder p(command) end results << "current directory: #{dir}" - results << (command.respond_to?(:shelljoin) ? command.shelljoin : command) require "open3" # Set $SOURCE_DATE_EPOCH for the subprocess. env = {'SOURCE_DATE_EPOCH' => Gem.source_date_epoch_string} - output, status = Open3.capture2e(env, *command, :chdir => dir) if verbose puts output else results << output end - rescue => error - raise Gem::InstallError, "#{command_name || class_name} failed#{error.message}" ensure ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps end @@ -4,8 +4,7 @@ require_relative '../command' class Gem::Ext::CmakeBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd) unless File.exist?(File.join(cmake_dir, 'Makefile')) - cmd = "cmake . -DCMAKE_INSTALL_PREFIX=#{dest_path}" - cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty? run cmd, results, class_name, cmake_dir end @@ -8,8 +8,7 @@ class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd) unless File.exist?(File.join(configure_dir, 'Makefile')) - cmd = "sh ./configure --prefix=#{dest_path}" - cmd << " #{args.join ' '}" unless args.empty? run cmd, results, class_name, configure_dir end @@ -181,10 +181,19 @@ module Gem::InstallUpdateOptions end ## - # Default options for the gem install command. def install_update_defaults_str - '--document=rdoc,ri --wrappers' end end @@ -26,13 +26,15 @@ class Gem::RemoteFetcher ## # The URI which was being accessed when the exception happened. - attr_accessor :uri def initialize(message, uri) super message uri = parse_uri(uri) uri.password = 'REDACTED' if uri.respond_to?(:password) && uri.password @uri = uri.to_s @@ -58,7 +58,7 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet # The calling method must retry the exception to repeat the lookup. def replace_failed_api_set(error) # :nodoc: - uri = error.uri uri = URI uri unless URI === uri uri = uri + "." @@ -43,9 +43,12 @@ class Gem::Resolver::IndexSpecification < Gem::Resolver::Specification ## # The required_rubygems_version constraint for this specification # def required_rubygems_version - spec.required_rubygems_version end def ==(other) @@ -35,6 +35,7 @@ class Gem::Source end @uri = uri end ## @@ -118,7 +119,8 @@ class Gem::Source # Returns true when it is possible and safe to update the cache directory. def update_cache? - @update_cache ||= begin File.stat(Gem.user_home).uid == Process.uid rescue Errno::ENOENT @@ -26,7 +26,20 @@ begin rescue LoadError end -require 'bundler' require 'minitest/autorun' @@ -250,16 +263,16 @@ class Gem::TestCase < Minitest::Test def assert_contains_make_command(target, output, msg = nil) if output.match(/\n/) msg = message(msg) do - 'Expected output containing make command "%s": %s' % [ ('%s %s' % [make_command, target]).rstrip, - output.inspect, ] end else msg = message(msg) do 'Expected make command "%s": %s' % [ ('%s %s' % [make_command, target]).rstrip, - output.inspect, ] end end @@ -298,6 +311,7 @@ class Gem::TestCase < Minitest::Test ENV['XDG_CONFIG_HOME'] = nil ENV['XDG_DATA_HOME'] = nil ENV['SOURCE_DATE_EPOCH'] = nil ENV["TMPDIR"] = @tmp @current_dir = Dir.pwd @@ -49,37 +49,38 @@ module Gem::Text end end - # This code is based directly on the Text gem implementation # Returns a value representing the "cost" of transforming str1 into str2 def levenshtein_distance(str1, str2) - s = str1 - t = str2 - n = s.length - m = t.length - - return m if (0 == n) - return n if (0 == m) d = (0..m).to_a x = nil - str1.each_char.each_with_index do |char1,i| - e = i + 1 - str2.each_char.each_with_index do |char2,j| - cost = (char1 == char2) ? 0 : 1 x = min3( - d[j + 1] + 1, # insertion - e + 1, # deletion - d[j] + cost # substitution - ) - d[j] = e - e = x end - d[m] = x end - return x end end @@ -0,0 +1,21 @@ Binary files differ@@ -12,14 +12,14 @@ class TestConfig < Gem::TestCase end def test_good_rake_path_is_escaped - path = Gem::TestCase.class_eval('@@good_rake') ruby, rake = path.shellsplit assert_equal(Gem.ruby, ruby) assert_match(/\/good_rake.rb\z/, rake) end def test_bad_rake_path_is_escaped - path = Gem::TestCase.class_eval('@@bad_rake') ruby, rake = path.shellsplit assert_equal(Gem.ruby, ruby) assert_match(/\/bad_rake.rb\z/, rake) @@ -50,13 +50,27 @@ class TestGemCommandManager < Gem::TestCase end def test_find_command_unknown - e = assert_raises Gem::CommandLineError do @command_manager.find_command 'xyz' end assert_equal 'Unknown command xyz', e.message end def test_run_interrupt old_load_path = $:.dup $: << File.expand_path("test/rubygems", PROJECT_DIR) @@ -265,7 +279,7 @@ class TestGemCommandManager < Gem::TestCase #check defaults @command_manager.process_args %w[update] - assert_includes check_options[:document], 'rdoc' #check settings check_options = nil @@ -24,14 +24,15 @@ class TestGemCommandsSetupCommand < Gem::TestCase lib/rubygems/test_case.rb lib/rubygems/ssl_certs/rubygems.org/foo.pem bundler/exe/bundle bundler/lib/bundler.rb bundler/lib/bundler/b.rb bundler/lib/bundler/man/bundle-b.1.ronn bundler/lib/bundler/man/gemfile.5.ronn bundler/lib/bundler/templates/.circleci/config.yml bundler/lib/bundler/templates/.travis.yml - bundler/man/bundle-b.1 - bundler/man/gemfile.5 ] create_dummy_files(filelist) @@ -41,7 +42,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase gemspec.name = "bundler" gemspec.version = BUNDLER_VERS gemspec.bindir = "exe" - gemspec.executables = ["bundle"] File.open 'bundler/bundler.gemspec', 'w' do |io| io.puts gemspec.to_ruby @@ -135,6 +136,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase exec_line = out.shift until exec_line == "RubyGems installed the following executables:" assert_equal "\t#{default_gem_bin_path}", out.shift assert_equal "\t#{default_bundle_bin_path}", out.shift end def test_env_shebang_flag @@ -152,6 +154,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase bin_env = win_platform? ? "" : %w[/usr/bin/env /bin/env].find {|f| File.executable?(f) } + " " assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(default_gem_bin_path) assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(default_bundle_bin_path) assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(gem_bin_path) end @@ -160,16 +163,6 @@ class TestGemCommandsSetupCommand < Gem::TestCase @cmd.files_in('lib').sort end - def test_bundler_man1_files_in - assert_equal %w[bundle-b.1], - @cmd.bundler_man1_files_in('bundler/man').sort - end - - def test_bundler_man5_files_in - assert_equal %w[gemfile.5], - @cmd.bundler_man5_files_in('bundler/man').sort - end - def test_install_lib @cmd.extend FileUtils @@ -187,19 +180,6 @@ class TestGemCommandsSetupCommand < Gem::TestCase end end - def test_install_man - @cmd.extend FileUtils - - Dir.mktmpdir 'man' do |dir| - @cmd.install_man dir - - assert_path_exists File.join("#{dir}/man1", 'bundle-b.1') - refute_path_exists File.join("#{dir}/man1", 'bundle-b.1.ronn') - assert_path_exists File.join("#{dir}/man5", 'gemfile.5') - refute_path_exists File.join("#{dir}/man5", 'gemfile.5.ronn') - end - end - def test_install_default_bundler_gem @cmd.extend FileUtils @@ -308,8 +288,8 @@ class TestGemCommandsSetupCommand < Gem::TestCase gemfile_5_ronn = File.join man, 'man5', 'gemfile.5.ronn' gemfile_5_txt = File.join man, 'man5', 'gemfile.5.txt' - files_that_go = [bundle_b_1_txt, bundle_b_1_ronn, gemfile_5_txt, gemfile_5_ronn] - files_that_stay = [ruby_1, bundle_b_1, gemfile_5] create_dummy_files(files_that_go + files_that_stay) @@ -326,22 +306,22 @@ class TestGemCommandsSetupCommand < Gem::TestCase @cmd.options[:previous_version] = Gem::Version.new '2.0.2' - File.open 'History.txt', 'w' do |io| io.puts <<-HISTORY_TXT -=== #{Gem::VERSION} / 2013-03-26 -* Bug fixes: * Fixed release note display for LANG=C when installing rubygems * π is tasty -=== 2.0.2 / 2013-03-06 -* Bug fixes: * Other bugs fixed -=== 2.0.1 / 2013-03-05 -* Bug fixes: * Yet more bugs fixed HISTORY_TXT end @@ -351,9 +331,9 @@ class TestGemCommandsSetupCommand < Gem::TestCase end expected = <<-EXPECTED -=== #{Gem::VERSION} / 2013-03-26 -* Bug fixes: * Fixed release note display for LANG=C when installing rubygems * π is tasty @@ -410,4 +390,8 @@ class TestGemCommandsSetupCommand < Gem::TestCase def default_bundle_bin_path File.join @install_dir, 'bin', 'bundle' end end unless Gem.java_platform? @@ -552,7 +552,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase expected = { :args => [], - :document => %w[rdoc ri], :force => false, :system => true, } @@ -571,7 +571,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase expected = { :args => [], - :document => %w[rdoc ri], :force => false, :system => "1.3.7", } @@ -946,6 +946,31 @@ class TestGemDependencyInstaller < Gem::TestCase assert_equal %w[d-2], inst.installed_gems.map {|s| s.full_name } end def test_find_gems_gems_with_sources util_setup_gems @@ -1102,21 +1127,6 @@ class TestGemDependencyInstaller < Gem::TestCase assert_equal %w[a-1], requests end - def util_write_a1_bin - write_file File.join('gems', 'a-1', 'bin', 'a_bin') do |fp| - fp.puts "#!/usr/bin/ruby" - end - end - - def util_setup_c1_pre - @c1_pre, @c1_pre_gem = util_spec 'c', '1.a' do |s| - s.add_dependency 'a', '1.a' - s.add_dependency 'b', '1' - end - - util_reset_gems - end - def util_setup_d @d1, @d1_gem = util_gem 'd', '1' @d2, @d2_gem = util_gem 'd', '2' @@ -1124,43 +1134,13 @@ class TestGemDependencyInstaller < Gem::TestCase util_reset_gems end - def util_setup_wxyz - @x1_m, @x1_m_gem = util_spec 'x', '1' do |s| - s.platform = Gem::Platform.new %w[cpu my_platform 1] - end - - @x1_o, @x1_o_gem = util_spec 'x', '1' do |s| - s.platform = Gem::Platform.new %w[cpu other_platform 1] - end - - @w1, @w1_gem = util_spec 'w', '1', 'x' => nil - - @y1, @y1_gem = util_spec 'y', '1' - @y1_1_p, @y1_1_p_gem = util_spec 'y', '1.1' do |s| - s.platform = Gem::Platform.new %w[cpu my_platform 1] - end - - @z1, @z1_gem = util_spec 'z', '1', 'y' => nil - - util_reset_gems - end - def util_reset_gems @a1 ||= nil @b1 ||= nil @a1_pre ||= nil - @c1_pre ||= nil @d1 ||= nil @d2 ||= nil - @w1 ||= nil - @x1_m ||= nil - @x1_o ||= nil - @y1 ||= nil - @y1_1_p ||= nil - @z1 ||= nil - - util_setup_spec_fetcher(*[@a1, @a1_pre, @b1, @c1_pre, - @d1, @d2, @x1_m, @x1_o, @w1, @y1, - @y1_1_p, @z1].compact) end end @@ -47,9 +47,9 @@ install: results = results.join("\n").b - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}" clean$}, results - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}"$}, results - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}" install$}, results if /nmake/ !~ results assert_match %r{^clean: destination$}, results @@ -76,9 +76,9 @@ install: results = results.join("\n").b - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}" clean$}, results - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}"$}, results - assert_match %r{"DESTDIR=#{ENV['DESTDIR']}" install$}, results end def test_build_extensions @@ -40,8 +40,7 @@ install (FILES test.txt DESTINATION bin) output = output.join "\n" - assert_match \ - %r{^cmake \. -DCMAKE_INSTALL_PREFIX=#{Regexp.escape @dest_path}}, output assert_match %r{#{Regexp.escape @ext}}, output assert_contains_make_command '', output assert_contains_make_command 'install', output @@ -58,11 +57,10 @@ install (FILES test.txt DESTINATION bin) output = output.join "\n" shell_error_msg = %r{(CMake Error: .*)} - sh_prefix_cmake = "cmake . -DCMAKE_INSTALL_PREFIX=" assert_match 'cmake failed', error.message - assert_match %r{^#{sh_prefix_cmake}#{Regexp.escape @dest_path}}, output assert_match %r{#{shell_error_msg}}, output end @@ -28,7 +28,7 @@ class TestGemExtConfigureBuilder < Gem::TestCase Gem::Ext::ConfigureBuilder.build nil, @dest_path, output, [], nil, @ext assert_match(/^current directory:/, output.shift) - assert_equal "sh ./configure --prefix=#{@dest_path}", output.shift assert_equal "", output.shift assert_match(/^current directory:/, output.shift) assert_contains_make_command 'clean', output.shift @@ -50,7 +50,7 @@ class TestGemExtConfigureBuilder < Gem::TestCase end shell_error_msg = %r{(\./configure: .*)|((?:[Cc]an't|cannot) open '?\./configure'?(?:: No such file or directory)?)} - sh_prefix_configure = "sh ./configure --prefix=" assert_match 'configure failed', error.message @@ -205,7 +205,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== @test_data end - raise Gem::RemoteFetcher::FetchError.new("haha!", nil) end end @@ -253,7 +253,6 @@ class TestGemRequirement < Gem::TestCase assert_satisfied_by "1.0.0.0", "= 1.0" assert_satisfied_by "10.3.2", "!= 9.3.4" assert_satisfied_by "10.3.2", "> 9.3.2" - assert_satisfied_by "10.3.2", "> 9.3.2" assert_satisfied_by " 9.3.2", ">= 9.3.2" assert_satisfied_by "9.3.2 ", ">= 9.3.2" assert_satisfied_by "", "= 0" @@ -132,4 +132,27 @@ class TestGemResolverBestSet < Gem::TestCase assert_equal error, e end end @@ -1200,10 +1200,8 @@ dependencies: [] Gem.platforms = orig_platform end - DATA_PATH = File.expand_path "../data", __FILE__ - def test_handles_private_null_type - path = File.join DATA_PATH, "null-type.gemspec.rz" data = Marshal.load Gem::Util.inflate(Gem.read_binary(path)) @@ -83,6 +83,12 @@ Without the wrapping, the text might not look good in the RSS feed. assert_equal 7, levenshtein_distance("zentest", "xxxxxxx") end def test_truncate_text assert_equal "abc", truncate_text("abc", "desc") assert_equal "Truncating desc to 2 characters:\nab", truncate_text("abc", "desc", 2) |