diff options
author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2022-07-13 14:37:17 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2022-09-03 15:54:07 +0900 |
commit | b9f6a09bd2127ea51612bd27bef5830831b48d4f (patch) | |
tree | 2ea33c0d2c14e86b1b0ad7449d85ec068d954aea /spec | |
parent | d7862a5de43f7412ab41cdae6709c8a30b988621 (diff) |
Merge RubyGems-3.3.15 and Bundler-2.3.15
Diffstat (limited to 'spec')
-rw-r--r-- | spec/bundler/commands/clean_spec.rb | 2 | ||||
-rw-r--r-- | spec/bundler/commands/config_spec.rb | 28 | ||||
-rw-r--r-- | spec/bundler/commands/install_spec.rb | 41 | ||||
-rw-r--r-- | spec/bundler/commands/remove_spec.rb | 30 | ||||
-rw-r--r-- | spec/bundler/install/gemfile/sources_spec.rb | 26 | ||||
-rw-r--r-- | spec/bundler/install/gems/flex_spec.rb | 67 | ||||
-rw-r--r-- | spec/bundler/install/gems/resolving_spec.rb | 21 | ||||
-rw-r--r-- | spec/bundler/install/gems/standalone_spec.rb | 9 | ||||
-rw-r--r-- | spec/bundler/install/process_lock_spec.rb | 22 | ||||
-rw-r--r-- | spec/bundler/runtime/setup_spec.rb | 11 | ||||
-rw-r--r-- | spec/bundler/spec_helper.rb | 4 | ||||
-rw-r--r-- | spec/bundler/support/builders.rb | 5 | ||||
-rw-r--r-- | spec/bundler/support/path.rb | 8 | ||||
-rw-r--r-- | spec/bundler/support/sudo.rb | 4 |
14 files changed, 254 insertions, 24 deletions
diff --git a/spec/bundler/commands/clean_spec.rb b/spec/bundler/commands/clean_spec.rb index 576872b0f6..db81c10e9d 100644 --- a/spec/bundler/commands/clean_spec.rb +++ b/spec/bundler/commands/clean_spec.rb @@ -208,7 +208,7 @@ RSpec.describe "bundle clean" do G FileUtils.mkdir_p(bundled_app("real-path")) - FileUtils.ln_sf(bundled_app("real-path"), bundled_app("symlink-path")) + File.symlink(bundled_app("real-path"), bundled_app("symlink-path")) bundle "config set path #{bundled_app("symlink-path")}" bundle "install" diff --git a/spec/bundler/commands/config_spec.rb b/spec/bundler/commands/config_spec.rb index fb7aa3cc67..6148b1c7ce 100644 --- a/spec/bundler/commands/config_spec.rb +++ b/spec/bundler/commands/config_spec.rb @@ -435,6 +435,34 @@ E end end + describe "commented out settings with urls" do + before do + bundle "config set #mirror.https://rails-assets.org http://localhost:9292" + end + + it "does not make bundler crash and ignores the configuration" do + bundle "config list --parseable" + + expect(out).to eq("#mirror.https://rails-assets.org/=http://localhost:9292") + expect(err).to be_empty + + ruby(<<~RUBY) + require "#{entrypoint}" + print Bundler.settings.mirror_for("https://rails-assets.org") + RUBY + expect(out).to eq("https://rails-assets.org/") + expect(err).to be_empty + + bundle "config set mirror.all http://localhost:9293" + ruby(<<~RUBY) + require "#{entrypoint}" + print Bundler.settings.mirror_for("https://rails-assets.org") + RUBY + expect(out).to eq("http://localhost:9293/") + expect(err).to be_empty + end + end + describe "subcommands" do it "list" do bundle "config list", :env => { "BUNDLE_FOO" => "bar" } diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb index f189a70b10..4a48187db0 100644 --- a/spec/bundler/commands/install_spec.rb +++ b/spec/bundler/commands/install_spec.rb @@ -755,12 +755,8 @@ RSpec.describe "bundle install with gem sources" do end expect(err).not_to include("ERROR REPORT TEMPLATE") - - expect(err).to include( - "There was an error while trying to delete `#{foo_path}`. " \ - "It is likely that you need to grant executable permissions for all parent directories " \ - "and write permissions for `#{gems_path}`, and the same thing for all subdirectories inside #{foo_path}." - ) + expect(err).to include("Could not delete previous installation of `#{foo_path}`.") + expect(err).to include("The underlying error was Errno::EACCES") end end @@ -973,4 +969,37 @@ RSpec.describe "bundle install with gem sources" do expect(last_command).to be_success end end + + context "with a symlinked configured as bundle path and a gem with symlinks" do + before do + symlinked_bundled_app = tmp("bundled_app-symlink") + File.symlink(bundled_app, symlinked_bundled_app) + bundle "config path #{File.join(symlinked_bundled_app, ".vendor")}" + + binman_path = tmp("binman") + FileUtils.mkdir_p binman_path + + readme_path = File.join(binman_path, "README.markdown") + FileUtils.touch(readme_path) + + man_path = File.join(binman_path, "man", "man0") + FileUtils.mkdir_p man_path + + File.symlink("../../README.markdown", File.join(man_path, "README.markdown")) + + build_repo4 do + build_gem "binman", :path => gem_repo4("gems"), :lib_path => binman_path, :no_default => true do |s| + s.files = ["README.markdown", "man/man0/README.markdown"] + end + end + end + + it "installs fine" do + install_gemfile <<~G + source "#{file_uri_for(gem_repo4)}" + + gem "binman" + G + end + end end diff --git a/spec/bundler/commands/remove_spec.rb b/spec/bundler/commands/remove_spec.rb index 95d6e75e9f..ceba6c5ede 100644 --- a/spec/bundler/commands/remove_spec.rb +++ b/spec/bundler/commands/remove_spec.rb @@ -13,6 +13,36 @@ RSpec.describe "bundle remove" do end end + context "after 'bundle install' is run" do + describe "running 'bundle remove GEM_NAME'" do + it "removes it from the lockfile" do + rack_dep = <<~L + + DEPENDENCIES + rack + + L + + gemfile <<-G + source "#{file_uri_for(gem_repo1)}" + + gem "rack" + G + + bundle "install" + + expect(lockfile).to include(rack_dep) + + bundle "remove rack" + + expect(gemfile).to eq <<~G + source "#{file_uri_for(gem_repo1)}" + G + expect(lockfile).to_not include(rack_dep) + end + end + end + context "when --install flag is specified", :bundler => "< 3" do it "removes gems from .bundle" do gemfile <<-G diff --git a/spec/bundler/install/gemfile/sources_spec.rb b/spec/bundler/install/gemfile/sources_spec.rb index 62cad6800f..89c812e5d5 100644 --- a/spec/bundler/install/gemfile/sources_spec.rb +++ b/spec/bundler/install/gemfile/sources_spec.rb @@ -1255,6 +1255,32 @@ RSpec.describe "bundle install with gems on multiple sources" do end end + context "when Gemfile overrides a gemspec development dependency to change the default source" do + before do + build_repo4 do + build_gem "bar" + end + + build_lib("gemspec_test", :path => tmp.join("gemspec_test")) do |s| + s.add_development_dependency "bar" + end + + install_gemfile <<-G, :artifice => "compact_index" + source "https://gem.repo1" + + source "https://gem.repo4" do + gem "bar" + end + + gemspec :path => "#{tmp.join("gemspec_test")}" + G + end + + it "does not print warnings" do + expect(err).to be_empty + end + end + it "doesn't update version when a gem uses a source block but a higher version from another source is already installed locally" do build_repo2 do build_gem "example", "0.1.0" diff --git a/spec/bundler/install/gems/flex_spec.rb b/spec/bundler/install/gems/flex_spec.rb index f9b374cf01..28ffaff3d5 100644 --- a/spec/bundler/install/gems/flex_spec.rb +++ b/spec/bundler/install/gems/flex_spec.rb @@ -156,7 +156,7 @@ RSpec.describe "bundle flex_install" do end end - describe "when Gemfile conflicts with lockfile" do + describe "when running bundle install and Gemfile conflicts with lockfile" do before(:each) do build_repo2 install_gemfile <<-G @@ -190,7 +190,7 @@ RSpec.describe "bundle flex_install" do expect(err).to match(/could not find gem 'rack-obama/i) end - it "suggests bundle update when the Gemfile requires different versions than the lock" do + it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do bundle "config set force_ruby_platform true" nice_error = <<-E.strip.gsub(/^ {8}/, "") @@ -205,7 +205,7 @@ RSpec.describe "bundle flex_install" do rack_middleware was resolved to 1.0, which depends on rack (= 0.9.1) - Running `bundle update` will rebuild your snapshot from scratch, using only + Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only the gems in your Gemfile, which may resolve the conflict. E @@ -214,6 +214,67 @@ RSpec.describe "bundle flex_install" do end end + describe "when running bundle update and Gemfile conflicts with lockfile" do + before(:each) do + build_repo4 do + build_gem "jekyll-feed", "0.16.0" + build_gem "jekyll-feed", "0.15.1" + + build_gem "github-pages", "226" do |s| + s.add_dependency "jekyll-feed", "0.15.1" + end + end + + install_gemfile <<-G + source "#{file_uri_for(gem_repo4)}" + gem "jekyll-feed", "~> 0.12" + G + + puts lockfile + lockfile <<-L + GEM + remote: #{file_uri_for(gem_repo4)}/ + specs: + jekyll-feed (0.16.0) + + PLATFORMS + #{lockfile_platforms} + + DEPENDENCIES + jekyll-feed + + BUNDLED WITH + #{Bundler::VERSION} + L + + gemfile <<-G + source "#{file_uri_for(gem_repo4)}" + gem "github-pages", "~> 226" + gem "jekyll-feed", "~> 0.12" + G + end + + it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do + nice_error = <<-E.strip.gsub(/^ {8}/, "") + Bundler could not find compatible versions for gem "jekyll-feed": + In snapshot (Gemfile.lock): + jekyll-feed (>= 0.16.0) + + In Gemfile: + jekyll-feed (~> 0.12) + + github-pages (~> 226) was resolved to 226, which depends on + jekyll-feed (= 0.15.1) + + Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only + the gems in your Gemfile, which may resolve the conflict. + E + + bundle :update, :raise_on_error => false + expect(err).to end_with(nice_error) + end + end + describe "subtler cases" do before :each do install_gemfile <<-G diff --git a/spec/bundler/install/gems/resolving_spec.rb b/spec/bundler/install/gems/resolving_spec.rb index 469ecd412f..f23d137bc1 100644 --- a/spec/bundler/install/gems/resolving_spec.rb +++ b/spec/bundler/install/gems/resolving_spec.rb @@ -282,6 +282,27 @@ RSpec.describe "bundle install with install-time dependencies" do expect(err).not_to include("That means the author of parallel_tests (3.8.0) has removed it.") end + it "gives a meaningful error on ruby version mismatches between dependencies" do + build_repo4 do + build_gem "requires-old-ruby" do |s| + s.required_ruby_version = "< #{RUBY_VERSION}" + end + end + + build_lib("foo", :path => bundled_app) do |s| + s.required_ruby_version = ">= #{RUBY_VERSION}" + + s.add_dependency "requires-old-ruby" + end + + install_gemfile <<-G, :raise_on_error => false + source "#{file_uri_for(gem_repo4)}" + gemspec + G + + expect(err).to include("Bundler found conflicting requirements for the Ruby\0 version:") + end + it "installs the older version under rate limiting conditions" do build_repo4 do build_gem "rack", "9001.0.0" do |s| diff --git a/spec/bundler/install/gems/standalone_spec.rb b/spec/bundler/install/gems/standalone_spec.rb index 5cbb484c68..0bbd829148 100644 --- a/spec/bundler/install/gems/standalone_spec.rb +++ b/spec/bundler/install/gems/standalone_spec.rb @@ -147,9 +147,16 @@ RSpec.shared_examples "bundle install --standalone" do bundle "lock", :dir => cwd, :artifice => "compact_index" end - it "works" do + it "works and points to the vendored copies, not to the default copies" do bundle "config set --local path #{bundled_app("bundle")}" bundle :install, :standalone => true, :dir => cwd, :artifice => "compact_index", :env => { "BUNDLER_GEM_DEFAULT_DIR" => system_gem_path.to_s } + + load_path_lines = bundled_app("bundle/bundler/setup.rb").read.split("\n").select {|line| line.start_with?("$:.unshift") } + + expect(load_path_lines).to eq [ + '$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{RbConfig::CONFIG["ruby_version"]}/gems/bar-1.0.0/lib")', + '$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{RbConfig::CONFIG["ruby_version"]}/gems/foo-1.0.0/lib")', + ] end end diff --git a/spec/bundler/install/process_lock_spec.rb b/spec/bundler/install/process_lock_spec.rb index dac0d34bc4..1f8c62f26e 100644 --- a/spec/bundler/install/process_lock_spec.rb +++ b/spec/bundler/install/process_lock_spec.rb @@ -31,5 +31,27 @@ RSpec.describe "process lock spec" do expect(processed).to eq true end end + + context "when creating a lock raises Errno::EPERM" do + before { allow(File).to receive(:open).and_raise(Errno::EPERM) } + + it "skips creating the lock file and yields" do + processed = false + Bundler::ProcessLock.lock(default_bundle_path) { processed = true } + + expect(processed).to eq true + end + end + + context "when creating a lock raises Errno::EROFS" do + before { allow(File).to receive(:open).and_raise(Errno::EROFS) } + + it "skips creating the lock file and yields" do + processed = false + Bundler::ProcessLock.lock(default_bundle_path) { processed = true } + + expect(processed).to eq true + end + end end end diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index 35873dcaa9..91f8aaf78a 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "tmpdir" -require "tempfile" RSpec.describe "Bundler.setup" do describe "with no arguments" do @@ -800,7 +799,7 @@ end run <<~RUBY puts ENV['MANPATH'] require "open3" - puts Open3.capture2e("man", "ls")[0] + puts Open3.capture2e({ "LC_ALL" => "C" }, "man", "ls")[0] RUBY lines = out.split("\n") @@ -861,19 +860,17 @@ end context "with bundler is located in symlinked GEM_HOME" do let(:gem_home) { Dir.mktmpdir } - let(:symlinked_gem_home) { Tempfile.new("gem_home").path } + let(:symlinked_gem_home) { tmp("gem_home-symlink").to_s } let(:full_name) { "bundler-#{Bundler::VERSION}" } before do - skip "symlink destination exists" if Gem.win_platform? - - FileUtils.ln_sf(gem_home, symlinked_gem_home) + File.symlink(gem_home, symlinked_gem_home) gems_dir = File.join(gem_home, "gems") specifications_dir = File.join(gem_home, "specifications") Dir.mkdir(gems_dir) Dir.mkdir(specifications_dir) - FileUtils.ln_s(source_root, File.join(gems_dir, full_name)) + File.symlink(source_root, File.join(gems_dir, full_name)) gemspec_content = File.binread(gemspec). sub("Bundler::VERSION", %("#{Bundler::VERSION}")). diff --git a/spec/bundler/spec_helper.rb b/spec/bundler/spec_helper.rb index dce2939e83..23db133b67 100644 --- a/spec/bundler/spec_helper.rb +++ b/spec/bundler/spec_helper.rb @@ -113,6 +113,10 @@ RSpec.configure do |config| end end + config.before :each, :sudo => true do + Spec::Sudo.write_safe_config + end + config.after :suite do FileUtils.rm_r Spec::Path.pristine_system_gem_path end diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index aca31638ac..91f0106d7d 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -484,7 +484,7 @@ module Spec end @spec.authors = ["no one"] - @spec.files = @files.keys + @spec.files += @files.keys case options[:gemspec] when false @@ -589,7 +589,8 @@ module Spec class GemBuilder < LibBuilder def _build(opts) - lib_path = super(opts.merge(:path => @context.tmp(".tmp/#{@spec.full_name}"), :no_default => opts[:no_default])) + lib_path = opts[:lib_path] || @context.tmp(".tmp/#{@spec.full_name}") + lib_path = super(opts.merge(:path => lib_path, :no_default => opts[:no_default])) destination = opts[:path] || _default_path FileUtils.mkdir_p(lib_path.join(destination)) diff --git a/spec/bundler/support/path.rb b/spec/bundler/support/path.rb index 41b36997b2..a39e46c78a 100644 --- a/spec/bundler/support/path.rb +++ b/spec/bundler/support/path.rb @@ -258,6 +258,10 @@ module Spec end end + def git_root + ruby_core? ? source_root : source_root.parent + end + private def git_ls_files(glob) @@ -278,10 +282,6 @@ module Spec ruby_core? ? "man/bundle* man/gemfile*" : "lib/bundler/man/bundle*.1 lib/bundler/man/gemfile*.5" end - def git_root - ruby_core? ? source_root : source_root.parent - end - def ruby_core_tarball? !git_root.join(".git").directory? end diff --git a/spec/bundler/support/sudo.rb b/spec/bundler/support/sudo.rb index 04e9443945..7b9b392754 100644 --- a/spec/bundler/support/sudo.rb +++ b/spec/bundler/support/sudo.rb @@ -6,6 +6,10 @@ module Spec @which_sudo ||= Bundler.which("sudo") end + def self.write_safe_config + File.write(Spec::Path.tmp("gitconfig"), "[safe]\n\tdirectory = #{Spec::Path.git_root}") + end + def sudo(cmd) raise "sudo not present" unless Sudo.present? sys_exec("sudo #{cmd}") |