1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Merge RubyGems and Bundler master

This commit is contained in:
Hiroshi SHIBATA 2022-02-28 10:32:28 +09:00
parent 02ead4a82e
commit ff3d7b720e
Notes: git 2022-02-28 11:39:47 +09:00
20 changed files with 82 additions and 113 deletions

View file

@ -654,7 +654,7 @@ EOF
private
def eval_yaml_gemspec(path, contents)
require_relative "bundler/psyched_yaml"
Kernel.require "psych"
Gem::Specification.from_yaml(contents)
rescue ::Psych::SyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception

View file

@ -180,7 +180,7 @@ module Bundler
scopes = %w[global local].select {|s| options[s] }
case scopes.size
when 0
@scope = "global"
@scope = inside_app? ? "local" : "global"
@explicit_scope = false
when 1
@scope = scopes.first
@ -189,6 +189,15 @@ module Bundler
"The options #{scopes.join " and "} were specified. Please only use one of the switches at a time."
end
end
private
def inside_app?
Bundler.root
true
rescue GemfileNotFound
false
end
end
end
end

View file

@ -135,32 +135,13 @@ module Bundler
end
def normalize_groups
options[:with] &&= options[:with].join(":").tr(" ", ":").split(":")
options[:without] &&= options[:without].join(":").tr(" ", ":").split(":")
check_for_group_conflicts_in_cli_options
Bundler.settings.set_command_option :with, nil if options[:with] == []
Bundler.settings.set_command_option :without, nil if options[:without] == []
with = options.fetch(:with, [])
with |= Bundler.settings[:with].map(&:to_s)
with -= options[:without] if options[:without]
without = options.fetch(:without, [])
without |= Bundler.settings[:without].map(&:to_s)
without -= options[:with] if options[:with]
options[:with] = with
options[:without] = without
unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
# need to nil them out first to get around validation for backwards compatibility
Bundler.settings.set_command_option :without, nil
Bundler.settings.set_command_option :with, nil
Bundler.settings.set_command_option :without, options[:without] - options[:with]
Bundler.settings.set_command_option :with, options[:with]
end
# need to nil them out first to get around validation for backwards compatibility
Bundler.settings.set_command_option :without, nil
Bundler.settings.set_command_option :with, nil
Bundler.settings.set_command_option :without, options[:without]
Bundler.settings.set_command_option :with, options[:with]
end
def normalize_settings
@ -184,7 +165,7 @@ module Bundler
Bundler.settings.set_command_option_if_given :clean, options["clean"]
normalize_groups
normalize_groups if options[:without] || options[:with]
options[:force] = options[:redownload]
end

View file

@ -240,7 +240,7 @@ module Bundler
raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)
con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
if gem_proxy = Gem.configuration[:http_proxy]
con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
end
@ -251,8 +251,8 @@ module Bundler
end
ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
(Bundler.rubygems.configuration.ssl_client_cert if
Bundler.rubygems.configuration.respond_to?(:ssl_client_cert))
(Gem.configuration.ssl_client_cert if
Gem.configuration.respond_to?(:ssl_client_cert))
if ssl_client_cert
pem = File.read(ssl_client_cert)
con.cert = OpenSSL::X509::Certificate.new(pem)
@ -283,8 +283,8 @@ module Bundler
def bundler_cert_store
store = OpenSSL::X509::Store.new
ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
(Bundler.rubygems.configuration.ssl_ca_cert if
Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert))
(Gem.configuration.ssl_ca_cert if
Gem.configuration.respond_to?(:ssl_ca_cert))
if ssl_ca_cert
if File.directory? ssl_ca_cert
store.add_path ssl_ca_cert

View file

@ -1,10 +0,0 @@
# frozen_string_literal: true
begin
require "psych"
rescue LoadError
# Apparently Psych wasn't available. Oh well.
end
# At least load the YAML stdlib, whatever that may be
require "yaml" unless defined?(YAML.dump)

View file

@ -4,14 +4,12 @@ require "pathname"
require "rubygems/specification"
# Possible use in Gem::Specification#source below and require
# shouldn't be deferred.
require "rubygems/source"
require_relative "match_platform"
module Gem
class Specification
include ::Bundler::MatchPlatform
attr_accessor :remote, :location, :relative_loaded_from
remove_method :source
@ -81,6 +79,17 @@ module Gem
gemfile
end
# Backfill missing YAML require when not defined. Fixed since 3.1.0.pre1.
module YamlBackfiller
def to_yaml(opts = {})
Gem.load_yaml unless defined?(::YAML)
super(opts)
end
end
prepend YamlBackfiller
def nondevelopment_dependencies
dependencies - development_dependencies
end
@ -228,9 +237,3 @@ module Gem
end
end
end
module Gem
class Specification
include ::Bundler::MatchPlatform
end
end

View file

@ -104,18 +104,6 @@ module Bundler
obj.to_s
end
def configuration
require_relative "psyched_yaml"
Gem.configuration
rescue Gem::SystemExitException, LoadError => e
Bundler.ui.error "#{e.class}: #{e.message}"
Bundler.ui.trace e
raise
rescue ::Psych::SyntaxError => e
raise YamlSyntaxError.new(e, "Your RubyGems configuration, which is " \
"usually located in ~/.gemrc, contains invalid YAML syntax.")
end
def ruby_engine
Gem.ruby_engine
end
@ -217,7 +205,7 @@ module Bundler
def spec_from_gem(path, policy = nil)
require "rubygems/security"
require_relative "psyched_yaml"
require "psych"
gem_from_path(path, security_policies[policy]).spec
rescue Exception, Gem::Exception, Gem::Security::Exception => e # rubocop:disable Lint/RescueException
if e.is_a?(Gem::Security::Exception) ||
@ -522,7 +510,7 @@ module Bundler
def gem_remote_fetcher
require "rubygems/remote_fetcher"
proxy = configuration[:http_proxy]
proxy = Gem.configuration[:http_proxy]
Gem::RemoteFetcher.new(proxy)
end

View file

@ -367,7 +367,7 @@ module Bundler
def to_array(value)
return [] unless value
value.split(":").map(&:to_sym)
value.tr(" ", ":").split(":").map(&:to_sym)
end
def array_to_s(array)

View file

@ -26,7 +26,7 @@ RSpec.describe Bundler::Fetcher do
context "when Gem.configuration specifies http_proxy " do
let(:proxy) { "http://proxy-example2.com" }
before do
allow(Bundler.rubygems.configuration).to receive(:[]).with(:http_proxy).and_return(proxy)
allow(Gem.configuration).to receive(:[]).with(:http_proxy).and_return(proxy)
end
it "consider Gem.configuration when determine proxy" do
expect(fetcher.http_proxy).to match("http://proxy-example2.com")
@ -113,7 +113,7 @@ RSpec.describe Bundler::Fetcher do
context "when gem ssl configuration is set" do
before do
allow(Bundler.rubygems.configuration).to receive_messages(
allow(Gem.configuration).to receive_messages(
:http_proxy => nil,
:ssl_client_cert => "cert",
:ssl_ca_cert => "ca"

View file

@ -34,13 +34,6 @@ RSpec.describe Bundler::RubygemsIntegration do
end
end
describe "#configuration" do
it "handles Gem::SystemExitException errors" do
allow(Gem).to receive(:configuration) { raise Gem::SystemExitException.new(1) }
expect { Bundler.rubygems.configuration }.to raise_error(Gem::SystemExitException)
end
end
describe "#download_gem" do
let(:bundler_retry) { double(Bundler::Retry) }
let(:uri) { Bundler::URI.parse("https://foo.bar") }
@ -54,7 +47,7 @@ RSpec.describe Bundler::RubygemsIntegration do
it "successfully downloads gem with retries" do
expect(Bundler.rubygems).to receive(:gem_remote_fetcher).and_return(fetcher)
expect(fetcher).to receive(:headers=).with("X-Gemfile-Source" => "https://foo.bar")
expect(fetcher).to receive(:headers=).with({ "X-Gemfile-Source" => "https://foo.bar" })
expect(Bundler::Retry).to receive(:new).with("download gem from #{uri}/").
and_return(bundler_retry)
expect(bundler_retry).to receive(:attempts).and_yield
@ -76,7 +69,7 @@ RSpec.describe Bundler::RubygemsIntegration do
it "sets the 'X-Gemfile-Source' header containing the original source" do
expect(Bundler.rubygems).to receive(:gem_remote_fetcher).twice.and_return(fetcher)
expect(fetcher).to receive(:headers=).with("X-Gemfile-Source" => "http://zombo.com").twice
expect(fetcher).to receive(:headers=).with({ "X-Gemfile-Source" => "http://zombo.com" }).twice
expect(fetcher).to receive(:fetch_path).with(uri + "specs.4.8.gz").and_return(specs_response)
expect(fetcher).to receive(:fetch_path).with(uri + "prerelease_specs.4.8.gz").and_return(prerelease_specs_response)
result = Bundler.rubygems.fetch_all_remote_specs(remote_with_mirror)

View file

@ -43,6 +43,12 @@ RSpec.describe ".bundle/config" do
G
end
it "is local by default" do
bundle "config set foo bar"
expect(bundled_app(".bundle/config")).to exist
expect(home(".bundle/config")).not_to exist
end
it "can be moved with an environment variable" do
ENV["BUNDLE_APP_CONFIG"] = tmp("foo/bar").to_s
bundle "config set --local path vendor/bundle"
@ -67,6 +73,12 @@ RSpec.describe ".bundle/config" do
end
describe "location without a gemfile" do
it "is global by default" do
bundle "config set foo bar"
expect(bundled_app(".bundle/config")).not_to exist
expect(home(".bundle/config")).to exist
end
it "works with an absolute path" do
ENV["BUNDLE_APP_CONFIG"] = tmp("foo/bar").to_s
bundle "config set --local path vendor/bundle"
@ -359,7 +371,7 @@ E
it "doesn't return quotes around values" do
bundle "config set foo '1'"
run "puts Bundler.settings.send(:global_config_file).read"
run "puts Bundler.settings.send(:local_config_file).read"
expect(out).to include('"1"')
run "puts Bundler.settings[:foo]"
expect(out).to eq("1")

View file

@ -291,7 +291,7 @@ RSpec.describe "bundle exec" do
end
end
bundle "config set path.system true"
bundle "config set --global path.system true"
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
@ -775,9 +775,7 @@ RSpec.describe "bundle exec" do
end
let(:expected_err) { "" }
let(:exit_code) do
# signal mask 128 + plus signal 15 -> TERM
# this is specified by C99
128 + 15
exit_status_for_signal(Signal.list["TERM"])
end
it "runs" do

View file

@ -99,7 +99,7 @@ Usage: "bundle inject GEM VERSION"
it "restores frozen afterwards" do
bundle "inject 'rack-obama' '> 0'"
config = YAML.load(bundled_app(".bundle/config").read)
config = Psych.load(bundled_app(".bundle/config").read)
expect(config["BUNDLE_DEPLOYMENT"] || config["BUNDLE_FROZEN"]).to eq("true")
end

View file

@ -157,9 +157,9 @@ RSpec.describe "bundle lock" do
gem "rack_middleware", :group => "test"
G
bundle "config set without test"
bundle "config set path .bundle"
bundle "config set path vendor/bundle"
bundle "lock"
expect(bundled_app(".bundle")).not_to exist
expect(bundled_app("vendor/bundle")).not_to exist
end
# see update_spec for more coverage on same options. logic is shared so it's not necessary

View file

@ -91,17 +91,8 @@ RSpec.describe "bundle install with groups" do
expect(the_bundle).to include_gems "rack 1.0.0", :groups => [:default]
end
it "respects global `without` configuration, and saves it locally", :bundler => "< 3" do
bundle "config set without emo"
bundle :install
expect(the_bundle).to include_gems "rack 1.0.0", :groups => [:default]
bundle "config list"
expect(out).to include("Set for your local app (#{bundled_app(".bundle/config")}): [:emo]")
expect(out).to include("Set for the current user (#{home(".bundle/config")}): [:emo]")
end
it "respects global `without` configuration, but does not save it locally", :bundler => "3" do
bundle "config set without emo"
it "respects global `without` configuration, but does not save it locally" do
bundle "config set --global without emo"
bundle :install
expect(the_bundle).to include_gems "rack 1.0.0", :groups => [:default]
bundle "config list"

View file

@ -120,8 +120,9 @@ RSpec.shared_examples "bundle install --standalone" do
realworld_system_gems "tsort --version 0.1.0"
necessary_system_gems = ["optparse --version 0.1.1", "psych --version 3.3.2", "yaml --version 0.1.1", "logger --version 1.4.3", "etc --version 1.2.0", "stringio --version 3.0.0"]
necessary_system_gems = ["optparse --version 0.1.1", "psych --version 3.3.2", "logger --version 1.4.3", "etc --version 1.2.0", "stringio --version 3.0.0"]
necessary_system_gems += ["shellwords --version 0.1.0", "base64 --version 0.1.0", "resolv --version 0.2.1"] if Gem.rubygems_version < Gem::Version.new("3.3.a")
necessary_system_gems += ["yaml --version 0.1.1"] if Gem.rubygems_version < Gem::Version.new("3.4.a")
realworld_system_gems(*necessary_system_gems, :path => scoped_gem_path(bundled_app("bundle")))
build_gem "foo", "1.0.0", :to_system => true, :default => true do |s|

View file

@ -46,7 +46,7 @@ RSpec.describe "parallel", :realworld => true do
end
it "works with --standalone" do
gemfile <<-G, :standalone => true
gemfile <<-G
source "https://rubygems.org"
gem "diff-lcs"
G

View file

@ -1,6 +1,6 @@
# frozen_string_literal: true
require "bundler/psyched_yaml"
require "psych"
require "bundler/vendored_fileutils"
require "bundler/vendored_uri"
require "digest"

View file

@ -199,7 +199,7 @@ module Spec
command_execution.exitstatus = if status.exited?
status.exitstatus
elsif status.signaled?
128 + status.termsig
exit_status_for_signal(status.termsig)
end
end
@ -225,7 +225,7 @@ module Spec
end
def config(config = nil, path = bundled_app(".bundle/config"))
return YAML.load_file(path) unless config
return Psych.load_file(path) unless config
FileUtils.mkdir_p(File.dirname(path))
File.open(path, "w") do |f|
f.puts config.to_yaml
@ -237,33 +237,31 @@ module Spec
config(config, home(".bundle/config"))
end
def create_file(*args)
path = bundled_app(args.shift)
path = args.shift if args.first.is_a?(Pathname)
str = args.shift || ""
def create_file(path, contents = "")
path = Pathname.new(path).expand_path(bundled_app) unless path.is_a?(Pathname)
path.dirname.mkpath
File.open(path.to_s, "w") do |f|
f.puts strip_whitespace(str)
f.puts strip_whitespace(contents)
end
end
def gemfile(*args)
contents = args.shift
contents = args.pop
if contents.nil?
File.open(bundled_app_gemfile, "r", &:read)
else
create_file("Gemfile", contents, *args)
create_file(args.pop || "Gemfile", contents)
end
end
def lockfile(*args)
contents = args.shift
contents = args.pop
if contents.nil?
File.open(bundled_app_lock, "r", &:read)
else
create_file("Gemfile.lock", contents, *args)
create_file(args.pop || "Gemfile.lock", contents)
end
end
@ -274,8 +272,8 @@ module Spec
end
def install_gemfile(*args)
opts = args.last.is_a?(Hash) ? args.pop : {}
gemfile(*args)
opts = args.last.is_a?(Hash) ? args.last : {}
bundle :install, opts
end
@ -560,6 +558,11 @@ module Spec
port
end
def exit_status_for_signal(signal_number)
# For details see: https://en.wikipedia.org/wiki/Exit_status#Shell_and_scripts
128 + signal_number
end
private
def git_root_dir?

View file

@ -27,7 +27,7 @@ GEM
rspec-expectations (3.10.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-mocks (3.10.2)
rspec-mocks (3.10.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-support (3.10.3)