diff options
Diffstat (limited to 'test/rubygems/test_gem_commands_setup_command.rb')
-rw-r--r-- | test/rubygems/test_gem_commands_setup_command.rb | 312 |
1 files changed, 201 insertions, 111 deletions
diff --git a/test/rubygems/test_gem_commands_setup_command.rb b/test/rubygems/test_gem_commands_setup_command.rb index 3aa6bfa2fe..8eedb6c03a 100644 --- a/test/rubygems/test_gem_commands_setup_command.rb +++ b/test/rubygems/test_gem_commands_setup_command.rb @@ -1,25 +1,24 @@ # frozen_string_literal: true -require_relative 'helper' -require 'rubygems/commands/setup_command' +require_relative "helper" +require "rubygems/commands/setup_command" class TestGemCommandsSetupCommand < Gem::TestCase - bundler_gemspec = File.expand_path("../../../bundler/lib/bundler/version.rb", __FILE__) + bundler_gemspec = File.expand_path("../../bundler/lib/bundler/version.rb", __dir__) if File.exist?(bundler_gemspec) BUNDLER_VERS = File.read(bundler_gemspec).match(/VERSION = "(#{Gem::Version::VERSION_PATTERN})"/)[1] else - BUNDLER_VERS = "2.0.1".freeze + BUNDLER_VERS = "2.0.1" end def setup super - @install_dir = File.join @tempdir, 'install' @cmd = Gem::Commands::SetupCommand.new - @cmd.options[:prefix] = @install_dir + @cmd.options[:document] = [] filelist = %w[ - bin/gem + exe/gem lib/rubygems.rb lib/rubygems/requirement.rb lib/rubygems/ssl_certs/rubygems.org/foo.pem @@ -32,23 +31,20 @@ class TestGemCommandsSetupCommand < Gem::TestCase bundler/lib/bundler/man/gemfile.5 bundler/lib/bundler/man/gemfile.5.ronn bundler/lib/bundler/templates/.circleci/config.yml - bundler/lib/bundler/templates/.travis.yml ] create_dummy_files(filelist) - gemspec = Gem::Specification.new - gemspec.author = "Us" - gemspec.name = "bundler" - gemspec.version = BUNDLER_VERS - gemspec.bindir = "exe" - gemspec.executables = ["bundle", "bundler"] + gemspec = util_spec "bundler", BUNDLER_VERS do |s| + s.bindir = "exe" + s.executables = ["bundle", "bundler"] + end - File.open 'bundler/bundler.gemspec', 'w' do |io| + File.open "bundler/bundler.gemspec", "w" do |io| io.puts gemspec.to_ruby end - File.open(File.join(Gem.default_specifications_dir, "bundler-1.15.4.gemspec"), 'w') do |io| + File.open(File.join(Gem.default_specifications_dir, "bundler-1.15.4.gemspec"), "w") do |io| gemspec.version = "1.15.4" io.puts gemspec.to_ruby end @@ -56,31 +52,29 @@ class TestGemCommandsSetupCommand < Gem::TestCase spec_fetcher do |fetcher| fetcher.download "bundler", "1.15.4" - fetcher.gem "bundler", BUNDLER_VERS + fetcher.gem "bundler", bundler_version fetcher.gem "bundler-audit", "1.0.0" end end def test_execute_regenerate_binstubs - gem_bin_path = gem_install 'a' + gem_bin_path = gem_install "a" write_file gem_bin_path do |io| - io.puts 'I changed it!' + io.puts "I changed it!" end - @cmd.options[:document] = [] @cmd.execute - assert_match %r{\A#!}, File.read(gem_bin_path) + assert_match(/\A#!/, File.read(gem_bin_path)) end def test_execute_no_regenerate_binstubs - gem_bin_path = gem_install 'a' + gem_bin_path = gem_install "a" write_file gem_bin_path do |io| - io.puts 'I changed it!' + io.puts "I changed it!" end - @cmd.options[:document] = [] @cmd.options[:regenerate_binstubs] = false @cmd.execute @@ -88,24 +82,22 @@ class TestGemCommandsSetupCommand < Gem::TestCase end def test_execute_regenerate_plugins - gem_plugin_path = gem_install_with_plugin 'a' + gem_plugin_path = gem_install_with_plugin "a" write_file gem_plugin_path do |io| - io.puts 'I changed it!' + io.puts "I changed it!" end - @cmd.options[:document] = [] @cmd.execute - assert_match %r{\Arequire}, File.read(gem_plugin_path) + assert_match(/\Arequire/, File.read(gem_plugin_path)) end def test_execute_no_regenerate_plugins - gem_plugin_path = gem_install_with_plugin 'a' + gem_plugin_path = gem_install_with_plugin "a" write_file gem_plugin_path do |io| - io.puts 'I changed it!' + io.puts "I changed it!" end - @cmd.options[:document] = [] @cmd.options[:regenerate_plugins] = false @cmd.execute @@ -113,20 +105,17 @@ class TestGemCommandsSetupCommand < Gem::TestCase end def test_execute_regenerate_plugins_creates_plugins_dir_if_not_there - gem_plugin_path = gem_install_with_plugin 'a' + gem_plugin_path = gem_install_with_plugin "a" # Simulate gem installed with an older rubygems without a plugins layout FileUtils.rm_rf Gem.plugindir - @cmd.options[:document] = [] @cmd.execute - assert_match %r{\Arequire}, File.read(gem_plugin_path) + assert_match(/\Arequire/, File.read(gem_plugin_path)) end def test_execute_informs_about_installed_executables - @cmd.options[:document] = [] - use_ui @ui do @cmd.execute end @@ -140,53 +129,80 @@ class TestGemCommandsSetupCommand < Gem::TestCase end def test_env_shebang_flag - gem_bin_path = gem_install 'a' + gem_bin_path = gem_install "a" write_file gem_bin_path do |io| - io.puts 'I changed it!' + io.puts "I changed it!" end - @cmd.options[:document] = [] @cmd.options[:env_shebang] = true @cmd.execute - ruby_exec = sprintf Gem.default_exec_format, 'ruby' + ruby_exec = format Gem.default_exec_format, "ruby" - 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(default_bundler_bin_path) - assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(gem_bin_path) + bin_env = Gem.win_platform? ? "" : %w[/usr/bin/env /bin/env].find {|f| File.executable?(f) } + " " + assert_match(/\A#!\s*#{bin_env}#{ruby_exec}/, File.read(default_gem_bin_path)) + assert_match(/\A#!\s*#{bin_env}#{ruby_exec}/, File.read(default_bundle_bin_path)) + assert_match(/\A#!\s*#{bin_env}#{ruby_exec}/, File.read(default_bundler_bin_path)) + assert_match(/\A#!\s*#{bin_env}#{ruby_exec}/, File.read(gem_bin_path)) + end + + def test_destdir_flag_does_not_try_to_write_to_the_default_gem_home + FileUtils.chmod "-w", File.join(@gemhome, "plugins") + + destdir = File.join(@tempdir, "foo") + + @cmd.options[:destdir] = destdir + @cmd.execute + + bundler_spec.executables.each do |e| + assert_path_exist prepend_destdir(destdir, File.join(@gemhome, "gems", bundler_spec.full_name, bundler_spec.bindir, e)) + end + end + + def test_destdir_flag_regenerates_binstubs + # install to destdir + destdir = File.join(@tempdir, "foo") + gem_bin_path = gem_install "destdir-only-gem", install_dir: destdir + + # change binstub manually + write_file gem_bin_path do |io| + io.puts "I changed it!" + end + + @cmd.options[:destdir] = destdir + @cmd.options[:prefix] = "/" + @cmd.execute + + assert_match(/\A#!/, File.read(gem_bin_path)) end def test_files_in assert_equal %w[rubygems.rb rubygems/requirement.rb rubygems/ssl_certs/rubygems.org/foo.pem], - @cmd.files_in('lib').sort + @cmd.files_in("lib").sort end def test_install_lib @cmd.extend FileUtils - Dir.mktmpdir 'lib' do |dir| + Dir.mktmpdir "lib" do |dir| @cmd.install_lib dir - assert_path_exist File.join(dir, 'rubygems.rb') - assert_path_exist File.join(dir, 'rubygems/ssl_certs/rubygems.org/foo.pem') + assert_path_exist File.join(dir, "rubygems.rb") + assert_path_exist File.join(dir, "rubygems/ssl_certs/rubygems.org/foo.pem") - assert_path_exist File.join(dir, 'bundler.rb') - assert_path_exist File.join(dir, 'bundler/b.rb') + assert_path_exist File.join(dir, "bundler.rb") + assert_path_exist File.join(dir, "bundler/b.rb") - assert_path_exist File.join(dir, 'bundler/templates/.circleci/config.yml') - assert_path_exist File.join(dir, 'bundler/templates/.travis.yml') + assert_path_exist File.join(dir, "bundler/templates/.circleci/config.yml") end end def test_install_default_bundler_gem @cmd.extend FileUtils - bin_dir = File.join(@gemhome, 'bin') + bin_dir = File.join(@gemhome, "bin") @cmd.install_default_bundler_gem bin_dir - bundler_spec = Gem::Specification.load("bundler/bundler.gemspec") default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec") spec = Gem::Specification.load(default_spec_path) @@ -198,72 +214,126 @@ class TestGemCommandsSetupCommand < Gem::TestCase assert_path_exist File.join bin_dir, e end - default_dir = Gem.default_specifications_dir - # expect to remove other versions of bundler gemspecs on default specification directory. - assert_path_not_exist File.join(default_dir, "bundler-1.15.4.gemspec") - assert_path_exist File.join(default_dir, "bundler-#{BUNDLER_VERS}.gemspec") + assert_path_not_exist previous_bundler_specification_path + assert_path_exist new_bundler_specification_path # expect to not remove bundler-* gemspecs. assert_path_exist File.join(Gem.dir, "specifications", "bundler-audit-1.0.0.gemspec") # expect to remove normal gem that was same version. because it's promoted default gems. - assert_path_not_exist File.join(Gem.dir, "specifications", "bundler-#{BUNDLER_VERS}.gemspec") + assert_path_not_exist File.join(Gem.dir, "specifications", "bundler-#{bundler_version}.gemspec") - assert_path_exist "#{Gem.dir}/gems/bundler-#{BUNDLER_VERS}" + assert_path_exist "#{Gem.dir}/gems/bundler-#{bundler_version}" assert_path_exist "#{Gem.dir}/gems/bundler-1.15.4" assert_path_exist "#{Gem.dir}/gems/bundler-audit-1.0.0" end + def test_install_default_bundler_gem_with_default_gems_not_installed_at_default_dir + @cmd.extend FileUtils + + gemhome2 = File.join(@tempdir, "gemhome2") + Gem.instance_variable_set(:@default_dir, gemhome2) + + FileUtils.mkdir_p gemhome2 + bin_dir = File.join(gemhome2, "bin") + + @cmd.install_default_bundler_gem bin_dir + + # expect to remove other versions of bundler gemspecs on default specification directory. + assert_path_not_exist previous_bundler_specification_path + assert_path_exist new_bundler_specification_path + end + def test_install_default_bundler_gem_with_force_flag @cmd.extend FileUtils - bin_dir = File.join(@gemhome, 'bin') - bundle_bin = File.join(bin_dir, 'bundle') + bin_dir = File.join(@gemhome, "bin") + bundle_bin = File.join(bin_dir, "bundle") write_file bundle_bin do |f| - f.puts '#!/usr/bin/ruby' - f.puts '' + f.puts "#!/usr/bin/ruby" + f.puts "" f.puts 'echo "hello"' end - bindir(bin_dir) do - @cmd.options[:force] = true + @cmd.options[:force] = true - @cmd.install_default_bundler_gem bin_dir - - bundler_spec = Gem::Specification.load("bundler/bundler.gemspec") - default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec") - spec = Gem::Specification.load(default_spec_path) + @cmd.install_default_bundler_gem bin_dir - spec.executables.each do |e| - if Gem.win_platform? - assert_path_exist File.join(bin_dir, "#{e}.bat") - end + default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec") + spec = Gem::Specification.load(default_spec_path) - assert_path_exist File.join bin_dir, e + spec.executables.each do |e| + if Gem.win_platform? + assert_path_exist File.join(bin_dir, "#{e}.bat") end + + assert_path_exist File.join bin_dir, e + end + end + + def test_install_default_bundler_gem_with_destdir_flag + @cmd.extend FileUtils + + FileUtils.chmod "-w", @gemhome + + destdir = File.join(@tempdir, "foo") + bin_dir = File.join(destdir, "bin") + + @cmd.options[:destdir] = destdir + + @cmd.install_default_bundler_gem bin_dir + + # leaves other versions of bundler gemspecs on default specification directory. + assert_path_exist previous_bundler_specification_path + assert_path_not_exist new_bundler_specification_path + + # installs the updated bundler gemspec to destdir + assert_path_not_exist prepend_destdir(destdir, previous_bundler_specification_path) + assert_path_exist prepend_destdir(destdir, new_bundler_specification_path) + + bundler_spec.executables.each do |e| + assert_path_exist prepend_destdir(destdir, File.join(@gemhome, "gems", bundler_spec.full_name, bundler_spec.bindir, e)) + end + ensure + FileUtils.chmod "+w", @gemhome + end + + def test_install_default_bundler_gem_with_destdir_and_prefix_flags + @cmd.extend FileUtils + + destdir = File.join(@tempdir, "foo") + bin_dir = File.join(destdir, "bin") + + @cmd.options[:destdir] = destdir + @cmd.options[:prefix] = "/" + + @cmd.install_default_bundler_gem bin_dir + + bundler_spec.executables.each do |e| + assert_path_exist File.join destdir, "gems", bundler_spec.full_name, bundler_spec.bindir, e end end def test_remove_old_lib_files - lib = File.join @install_dir, 'lib' - lib_rubygems = File.join lib, 'rubygems' - lib_bundler = File.join lib, 'bundler' - lib_rubygems_defaults = File.join lib_rubygems, 'defaults' - lib_bundler_templates = File.join lib_bundler, 'templates' + lib = RbConfig::CONFIG["sitelibdir"] + lib_rubygems = File.join lib, "rubygems" + lib_bundler = File.join lib, "bundler" + lib_rubygems_defaults = File.join lib_rubygems, "defaults" + lib_bundler_templates = File.join lib_bundler, "templates" - securerandom_rb = File.join lib, 'securerandom.rb' + securerandom_rb = File.join lib, "securerandom.rb" - engine_defaults_rb = File.join lib_rubygems_defaults, 'jruby.rb' - os_defaults_rb = File.join lib_rubygems_defaults, 'operating_system.rb' + engine_defaults_rb = File.join lib_rubygems_defaults, "jruby.rb" + os_defaults_rb = File.join lib_rubygems_defaults, "operating_system.rb" - old_gauntlet_rubygems_rb = File.join lib, 'gauntlet_rubygems.rb' + old_gauntlet_rubygems_rb = File.join lib, "gauntlet_rubygems.rb" - old_builder_rb = File.join lib_rubygems, 'builder.rb' - old_format_rb = File.join lib_rubygems, 'format.rb' - old_bundler_c_rb = File.join lib_bundler, 'c.rb' - old_bundler_ci = File.join lib_bundler_templates, '.lecacy_ci', 'config.yml' + old_builder_rb = File.join lib_rubygems, "builder.rb" + old_format_rb = File.join lib_rubygems, "format.rb" + old_bundler_c_rb = File.join lib_bundler, "c.rb" + old_bundler_ci = File.join lib_bundler_templates, ".lecacy_ci", "config.yml" files_that_go = [old_gauntlet_rubygems_rb, old_builder_rb, old_format_rb, old_bundler_c_rb, old_bundler_ci] files_that_stay = [securerandom_rb, engine_defaults_rb, os_defaults_rb] @@ -278,15 +348,15 @@ class TestGemCommandsSetupCommand < Gem::TestCase end def test_remove_old_man_files - man = File.join @install_dir, 'man' + man = File.join RbConfig::CONFIG["mandir"], "man" - ruby_1 = File.join man, 'man1', 'ruby.1' - bundle_b_1 = File.join man, 'man1', 'bundle-b.1' - bundle_b_1_ronn = File.join man, 'man1', 'bundle-b.1.ronn' - bundle_b_1_txt = File.join man, 'man1', 'bundle-b.1.txt' - gemfile_5 = File.join man, 'man5', 'gemfile.5' - gemfile_5_ronn = File.join man, 'man5', 'gemfile.5.ronn' - gemfile_5_txt = File.join man, 'man5', 'gemfile.5.txt' + ruby_1 = File.join man, "man1", "ruby.1" + bundle_b_1 = File.join man, "man1", "bundle-b.1" + bundle_b_1_ronn = File.join man, "man1", "bundle-b.1.ronn" + bundle_b_1_txt = File.join man, "man1", "bundle-b.1.txt" + gemfile_5 = File.join man, "man5", "gemfile.5" + 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, bundle_b_1_txt, bundle_b_1_ronn, gemfile_5, gemfile_5_txt, gemfile_5_ronn] files_that_stay = [ruby_1] @@ -304,9 +374,9 @@ class TestGemCommandsSetupCommand < Gem::TestCase @default_external = @ui.outs.external_encoding @ui.outs.set_encoding Encoding::US_ASCII - @cmd.options[:previous_version] = Gem::Version.new '2.0.2' + @cmd.options[:previous_version] = Gem::Version.new "2.0.2" - File.open 'CHANGELOG.md', 'w' do |io| + File.open "CHANGELOG.md", "w" do |io| io.puts <<-HISTORY_TXT # #{Gem::VERSION} / 2013-03-26 @@ -353,30 +423,30 @@ class TestGemCommandsSetupCommand < Gem::TestCase list.each do |file| FileUtils.mkdir_p File.dirname(file) - File.open file, 'w' do |io| + File.open file, "w" do |io| io.puts "# #{File.basename(file)}" end end end - def gem_install(name) + def gem_install(name, **options) gem = util_spec name do |s| s.executables = [name] s.files = %W[bin/#{name}] end - write_file File.join @tempdir, 'bin', name do |f| - f.puts '#!/usr/bin/ruby' + write_file File.join @tempdir, "bin", name do |f| + f.puts "#!/usr/bin/ruby" end - install_gem gem - File.join @gemhome, 'bin', name + install_gem gem, **options + File.join options[:install_dir] || @gemhome, "bin", name end def gem_install_with_plugin(name) gem = util_spec name do |s| s.files = %W[lib/rubygems_plugin.rb] end - write_file File.join @tempdir, 'lib', 'rubygems_plugin.rb' do |f| - f.puts "require '#{gem.plugins.first}'" + write_file File.join @tempdir, "lib", "rubygems_plugin.rb" do |f| + f.puts "# do nothing" end install_gem gem @@ -384,14 +454,34 @@ class TestGemCommandsSetupCommand < Gem::TestCase end def default_gem_bin_path - File.join @install_dir, 'bin', 'gem' + File.join RbConfig::CONFIG["bindir"], "gem" end def default_bundle_bin_path - File.join @install_dir, 'bin', 'bundle' + File.join RbConfig::CONFIG["bindir"], "bundle" end def default_bundler_bin_path - File.join @install_dir, 'bin', 'bundler' + File.join RbConfig::CONFIG["bindir"], "bundler" + end + + def previous_bundler_specification_path + File.join(Gem.default_specifications_dir, "bundler-1.15.4.gemspec") + end + + def new_bundler_specification_path + File.join(Gem.default_specifications_dir, "bundler-#{bundler_version}.gemspec") + end + + def bundler_spec + Gem::Specification.load("bundler/bundler.gemspec") + end + + def bundler_version + bundler_spec.version + end + + def prepend_destdir(destdir, path) + File.join(destdir, path.gsub(/^[a-zA-Z]:/, "")) end end unless Gem.java_platform? |