mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Sync latest bundler & rubygems development version
This commit is contained in:
parent
9952e9358e
commit
6e2240a2f9
Notes:
git
2021-07-07 13:30:45 +09:00
111 changed files with 1575 additions and 1099 deletions
|
@ -69,6 +69,7 @@ module Bundler
|
|||
autoload :SharedHelpers, File.expand_path("bundler/shared_helpers", __dir__)
|
||||
autoload :Source, File.expand_path("bundler/source", __dir__)
|
||||
autoload :SourceList, File.expand_path("bundler/source_list", __dir__)
|
||||
autoload :SourceMap, File.expand_path("bundler/source_map", __dir__)
|
||||
autoload :SpecSet, File.expand_path("bundler/spec_set", __dir__)
|
||||
autoload :StubSpecification, File.expand_path("bundler/stub_specification", __dir__)
|
||||
autoload :UI, File.expand_path("bundler/ui", __dir__)
|
||||
|
|
|
@ -308,39 +308,19 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
unless Bundler.feature_flag.bundler_3_mode?
|
||||
desc "show GEM [OPTIONS]", "Shows all gems that are part of the bundle, or the path to a given gem"
|
||||
long_desc <<-D
|
||||
Show lists the names and versions of all gems that are required by your Gemfile.
|
||||
Calling show with [GEM] will list the exact location of that gem on your machine.
|
||||
D
|
||||
method_option "paths", :type => :boolean,
|
||||
:banner => "List the paths of all gems that are required by your Gemfile."
|
||||
method_option "outdated", :type => :boolean,
|
||||
:banner => "Show verbose output including whether gems are outdated."
|
||||
def show(gem_name = nil)
|
||||
if ARGV[0] == "show"
|
||||
rest = ARGV[1..-1]
|
||||
|
||||
if flag = rest.find{|arg| ["--verbose", "--outdated"].include?(arg) }
|
||||
Bundler::SharedHelpers.major_deprecation(2, "the `#{flag}` flag to `bundle show` was undocumented and will be removed without replacement")
|
||||
else
|
||||
new_command = rest.find {|arg| !arg.start_with?("--") } ? "info" : "list"
|
||||
|
||||
new_arguments = rest.map do |arg|
|
||||
next arg if arg != "--paths"
|
||||
next "--path" if new_command == "info"
|
||||
end
|
||||
|
||||
old_argv = ARGV.join(" ")
|
||||
new_argv = [new_command, *new_arguments.compact].join(" ")
|
||||
|
||||
Bundler::SharedHelpers.major_deprecation(2, "use `bundle #{new_argv}` instead of `bundle #{old_argv}`")
|
||||
end
|
||||
end
|
||||
require_relative "cli/show"
|
||||
Show.new(options, gem_name).run
|
||||
end
|
||||
desc "show GEM [OPTIONS]", "Shows all gems that are part of the bundle, or the path to a given gem"
|
||||
long_desc <<-D
|
||||
Show lists the names and versions of all gems that are required by your Gemfile.
|
||||
Calling show with [GEM] will list the exact location of that gem on your machine.
|
||||
D
|
||||
method_option "paths", :type => :boolean,
|
||||
:banner => "List the paths of all gems that are required by your Gemfile."
|
||||
method_option "outdated", :type => :boolean,
|
||||
:banner => "Show verbose output including whether gems are outdated."
|
||||
def show(gem_name = nil)
|
||||
SharedHelpers.major_deprecation(2, "the `--outdated` flag to `bundle show` was undocumented and will be removed without replacement") if ARGV.include?("--outdated")
|
||||
require_relative "cli/show"
|
||||
Show.new(options, gem_name).run
|
||||
end
|
||||
|
||||
desc "list", "List all gems in the bundle"
|
||||
|
|
|
@ -11,9 +11,11 @@ module Bundler
|
|||
def run
|
||||
Bundler.settings.set_command_option_if_given :path, options[:path]
|
||||
|
||||
definition = Bundler.definition
|
||||
definition.validate_runtime!
|
||||
|
||||
begin
|
||||
definition = Bundler.definition
|
||||
definition.validate_runtime!
|
||||
definition.resolve_only_locally!
|
||||
not_installed = definition.missing_specs
|
||||
rescue GemNotFound, VersionConflict
|
||||
Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies."
|
||||
|
|
|
@ -58,7 +58,10 @@ module Bundler
|
|||
definition.validate_runtime!
|
||||
|
||||
installer = Installer.install(Bundler.root, definition, options)
|
||||
Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen_bundle?
|
||||
|
||||
Bundler.settings.temporary(:cache_all_platforms => options[:local] ? false : Bundler.settings[:cache_all_platforms]) do
|
||||
Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen_bundle?
|
||||
end
|
||||
|
||||
Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}."
|
||||
Bundler::CLI::Common.output_without_groups_message(:install)
|
||||
|
|
|
@ -21,9 +21,13 @@ module Bundler
|
|||
Bundler::Fetcher.disable_endpoint = options["full-index"]
|
||||
|
||||
update = options[:update]
|
||||
conservative = options[:conservative]
|
||||
|
||||
if update.is_a?(Array) # unlocking specific gems
|
||||
Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update)
|
||||
update = { :gems => update, :lock_shared_dependencies => options[:conservative] }
|
||||
update = { :gems => update, :conservative => conservative }
|
||||
elsif update
|
||||
update = { :conservative => conservative } if conservative
|
||||
end
|
||||
definition = Bundler.definition(update)
|
||||
|
||||
|
|
|
@ -146,17 +146,16 @@ module Bundler
|
|||
end
|
||||
|
||||
def retrieve_active_spec(definition, current_spec)
|
||||
if strict
|
||||
active_spec = definition.find_resolved_spec(current_spec)
|
||||
else
|
||||
active_specs = definition.find_indexed_specs(current_spec)
|
||||
if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
|
||||
active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
|
||||
end
|
||||
active_spec = active_specs.last
|
||||
end
|
||||
active_spec = definition.resolve.find_by_name_and_platform(current_spec.name, current_spec.platform)
|
||||
return unless active_spec
|
||||
|
||||
active_spec
|
||||
return active_spec if strict
|
||||
|
||||
active_specs = active_spec.source.specs.search(current_spec.name).select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
|
||||
if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
|
||||
active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
|
||||
end
|
||||
active_specs.last
|
||||
end
|
||||
|
||||
def print_gems(gems_list)
|
||||
|
|
|
@ -27,9 +27,14 @@ module Bundler
|
|||
raise InvalidOption, "Cannot specify --all along with specific options."
|
||||
end
|
||||
|
||||
conservative = options[:conservative]
|
||||
|
||||
if full_update
|
||||
# We're doing a full update
|
||||
Bundler.definition(true)
|
||||
if conservative
|
||||
Bundler.definition(:conservative => conservative)
|
||||
else
|
||||
Bundler.definition(true)
|
||||
end
|
||||
else
|
||||
unless Bundler.default_lockfile.exist?
|
||||
raise GemfileLockNotFound, "This Bundle hasn't been installed yet. " \
|
||||
|
@ -43,7 +48,7 @@ module Bundler
|
|||
end
|
||||
|
||||
Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
|
||||
:lock_shared_dependencies => options[:conservative],
|
||||
:conservative => conservative,
|
||||
:bundler => options[:bundler])
|
||||
end
|
||||
|
||||
|
|
|
@ -112,17 +112,18 @@ module Bundler
|
|||
end
|
||||
|
||||
@locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
|
||||
@disable_multisource = @locked_gem_sources.all?(&:disable_multisource?)
|
||||
@multisource_allowed = @locked_gem_sources.any?(&:multiple_remotes?) && Bundler.frozen_bundle?
|
||||
|
||||
unless @disable_multisource
|
||||
msg = "Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. You should run `bundle update` or generate your lockfile from scratch."
|
||||
if @multisource_allowed
|
||||
unless sources.aggregate_global_source?
|
||||
msg = "Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."
|
||||
|
||||
Bundler::SharedHelpers.major_deprecation 2, msg
|
||||
Bundler::SharedHelpers.major_deprecation 2, msg
|
||||
end
|
||||
|
||||
@sources.merged_gem_lockfile_sections!
|
||||
end
|
||||
|
||||
@unlock[:gems] ||= []
|
||||
@unlock[:sources] ||= []
|
||||
@unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object
|
||||
@ruby_version.diff(locked_ruby_version_object)
|
||||
|
@ -135,8 +136,10 @@ module Bundler
|
|||
@path_changes = converge_paths
|
||||
@source_changes = converge_sources
|
||||
|
||||
unless @unlock[:lock_shared_dependencies]
|
||||
eager_unlock = expand_dependencies(@unlock[:gems], true)
|
||||
if @unlock[:conservative]
|
||||
@unlock[:gems] ||= @dependencies.map(&:name)
|
||||
else
|
||||
eager_unlock = expand_dependencies(@unlock[:gems] || [], true)
|
||||
@unlock[:gems] = @locked_specs.for(eager_unlock, [], false, false, false).map(&:name)
|
||||
end
|
||||
|
||||
|
@ -161,8 +164,14 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
def disable_multisource?
|
||||
@disable_multisource
|
||||
def multisource_allowed?
|
||||
@multisource_allowed
|
||||
end
|
||||
|
||||
def resolve_only_locally!
|
||||
@remote = false
|
||||
sources.local_only!
|
||||
resolve
|
||||
end
|
||||
|
||||
def resolve_with_cache!
|
||||
|
@ -224,7 +233,6 @@ module Bundler
|
|||
Bundler.ui.debug "The definition is missing #{missing.map(&:full_name)}"
|
||||
true
|
||||
rescue BundlerError => e
|
||||
@index = nil
|
||||
@resolve = nil
|
||||
@specs = nil
|
||||
@gem_version_promoter = nil
|
||||
|
@ -255,7 +263,7 @@ module Bundler
|
|||
|
||||
def specs_for(groups)
|
||||
deps = dependencies_for(groups)
|
||||
specs.for(expand_dependencies(deps))
|
||||
SpecSet.new(specs.for(expand_dependencies(deps)))
|
||||
end
|
||||
|
||||
def dependencies_for(groups)
|
||||
|
@ -287,50 +295,6 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
def index
|
||||
@index ||= Index.build do |idx|
|
||||
dependency_names = @dependencies.map(&:name)
|
||||
|
||||
sources.all_sources.each do |source|
|
||||
source.dependency_names = dependency_names - pinned_spec_names(source)
|
||||
idx.add_source source.specs
|
||||
dependency_names.concat(source.unmet_deps).uniq!
|
||||
end
|
||||
|
||||
double_check_for_index(idx, dependency_names)
|
||||
end
|
||||
end
|
||||
|
||||
# Suppose the gem Foo depends on the gem Bar. Foo exists in Source A. Bar has some versions that exist in both
|
||||
# sources A and B. At this point, the API request will have found all the versions of Bar in source A,
|
||||
# but will not have found any versions of Bar from source B, which is a problem if the requested version
|
||||
# of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for
|
||||
# each spec we found, we add all possible versions from all sources to the index.
|
||||
def double_check_for_index(idx, dependency_names)
|
||||
pinned_names = pinned_spec_names
|
||||
loop do
|
||||
idxcount = idx.size
|
||||
|
||||
names = :names # do this so we only have to traverse to get dependency_names from the index once
|
||||
unmet_dependency_names = lambda do
|
||||
return names unless names == :names
|
||||
new_names = sources.all_sources.map(&:dependency_names_to_double_check)
|
||||
return names = nil if new_names.compact!
|
||||
names = new_names.flatten(1).concat(dependency_names)
|
||||
names.uniq!
|
||||
names -= pinned_names
|
||||
names
|
||||
end
|
||||
|
||||
sources.all_sources.each do |source|
|
||||
source.double_check_for(unmet_dependency_names)
|
||||
end
|
||||
|
||||
break if idxcount == idx.size
|
||||
end
|
||||
end
|
||||
private :double_check_for_index
|
||||
|
||||
def has_rubygems_remotes?
|
||||
sources.rubygems_sources.any? {|s| s.remotes.any? }
|
||||
end
|
||||
|
@ -539,14 +503,6 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
def find_resolved_spec(current_spec)
|
||||
specs.find_by_name_and_platform(current_spec.name, current_spec.platform)
|
||||
end
|
||||
|
||||
def find_indexed_specs(current_spec)
|
||||
index[current_spec.name].select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
|
||||
end
|
||||
|
||||
attr_reader :sources
|
||||
private :sources
|
||||
|
||||
|
@ -563,6 +519,10 @@ module Bundler
|
|||
|
||||
private
|
||||
|
||||
def precompute_source_requirements_for_indirect_dependencies?
|
||||
sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
|
||||
end
|
||||
|
||||
def current_ruby_platform_locked?
|
||||
return false unless generic_local_platform == Gem::Platform::RUBY
|
||||
|
||||
|
@ -677,7 +637,7 @@ module Bundler
|
|||
end
|
||||
|
||||
def converge_rubygems_sources
|
||||
return false if disable_multisource?
|
||||
return false unless multisource_allowed?
|
||||
|
||||
return false if locked_gem_sources.empty?
|
||||
|
||||
|
@ -688,9 +648,9 @@ module Bundler
|
|||
changes = false
|
||||
|
||||
# If there is a RubyGems source in both
|
||||
locked_gem_sources.each do |locked_gem|
|
||||
locked_gem_sources.each do |locked_gem_source|
|
||||
# Merge the remotes from the Gemfile into the Gemfile.lock
|
||||
changes |= locked_gem.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes])
|
||||
changes |= locked_gem_source.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes])
|
||||
end
|
||||
|
||||
changes
|
||||
|
@ -789,8 +749,6 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
unlock_source_unlocks_spec = Bundler.feature_flag.unlock_source_unlocks_spec?
|
||||
|
||||
converged = []
|
||||
@locked_specs.each do |s|
|
||||
# Replace the locked dependency's source with the equivalent source from the Gemfile
|
||||
|
@ -802,11 +760,6 @@ module Bundler
|
|||
next if s.source.nil?
|
||||
next if @unlock[:sources].include?(s.source.name)
|
||||
|
||||
# XXX This is a backwards-compatibility fix to preserve the ability to
|
||||
# unlock a single gem by passing its name via `--source`. See issue #3759
|
||||
# TODO: delete in Bundler 2
|
||||
next if unlock_source_unlocks_spec && @unlock[:sources].include?(s.name)
|
||||
|
||||
# If the spec is from a path source and it doesn't exist anymore
|
||||
# then we unlock it.
|
||||
|
||||
|
@ -838,7 +791,7 @@ module Bundler
|
|||
|
||||
resolve = SpecSet.new(converged)
|
||||
@locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(requested_dependencies & deps), @unlock[:gems], true, true)
|
||||
resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems], false, false, false)
|
||||
resolve = SpecSet.new(resolve.for(expand_dependencies(deps, true), [], false, false, false).reject{|s| @unlock[:gems].include?(s.name) })
|
||||
diff = nil
|
||||
|
||||
# Now, we unlock any sources that do not have anymore gems pinned to it
|
||||
|
@ -909,26 +862,22 @@ module Bundler
|
|||
end
|
||||
|
||||
def source_requirements
|
||||
# Load all specs from remote sources
|
||||
index
|
||||
|
||||
# Record the specs available in each gem's source, so that those
|
||||
# specs will be available later when the resolver knows where to
|
||||
# look for that gemspec (or its dependencies)
|
||||
source_requirements = { :default => sources.default_source }.merge(dependency_source_requirements)
|
||||
source_requirements = if precompute_source_requirements_for_indirect_dependencies?
|
||||
{ :default => sources.default_source }.merge(source_map.all_requirements)
|
||||
else
|
||||
{ :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
|
||||
end
|
||||
metadata_dependencies.each do |dep|
|
||||
source_requirements[dep.name] = sources.metadata_source
|
||||
end
|
||||
source_requirements[:global] = index unless Bundler.feature_flag.disable_multisource?
|
||||
source_requirements[:default_bundler] = source_requirements["bundler"] || source_requirements[:default]
|
||||
source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
|
||||
source_requirements["bundler"] = sources.metadata_source # needs to come last to override
|
||||
source_requirements
|
||||
end
|
||||
|
||||
def pinned_spec_names(skip = nil)
|
||||
dependency_source_requirements.reject {|_, source| source == skip }.keys
|
||||
end
|
||||
|
||||
def requested_groups
|
||||
groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
|
||||
end
|
||||
|
@ -984,16 +933,8 @@ module Bundler
|
|||
Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
|
||||
end
|
||||
|
||||
def dependency_source_requirements
|
||||
@dependency_source_requirements ||= begin
|
||||
source_requirements = {}
|
||||
default = sources.default_source
|
||||
dependencies.each do |dep|
|
||||
dep_source = dep.source || default
|
||||
source_requirements[dep.name] = dep_source
|
||||
end
|
||||
source_requirements
|
||||
end
|
||||
def source_map
|
||||
@source_map ||= SourceMap.new(sources, dependencies)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -31,7 +31,6 @@ module Bundler
|
|||
settings_flag(:auto_clean_without_path) { bundler_3_mode? }
|
||||
settings_flag(:cache_all) { bundler_3_mode? }
|
||||
settings_flag(:default_install_uses_path) { bundler_3_mode? }
|
||||
settings_flag(:disable_multisource) { bundler_3_mode? }
|
||||
settings_flag(:forget_cli_options) { bundler_3_mode? }
|
||||
settings_flag(:global_gem_cache) { bundler_3_mode? }
|
||||
settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
|
||||
|
@ -39,7 +38,6 @@ module Bundler
|
|||
settings_flag(:print_only_version_number) { bundler_3_mode? }
|
||||
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
||||
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
||||
settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
|
||||
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
||||
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
||||
|
||||
|
|
|
@ -116,7 +116,7 @@ module Bundler
|
|||
def bundle_worker(func = nil)
|
||||
@bundle_worker ||= begin
|
||||
worker_name = "Compact Index (#{display_uri.host})"
|
||||
Bundler::Worker.new(Bundler.current_ruby.rbx? ? 1 : 25, worker_name, func)
|
||||
Bundler::Worker.new(Bundler.settings.processor_count, worker_name, func)
|
||||
end
|
||||
@bundle_worker.tap do |worker|
|
||||
worker.instance_variable_set(:@func, func) if func
|
||||
|
|
|
@ -68,8 +68,7 @@ module Bundler
|
|||
raise CertificateFailureError.new(uri)
|
||||
rescue *HTTP_ERRORS => e
|
||||
Bundler.ui.trace e
|
||||
case e.message
|
||||
when /host down:/, /getaddrinfo: nodename nor servname provided/
|
||||
if e.is_a?(SocketError) || e.message =~ /host down:/
|
||||
raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
|
||||
"connection and try again."
|
||||
else
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "base"
|
||||
require "rubygems/remote_fetcher"
|
||||
|
||||
module Bundler
|
||||
class Fetcher
|
||||
|
|
|
@ -49,8 +49,6 @@ module Bundler
|
|||
"Alternatively, you can increase the amount of memory the JVM is able to use by running Bundler with jruby -J-Xmx1024m -S bundle (JRuby defaults to 500MB)."
|
||||
else request_issue_report_for(error)
|
||||
end
|
||||
rescue StandardError
|
||||
raise error
|
||||
end
|
||||
|
||||
def exit_status(error)
|
||||
|
@ -111,8 +109,8 @@ module Bundler
|
|||
First, try this link to see if there are any existing issue reports for this error:
|
||||
#{issues_url(e)}
|
||||
|
||||
If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
|
||||
https://github.com/rubygems/rubygems/issues/new?labels=Bundler
|
||||
If there aren't any reports for this error yet, please copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
|
||||
https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md
|
||||
EOS
|
||||
end
|
||||
|
||||
|
|
|
@ -122,10 +122,9 @@ module Bundler
|
|||
names
|
||||
end
|
||||
|
||||
# returns a list of the dependencies
|
||||
def unmet_dependency_names
|
||||
dependency_names.select do |name|
|
||||
name != "bundler" && search(name).empty?
|
||||
search(name).empty?
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -222,14 +222,7 @@ module Bundler
|
|||
# Parallelization has some issues on Windows, so it's not yet the default
|
||||
return 1 if Gem.win_platform?
|
||||
|
||||
processor_count
|
||||
end
|
||||
|
||||
def processor_count
|
||||
require "etc"
|
||||
Etc.nprocessors
|
||||
rescue StandardError
|
||||
1
|
||||
Bundler.settings.processor_count
|
||||
end
|
||||
|
||||
def load_plugins
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-ADD" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-ADD" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-BINSTUBS" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-BINSTUBS" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CACHE" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-CACHE" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CHECK" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-CHECK" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CLEAN" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-CLEAN" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CONFIG" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-CONFIG" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-config\fR \- Set bundler configuration options
|
||||
|
@ -56,9 +56,6 @@ Executing \fBbundle config unset \-\-local <name> <value>\fR will delete the con
|
|||
.P
|
||||
Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\.
|
||||
.
|
||||
.P
|
||||
Executing \fBbundle config set \-\-local disable_multisource true\fR upgrades the warning about the Gemfile containing multiple primary sources to an error\. Executing \fBbundle config unset disable_multisource\fR downgrades this error to a warning\.
|
||||
.
|
||||
.SH "REMEMBERING OPTIONS"
|
||||
Flags passed to \fBbundle install\fR or the Bundler runtime, such as \fB\-\-path foo\fR or \fB\-\-without production\fR, are remembered between commands and saved to your local application\'s configuration (normally, \fB\./\.bundle/config\fR)\.
|
||||
.
|
||||
|
@ -184,9 +181,6 @@ The following is a list of all configuration keys and their purpose\. You can le
|
|||
\fBdisable_local_revision_check\fR (\fBBUNDLE_DISABLE_LOCAL_REVISION_CHECK\fR): Allow Bundler to use a local git override without checking if the revision present in the lockfile is present in the repository\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
\fBdisable_multisource\fR (\fBBUNDLE_DISABLE_MULTISOURCE\fR): When set, Gemfiles containing multiple sources will produce errors instead of warnings\. Use \fBbundle config unset disable_multisource\fR to unset\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
\fBdisable_shared_gems\fR (\fBBUNDLE_DISABLE_SHARED_GEMS\fR): Stop Bundler from accessing gems installed to RubyGems\' normal location\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
|
@ -280,9 +274,6 @@ The following is a list of all configuration keys and their purpose\. You can le
|
|||
\fBtimeout\fR (\fBBUNDLE_TIMEOUT\fR): The seconds allowed before timing out for network requests\. Defaults to \fB10\fR\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
\fBunlock_source_unlocks_spec\fR (\fBBUNDLE_UNLOCK_SOURCE_UNLOCKS_SPEC\fR): Whether running \fBbundle update \-\-source NAME\fR unlocks a gem with the given name\. Defaults to \fBtrue\fR\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
\fBupdate_requires_all_flag\fR (\fBBUNDLE_UPDATE_REQUIRES_ALL_FLAG\fR): Require passing \fB\-\-all\fR to \fBbundle update\fR when everything should be updated, and disallow passing no options to \fBbundle update\fR\.
|
||||
.
|
||||
.IP "\(bu" 4
|
||||
|
|
|
@ -47,10 +47,6 @@ configuration only from the local application.
|
|||
Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will
|
||||
cause it to ignore all configuration.
|
||||
|
||||
Executing `bundle config set --local disable_multisource true` upgrades the warning about
|
||||
the Gemfile containing multiple primary sources to an error. Executing `bundle
|
||||
config unset disable_multisource` downgrades this error to a warning.
|
||||
|
||||
## REMEMBERING OPTIONS
|
||||
|
||||
Flags passed to `bundle install` or the Bundler runtime, such as `--path foo` or
|
||||
|
@ -178,10 +174,6 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
|
|||
* `disable_local_revision_check` (`BUNDLE_DISABLE_LOCAL_REVISION_CHECK`):
|
||||
Allow Bundler to use a local git override without checking if the revision
|
||||
present in the lockfile is present in the repository.
|
||||
* `disable_multisource` (`BUNDLE_DISABLE_MULTISOURCE`):
|
||||
When set, Gemfiles containing multiple sources will produce errors
|
||||
instead of warnings.
|
||||
Use `bundle config unset disable_multisource` to unset.
|
||||
* `disable_shared_gems` (`BUNDLE_DISABLE_SHARED_GEMS`):
|
||||
Stop Bundler from accessing gems installed to RubyGems' normal location.
|
||||
* `disable_version_check` (`BUNDLE_DISABLE_VERSION_CHECK`):
|
||||
|
@ -268,9 +260,6 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
|
|||
The location where RubyGems installs binstubs. Defaults to `Gem.bindir`.
|
||||
* `timeout` (`BUNDLE_TIMEOUT`):
|
||||
The seconds allowed before timing out for network requests. Defaults to `10`.
|
||||
* `unlock_source_unlocks_spec` (`BUNDLE_UNLOCK_SOURCE_UNLOCKS_SPEC`):
|
||||
Whether running `bundle update --source NAME` unlocks a gem with the given
|
||||
name. Defaults to `true`.
|
||||
* `update_requires_all_flag` (`BUNDLE_UPDATE_REQUIRES_ALL_FLAG`):
|
||||
Require passing `--all` to `bundle update` when everything should be updated,
|
||||
and disallow passing no options to `bundle update`.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-DOCTOR" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-DOCTOR" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-doctor\fR \- Checks the bundle for common problems
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-EXEC" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-EXEC" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-GEM" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-GEM" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INFO" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-INFO" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-info\fR \- Show information for the given gem in your bundle
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INIT" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-INIT" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INJECT" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-INJECT" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INSTALL" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-INSTALL" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-LIST" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-LIST" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-list\fR \- List all the gems in the bundle
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-LOCK" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-LOCK" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OPEN" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-OPEN" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OUTDATED" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-OUTDATED" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-PLATFORM" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-PLATFORM" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-platform\fR \- Displays platform compatibility information
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-PRISTINE" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-PRISTINE" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-REMOVE" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-REMOVE" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-remove\fR \- Removes gems from the Gemfile
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-SHOW" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-SHOW" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-UPDATE" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-UPDATE" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
||||
|
@ -79,7 +79,7 @@ Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR
|
|||
.
|
||||
.TP
|
||||
\fB\-\-conservative\fR
|
||||
Use bundle install conservative update behavior and do not allow shared dependencies to be updated\.
|
||||
Use bundle install conservative update behavior and do not allow indirect dependencies to be updated\.
|
||||
.
|
||||
.SH "UPDATING ALL GEMS"
|
||||
If you run \fBbundle update \-\-all\fR, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
|
||||
|
@ -208,13 +208,13 @@ In this case, the two gems have their own set of dependencies, but they share \f
|
|||
In short, by default, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\.
|
||||
.
|
||||
.P
|
||||
To prevent updating shared dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
|
||||
To prevent updating indirect dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
|
||||
.
|
||||
.P
|
||||
In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running bundle install(1) \fIbundle\-install\.1\.html\fR will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of bundle install(1) \fIbundle\-install\.1\.html\fR\.
|
||||
.
|
||||
.P
|
||||
Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent shared dependencies from being updated\.
|
||||
Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent indirect dependencies from being updated\.
|
||||
.
|
||||
.SH "PATCH LEVEL OPTIONS"
|
||||
Version 1\.14 introduced 4 patch\-level options that will influence how gem versions are resolved\. One of the following options can be used: \fB\-\-patch\fR, \fB\-\-minor\fR or \fB\-\-major\fR\. \fB\-\-strict\fR can be added to further influence resolution\.
|
||||
|
|
|
@ -80,7 +80,7 @@ gem.
|
|||
Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`.
|
||||
|
||||
* `--conservative`:
|
||||
Use bundle install conservative update behavior and do not allow shared dependencies to be updated.
|
||||
Use bundle install conservative update behavior and do not allow indirect dependencies to be updated.
|
||||
|
||||
## UPDATING ALL GEMS
|
||||
|
||||
|
@ -195,7 +195,7 @@ In short, by default, when you update a gem using `bundle update`, bundler will
|
|||
update all dependencies of that gem, including those that are also dependencies
|
||||
of another gem.
|
||||
|
||||
To prevent updating shared dependencies, prior to version 1.14 the only option
|
||||
To prevent updating indirect dependencies, prior to version 1.14 the only option
|
||||
was the `CONSERVATIVE UPDATING` behavior in [bundle install(1)](bundle-install.1.html):
|
||||
|
||||
In this scenario, updating the `thin` version manually in the Gemfile(5),
|
||||
|
@ -203,7 +203,7 @@ and then running [bundle install(1)](bundle-install.1.html) will only update `da
|
|||
but not `rack`. For more information, see the `CONSERVATIVE UPDATING` section
|
||||
of [bundle install(1)](bundle-install.1.html).
|
||||
|
||||
Starting with 1.14, specifying the `--conservative` option will also prevent shared
|
||||
Starting with 1.14, specifying the `--conservative` option will also prevent indirect
|
||||
dependencies from being updated.
|
||||
|
||||
## PATCH LEVEL OPTIONS
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-VIZ" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE\-VIZ" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE" "1" "April 2021" "" ""
|
||||
.TH "BUNDLE" "1" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\fR \- Ruby Dependency Management
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "GEMFILE" "5" "April 2021" "" ""
|
||||
.TH "GEMFILE" "5" "June 2021" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
||||
|
|
|
@ -244,6 +244,20 @@ module Bundler
|
|||
specs.unmet_dependency_names
|
||||
end
|
||||
|
||||
# Used by definition.
|
||||
#
|
||||
# Note: Do not override if you don't know what you are doing.
|
||||
def spec_names
|
||||
specs.spec_names
|
||||
end
|
||||
|
||||
# Used by definition.
|
||||
#
|
||||
# Note: Do not override if you don't know what you are doing.
|
||||
def add_dependency_names(names)
|
||||
@dependencies |= Array(names)
|
||||
end
|
||||
|
||||
# Note: Do not override if you don't know what you are doing.
|
||||
def can_lock?(spec)
|
||||
spec.source == self
|
||||
|
|
|
@ -21,23 +21,19 @@ module Bundler
|
|||
base = SpecSet.new(base) unless base.is_a?(SpecSet)
|
||||
resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
||||
result = resolver.start(requirements)
|
||||
SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") })
|
||||
SpecSet.new(SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") }))
|
||||
end
|
||||
|
||||
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
||||
@source_requirements = source_requirements
|
||||
|
||||
@index_requirements = source_requirements.each_with_object({}) do |source_requirement, index_requirements|
|
||||
name, source = source_requirement
|
||||
index_requirements[name] = name == :global ? source : source.specs
|
||||
end
|
||||
|
||||
@base = base
|
||||
@resolver = Molinillo::Resolver.new(self, self)
|
||||
@search_for = {}
|
||||
@base_dg = Molinillo::DependencyGraph.new
|
||||
aggregate_global_source = @source_requirements[:default].is_a?(Source::RubygemsAggregate)
|
||||
@base.each do |ls|
|
||||
dep = Dependency.new(ls.name, ls.version)
|
||||
ls.source = source_for(ls.name) unless aggregate_global_source
|
||||
@base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
|
||||
end
|
||||
additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
|
||||
|
@ -45,7 +41,6 @@ module Bundler
|
|||
@resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
|
||||
@gem_version_promoter = gem_version_promoter
|
||||
@use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
|
||||
@no_aggregate_global_source = @source_requirements[:global].nil?
|
||||
end
|
||||
|
||||
def start(requirements)
|
||||
|
@ -55,7 +50,6 @@ module Bundler
|
|||
verify_gemfile_dependencies_are_found!(requirements)
|
||||
dg = @resolver.resolve(requirements, @base_dg)
|
||||
dg.
|
||||
tap {|resolved| validate_resolved_specs!(resolved) }.
|
||||
map(&:payload).
|
||||
reject {|sg| sg.name.end_with?("\0") }.
|
||||
map(&:to_specs).
|
||||
|
@ -171,16 +165,11 @@ module Bundler
|
|||
end
|
||||
|
||||
def index_for(dependency)
|
||||
source = @index_requirements[dependency.name]
|
||||
if source
|
||||
source
|
||||
elsif @no_aggregate_global_source
|
||||
Index.build do |idx|
|
||||
dependency.all_sources.each {|s| idx.add_source(s.specs) }
|
||||
end
|
||||
else
|
||||
@index_requirements[:global]
|
||||
end
|
||||
source_for(dependency.name).specs
|
||||
end
|
||||
|
||||
def source_for(name)
|
||||
@source_requirements[name] || @source_requirements[:default]
|
||||
end
|
||||
|
||||
def results_for(dependency, base)
|
||||
|
@ -211,23 +200,10 @@ module Bundler
|
|||
dependencies.map(&:dep) == other_dependencies.map(&:dep)
|
||||
end
|
||||
|
||||
def relevant_sources_for_vertex(vertex)
|
||||
if vertex.root?
|
||||
[@source_requirements[vertex.name]]
|
||||
elsif @no_aggregate_global_source
|
||||
vertex.recursive_predecessors.map do |v|
|
||||
@source_requirements[v.name]
|
||||
end.compact << @source_requirements[:default]
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
def sort_dependencies(dependencies, activated, conflicts)
|
||||
dependencies.sort_by do |dependency|
|
||||
name = name_for(dependency)
|
||||
vertex = activated.vertex_named(name)
|
||||
dependency.all_sources = relevant_sources_for_vertex(vertex)
|
||||
[
|
||||
@base_dg.vertex_named(name) ? 0 : 1,
|
||||
vertex.payload ? 0 : 1,
|
||||
|
@ -369,7 +345,7 @@ module Bundler
|
|||
if other_bundler_required
|
||||
o << "\n\n"
|
||||
|
||||
candidate_specs = @index_requirements[:default_bundler].search(conflict_dependency)
|
||||
candidate_specs = source_for(:default_bundler).specs.search(conflict_dependency)
|
||||
if candidate_specs.any?
|
||||
target_version = candidate_specs.last.version
|
||||
new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
|
||||
|
@ -386,11 +362,7 @@ module Bundler
|
|||
elsif !conflict.existing
|
||||
o << "\n"
|
||||
|
||||
relevant_sources = if conflict.requirement.source
|
||||
[conflict.requirement.source]
|
||||
else
|
||||
conflict.requirement.all_sources
|
||||
end.compact.map(&:to_s).uniq.sort
|
||||
relevant_source = conflict.requirement.source || source_for(name)
|
||||
|
||||
metadata_requirement = name.end_with?("\0")
|
||||
|
||||
|
@ -403,12 +375,10 @@ module Bundler
|
|||
end
|
||||
o << " "
|
||||
|
||||
o << if relevant_sources.empty?
|
||||
"in any of the sources.\n"
|
||||
elsif metadata_requirement
|
||||
"is not available in #{relevant_sources.join(" or ")}"
|
||||
o << if metadata_requirement
|
||||
"is not available in #{relevant_source}"
|
||||
else
|
||||
"in any of the relevant sources:\n #{relevant_sources * "\n "}\n"
|
||||
"in #{relevant_source}.\n"
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
@ -422,27 +392,5 @@ module Bundler
|
|||
end
|
||||
)
|
||||
end
|
||||
|
||||
def validate_resolved_specs!(resolved_specs)
|
||||
resolved_specs.each do |v|
|
||||
name = v.name
|
||||
sources = relevant_sources_for_vertex(v)
|
||||
next unless sources.any?
|
||||
if default_index = sources.index(@source_requirements[:default])
|
||||
sources.delete_at(default_index)
|
||||
end
|
||||
sources.reject! {|s| s.specs.search(name).empty? }
|
||||
sources.uniq!
|
||||
next if sources.size <= 1
|
||||
|
||||
msg = ["The gem '#{name}' was found in multiple relevant sources."]
|
||||
msg.concat sources.map {|s| " * #{s}" }.sort
|
||||
msg << "You #{@no_aggregate_global_source ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
|
||||
msg = msg.join("\n")
|
||||
|
||||
raise SecurityError, msg if @no_aggregate_global_source
|
||||
Bundler.ui.warn "Warning: #{msg}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -105,7 +105,7 @@ module Gem
|
|||
end
|
||||
|
||||
class Dependency
|
||||
attr_accessor :source, :groups, :all_sources
|
||||
attr_accessor :source, :groups
|
||||
|
||||
alias_method :eql?, :==
|
||||
|
||||
|
@ -116,7 +116,7 @@ module Gem
|
|||
end
|
||||
|
||||
def to_yaml_properties
|
||||
instance_variables.reject {|p| ["@source", "@groups", "@all_sources"].include?(p.to_s) }
|
||||
instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
|
||||
end
|
||||
|
||||
def to_lock
|
||||
|
|
|
@ -526,13 +526,14 @@ module Bundler
|
|||
Bundler::Retry.new("download gem from #{uri}").attempts do
|
||||
fetcher.download(spec, uri, path)
|
||||
end
|
||||
rescue Gem::RemoteFetcher::FetchError => e
|
||||
raise Bundler::HTTPError, "Could not download gem from #{uri} due to underlying error <#{e.message}>"
|
||||
end
|
||||
|
||||
def gem_remote_fetcher
|
||||
require "resolv"
|
||||
require "rubygems/remote_fetcher"
|
||||
proxy = configuration[:http_proxy]
|
||||
dns = Resolv::DNS.new
|
||||
Gem::RemoteFetcher.new(proxy, dns)
|
||||
Gem::RemoteFetcher.new(proxy)
|
||||
end
|
||||
|
||||
def gem_from_path(path, policy = nil)
|
||||
|
|
|
@ -20,7 +20,6 @@ module Bundler
|
|||
disable_exec_load
|
||||
disable_local_branch_check
|
||||
disable_local_revision_check
|
||||
disable_multisource
|
||||
disable_shared_gems
|
||||
disable_version_check
|
||||
force_ruby_platform
|
||||
|
@ -45,7 +44,6 @@ module Bundler
|
|||
silence_deprecations
|
||||
silence_root_warning
|
||||
suppress_install_using_messages
|
||||
unlock_source_unlocks_spec
|
||||
update_requires_all_flag
|
||||
use_gem_version_promoter_for_major_updates
|
||||
].freeze
|
||||
|
@ -210,6 +208,13 @@ module Bundler
|
|||
locations
|
||||
end
|
||||
|
||||
def processor_count
|
||||
require "etc"
|
||||
Etc.nprocessors
|
||||
rescue StandardError
|
||||
1
|
||||
end
|
||||
|
||||
# for legacy reasons, in Bundler 2, we do not respect :disable_shared_gems
|
||||
def path
|
||||
configs.each do |_level, settings|
|
||||
|
@ -442,7 +447,20 @@ module Bundler
|
|||
valid_file = file.exist? && !file.size.zero?
|
||||
return {} unless valid_file
|
||||
require_relative "yaml_serializer"
|
||||
YAMLSerializer.load file.read
|
||||
YAMLSerializer.load(file.read).inject({}) do |config, (k, v)|
|
||||
new_k = k
|
||||
|
||||
if k.include?("-")
|
||||
Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
|
||||
"This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
|
||||
"Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."
|
||||
|
||||
new_k = k.gsub("-", "___")
|
||||
end
|
||||
|
||||
config[new_k] = v
|
||||
config
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ module Bundler
|
|||
autoload :Metadata, File.expand_path("source/metadata", __dir__)
|
||||
autoload :Path, File.expand_path("source/path", __dir__)
|
||||
autoload :Rubygems, File.expand_path("source/rubygems", __dir__)
|
||||
autoload :RubygemsAggregate, File.expand_path("source/rubygems_aggregate", __dir__)
|
||||
|
||||
attr_accessor :dependency_names
|
||||
|
||||
|
@ -35,10 +36,16 @@ module Bundler
|
|||
|
||||
def local!; end
|
||||
|
||||
def local_only!; end
|
||||
|
||||
def cached!; end
|
||||
|
||||
def remote!; end
|
||||
|
||||
def add_dependency_names(names)
|
||||
@dependency_names = Array(dependency_names) | Array(names)
|
||||
end
|
||||
|
||||
# it's possible that gems from one source depend on gems from some
|
||||
# other source, so now we download gemspecs and iterate over those
|
||||
# dependencies, looking for gems we don't have info on yet.
|
||||
|
@ -48,6 +55,10 @@ module Bundler
|
|||
specs.dependency_names
|
||||
end
|
||||
|
||||
def spec_names
|
||||
specs.spec_names
|
||||
end
|
||||
|
||||
def include?(other)
|
||||
other == self
|
||||
end
|
||||
|
|
|
@ -26,6 +26,12 @@ module Bundler
|
|||
Array(options["remotes"]).reverse_each {|r| add_remote(r) }
|
||||
end
|
||||
|
||||
def local_only!
|
||||
@specs = nil
|
||||
@allow_local = true
|
||||
@allow_remote = false
|
||||
end
|
||||
|
||||
def local!
|
||||
return if @allow_local
|
||||
|
||||
|
@ -61,13 +67,13 @@ module Bundler
|
|||
o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty?
|
||||
end
|
||||
|
||||
def disable_multisource?
|
||||
@remotes.size <= 1
|
||||
def multiple_remotes?
|
||||
@remotes.size > 1
|
||||
end
|
||||
|
||||
def can_lock?(spec)
|
||||
return super if disable_multisource?
|
||||
spec.source.is_a?(Rubygems)
|
||||
return super unless multiple_remotes?
|
||||
include?(spec.source)
|
||||
end
|
||||
|
||||
def options
|
||||
|
@ -259,8 +265,16 @@ module Bundler
|
|||
!equivalent
|
||||
end
|
||||
|
||||
def spec_names
|
||||
if @allow_remote && dependency_api_available?
|
||||
remote_specs.spec_names
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
def unmet_deps
|
||||
if @allow_remote && api_fetchers.any?
|
||||
if @allow_remote && dependency_api_available?
|
||||
remote_specs.unmet_dependency_names
|
||||
else
|
||||
[]
|
||||
|
@ -276,7 +290,7 @@ module Bundler
|
|||
|
||||
def double_check_for(unmet_dependency_names)
|
||||
return unless @allow_remote
|
||||
return unless api_fetchers.any?
|
||||
return unless dependency_api_available?
|
||||
|
||||
unmet_dependency_names = unmet_dependency_names.call
|
||||
unless unmet_dependency_names.nil?
|
||||
|
@ -298,17 +312,20 @@ module Bundler
|
|||
remote_specs.each do |spec|
|
||||
case spec
|
||||
when EndpointSpecification, Gem::Specification, StubSpecification, LazySpecification
|
||||
names.concat(spec.runtime_dependencies)
|
||||
names.concat(spec.runtime_dependencies.map(&:name))
|
||||
when RemoteSpecification # from the full index
|
||||
return nil
|
||||
else
|
||||
raise "unhandled spec type (#{spec.inspect})"
|
||||
end
|
||||
end
|
||||
names.map!(&:name) if names
|
||||
names
|
||||
end
|
||||
|
||||
def dependency_api_available?
|
||||
api_fetchers.any?
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def credless_remotes
|
||||
|
@ -387,10 +404,6 @@ module Bundler
|
|||
next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
|
||||
s ||= Bundler.rubygems.spec_from_gem(gemfile)
|
||||
s.source = self
|
||||
if Bundler.rubygems.spec_missing_extensions?(s, false)
|
||||
Bundler.ui.debug "Source #{self} is ignoring #{s} because it is missing extensions"
|
||||
next
|
||||
end
|
||||
idx << s
|
||||
end
|
||||
|
||||
|
|
64
lib/bundler/source/rubygems_aggregate.rb
Normal file
64
lib/bundler/source/rubygems_aggregate.rb
Normal file
|
@ -0,0 +1,64 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Bundler
|
||||
class Source
|
||||
class RubygemsAggregate
|
||||
attr_reader :source_map, :sources
|
||||
|
||||
def initialize(sources, source_map)
|
||||
@sources = sources
|
||||
@source_map = source_map
|
||||
|
||||
@index = build_index
|
||||
end
|
||||
|
||||
def specs
|
||||
@index
|
||||
end
|
||||
|
||||
def to_s
|
||||
"any of the sources"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def build_index
|
||||
Index.build do |idx|
|
||||
dependency_names = source_map.pinned_spec_names
|
||||
|
||||
sources.all_sources.each do |source|
|
||||
source.dependency_names = dependency_names - source_map.pinned_spec_names(source)
|
||||
idx.add_source source.specs
|
||||
dependency_names.concat(source.unmet_deps).uniq!
|
||||
end
|
||||
|
||||
double_check_for_index(idx, dependency_names)
|
||||
end
|
||||
end
|
||||
|
||||
# Suppose the gem Foo depends on the gem Bar. Foo exists in Source A. Bar has some versions that exist in both
|
||||
# sources A and B. At this point, the API request will have found all the versions of Bar in source A,
|
||||
# but will not have found any versions of Bar from source B, which is a problem if the requested version
|
||||
# of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for
|
||||
# each spec we found, we add all possible versions from all sources to the index.
|
||||
def double_check_for_index(idx, dependency_names)
|
||||
pinned_names = source_map.pinned_spec_names
|
||||
|
||||
names = :names # do this so we only have to traverse to get dependency_names from the index once
|
||||
unmet_dependency_names = lambda do
|
||||
return names unless names == :names
|
||||
new_names = sources.all_sources.map(&:dependency_names_to_double_check)
|
||||
return names = nil if new_names.compact!
|
||||
names = new_names.flatten(1).concat(dependency_names)
|
||||
names.uniq!
|
||||
names -= pinned_names
|
||||
names
|
||||
end
|
||||
|
||||
sources.all_sources.each do |source|
|
||||
source.double_check_for(unmet_dependency_names)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -21,15 +21,19 @@ module Bundler
|
|||
@rubygems_sources = []
|
||||
@metadata_source = Source::Metadata.new
|
||||
|
||||
@disable_multisource = true
|
||||
@merged_gem_lockfile_sections = false
|
||||
end
|
||||
|
||||
def disable_multisource?
|
||||
@disable_multisource
|
||||
def merged_gem_lockfile_sections?
|
||||
@merged_gem_lockfile_sections
|
||||
end
|
||||
|
||||
def merged_gem_lockfile_sections!
|
||||
@disable_multisource = false
|
||||
@merged_gem_lockfile_sections = true
|
||||
end
|
||||
|
||||
def aggregate_global_source?
|
||||
global_rubygems_source.multiple_remotes?
|
||||
end
|
||||
|
||||
def add_path_source(options = {})
|
||||
|
@ -70,7 +74,11 @@ module Bundler
|
|||
end
|
||||
|
||||
def rubygems_sources
|
||||
@rubygems_sources + [global_rubygems_source]
|
||||
non_global_rubygems_sources + [global_rubygems_source]
|
||||
end
|
||||
|
||||
def non_global_rubygems_sources
|
||||
@rubygems_sources
|
||||
end
|
||||
|
||||
def rubygems_remotes
|
||||
|
@ -81,16 +89,27 @@ module Bundler
|
|||
path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
|
||||
end
|
||||
|
||||
def non_default_explicit_sources
|
||||
all_sources - [default_source, metadata_source]
|
||||
end
|
||||
|
||||
def get(source)
|
||||
source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) }
|
||||
end
|
||||
|
||||
def lock_sources
|
||||
lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
|
||||
if disable_multisource?
|
||||
lock_sources + rubygems_sources.sort_by(&:to_s).uniq
|
||||
lock_other_sources + lock_rubygems_sources
|
||||
end
|
||||
|
||||
def lock_other_sources
|
||||
(path_sources + git_sources + plugin_sources).sort_by(&:to_s)
|
||||
end
|
||||
|
||||
def lock_rubygems_sources
|
||||
if merged_gem_lockfile_sections?
|
||||
[combine_rubygems_sources]
|
||||
else
|
||||
lock_sources << combine_rubygems_sources
|
||||
rubygems_sources.sort_by(&:to_s).uniq
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -104,7 +123,7 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
replacement_rubygems = !disable_multisource? &&
|
||||
replacement_rubygems = merged_gem_lockfile_sections? &&
|
||||
replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
|
||||
@global_rubygems_source = replacement_rubygems if replacement_rubygems
|
||||
|
||||
|
@ -113,6 +132,10 @@ module Bundler
|
|||
false
|
||||
end
|
||||
|
||||
def local_only!
|
||||
all_sources.each(&:local_only!)
|
||||
end
|
||||
|
||||
def cached!
|
||||
all_sources.each(&:cached!)
|
||||
end
|
||||
|
@ -162,6 +185,8 @@ module Bundler
|
|||
end
|
||||
|
||||
def equal_source?(source, other_source)
|
||||
return source.include?(other_source) if source.is_a?(Source::Rubygems) && other_source.is_a?(Source::Rubygems) && !merged_gem_lockfile_sections?
|
||||
|
||||
source == other_source
|
||||
end
|
||||
|
||||
|
|
58
lib/bundler/source_map.rb
Normal file
58
lib/bundler/source_map.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Bundler
|
||||
class SourceMap
|
||||
attr_reader :sources, :dependencies
|
||||
|
||||
def initialize(sources, dependencies)
|
||||
@sources = sources
|
||||
@dependencies = dependencies
|
||||
end
|
||||
|
||||
def pinned_spec_names(skip = nil)
|
||||
direct_requirements.reject {|_, source| source == skip }.keys
|
||||
end
|
||||
|
||||
def all_requirements
|
||||
requirements = direct_requirements.dup
|
||||
|
||||
unmet_deps = sources.non_default_explicit_sources.map do |source|
|
||||
(source.spec_names - pinned_spec_names).each do |indirect_dependency_name|
|
||||
previous_source = requirements[indirect_dependency_name]
|
||||
if previous_source.nil?
|
||||
requirements[indirect_dependency_name] = source
|
||||
else
|
||||
no_ambiguous_sources = Bundler.feature_flag.bundler_3_mode?
|
||||
|
||||
msg = ["The gem '#{indirect_dependency_name}' was found in multiple relevant sources."]
|
||||
msg.concat [previous_source, source].map {|s| " * #{s}" }.sort
|
||||
msg << "You #{no_ambiguous_sources ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
|
||||
msg = msg.join("\n")
|
||||
|
||||
raise SecurityError, msg if no_ambiguous_sources
|
||||
Bundler.ui.warn "Warning: #{msg}"
|
||||
end
|
||||
end
|
||||
|
||||
source.unmet_deps
|
||||
end
|
||||
|
||||
sources.default_source.add_dependency_names(unmet_deps.flatten - requirements.keys)
|
||||
|
||||
requirements
|
||||
end
|
||||
|
||||
def direct_requirements
|
||||
@direct_requirements ||= begin
|
||||
requirements = {}
|
||||
default = sources.default_source
|
||||
dependencies.each do |dep|
|
||||
dep_source = dep.source || default
|
||||
dep_source.add_dependency_names(dep.name)
|
||||
requirements[dep.name] = dep_source
|
||||
end
|
||||
requirements
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -46,11 +46,7 @@ module Bundler
|
|||
specs << spec
|
||||
end
|
||||
|
||||
check ? true : SpecSet.new(specs)
|
||||
end
|
||||
|
||||
def valid_for?(deps)
|
||||
self.for(deps, [], true)
|
||||
check ? true : specs
|
||||
end
|
||||
|
||||
def [](key)
|
||||
|
@ -77,7 +73,7 @@ module Bundler
|
|||
end
|
||||
|
||||
def materialize(deps, missing_specs = nil)
|
||||
materialized = self.for(deps, [], false, true, !missing_specs).to_a
|
||||
materialized = self.for(deps, [], false, true, !missing_specs)
|
||||
|
||||
materialized.group_by(&:source).each do |source, specs|
|
||||
next unless specs.any?{|s| s.is_a?(LazySpecification) }
|
||||
|
|
|
@ -14,9 +14,9 @@ Gem::Specification.new do |spec|
|
|||
<%- if config[:mit] -%>
|
||||
spec.license = "MIT"
|
||||
<%- end -%>
|
||||
spec.required_ruby_version = Gem::Requirement.new(">= <%= config[:required_ruby_version] %>")
|
||||
spec.required_ruby_version = ">= <%= config[:required_ruby_version] %>"
|
||||
|
||||
spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
||||
spec.metadata["allowed_push_host"] = "TODO: Set to 'https://mygemserver.com'"
|
||||
|
||||
spec.metadata["homepage_uri"] = spec.homepage
|
||||
spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
||||
|
|
|
@ -355,6 +355,8 @@ class Gem::Command
|
|||
def add_option(*opts, &handler) # :yields: value, options
|
||||
group_name = Symbol === opts.first ? opts.shift : :options
|
||||
|
||||
raise "Do not pass an empty string in opts" if opts.include?("")
|
||||
|
||||
@option_groups[group_name] << [opts, handler]
|
||||
end
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ class Gem::Commands::BuildCommand < Gem::Command
|
|||
options[:output] = value
|
||||
end
|
||||
|
||||
add_option '-C PATH', '', 'Run as if gem build was started in <PATH> instead of the current working directory.' do |value, options|
|
||||
add_option '-C PATH', 'Run as if gem build was started in <PATH> instead of the current working directory.' do |value, options|
|
||||
options[:build_path] = value
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,37 +7,9 @@ class Gem::Commands::CertCommand < Gem::Command
|
|||
super 'cert', 'Manage RubyGems certificates and signing settings',
|
||||
:add => [], :remove => [], :list => [], :build => [], :sign => []
|
||||
|
||||
OptionParser.accept OpenSSL::X509::Certificate do |certificate_file|
|
||||
begin
|
||||
certificate = OpenSSL::X509::Certificate.new File.read certificate_file
|
||||
rescue Errno::ENOENT
|
||||
raise OptionParser::InvalidArgument, "#{certificate_file}: does not exist"
|
||||
rescue OpenSSL::X509::CertificateError
|
||||
raise OptionParser::InvalidArgument,
|
||||
"#{certificate_file}: invalid X509 certificate"
|
||||
end
|
||||
[certificate, certificate_file]
|
||||
end
|
||||
|
||||
OptionParser.accept OpenSSL::PKey::RSA do |key_file|
|
||||
begin
|
||||
passphrase = ENV['GEM_PRIVATE_KEY_PASSPHRASE']
|
||||
key = OpenSSL::PKey::RSA.new File.read(key_file), passphrase
|
||||
rescue Errno::ENOENT
|
||||
raise OptionParser::InvalidArgument, "#{key_file}: does not exist"
|
||||
rescue OpenSSL::PKey::RSAError
|
||||
raise OptionParser::InvalidArgument, "#{key_file}: invalid RSA key"
|
||||
end
|
||||
|
||||
raise OptionParser::InvalidArgument,
|
||||
"#{key_file}: private key not found" unless key.private?
|
||||
|
||||
key
|
||||
end
|
||||
|
||||
add_option('-a', '--add CERT', OpenSSL::X509::Certificate,
|
||||
'Add a trusted certificate.') do |(cert, _), options|
|
||||
options[:add] << cert
|
||||
add_option('-a', '--add CERT',
|
||||
'Add a trusted certificate.') do |cert_file, options|
|
||||
options[:add] << open_cert(cert_file)
|
||||
end
|
||||
|
||||
add_option('-l', '--list [FILTER]',
|
||||
|
@ -60,15 +32,15 @@ class Gem::Commands::CertCommand < Gem::Command
|
|||
options[:build] << email_address
|
||||
end
|
||||
|
||||
add_option('-C', '--certificate CERT', OpenSSL::X509::Certificate,
|
||||
'Signing certificate for --sign') do |(cert, cert_file), options|
|
||||
options[:issuer_cert] = cert
|
||||
add_option('-C', '--certificate CERT',
|
||||
'Signing certificate for --sign') do |cert_file, options|
|
||||
options[:issuer_cert] = open_cert(cert_file)
|
||||
options[:issuer_cert_file] = cert_file
|
||||
end
|
||||
|
||||
add_option('-K', '--private-key KEY', OpenSSL::PKey::RSA,
|
||||
'Key for --sign or --build') do |key, options|
|
||||
options[:key] = key
|
||||
add_option('-K', '--private-key KEY',
|
||||
'Key for --sign or --build') do |key_file, options|
|
||||
options[:key] = open_private_key(key_file)
|
||||
end
|
||||
|
||||
add_option('-s', '--sign CERT',
|
||||
|
@ -97,7 +69,39 @@ class Gem::Commands::CertCommand < Gem::Command
|
|||
say "Added '#{certificate.subject}'"
|
||||
end
|
||||
|
||||
def check_openssl
|
||||
return if Gem::HAVE_OPENSSL
|
||||
|
||||
alert_error "OpenSSL library is required for the cert command"
|
||||
terminate_interaction 1
|
||||
end
|
||||
|
||||
def open_cert(certificate_file)
|
||||
check_openssl
|
||||
OpenSSL::X509::Certificate.new File.read certificate_file
|
||||
rescue Errno::ENOENT
|
||||
raise OptionParser::InvalidArgument, "#{certificate_file}: does not exist"
|
||||
rescue OpenSSL::X509::CertificateError
|
||||
raise OptionParser::InvalidArgument,
|
||||
"#{certificate_file}: invalid X509 certificate"
|
||||
end
|
||||
|
||||
def open_private_key(key_file)
|
||||
check_openssl
|
||||
passphrase = ENV['GEM_PRIVATE_KEY_PASSPHRASE']
|
||||
key = OpenSSL::PKey::RSA.new File.read(key_file), passphrase
|
||||
raise OptionParser::InvalidArgument,
|
||||
"#{key_file}: private key not found" unless key.private?
|
||||
key
|
||||
rescue Errno::ENOENT
|
||||
raise OptionParser::InvalidArgument, "#{key_file}: does not exist"
|
||||
rescue OpenSSL::PKey::RSAError
|
||||
raise OptionParser::InvalidArgument, "#{key_file}: invalid RSA key"
|
||||
end
|
||||
|
||||
def execute
|
||||
check_openssl
|
||||
|
||||
options[:add].each do |certificate|
|
||||
add_certificate certificate
|
||||
end
|
||||
|
@ -311,4 +315,4 @@ For further reading on signing gems see `ri Gem::Security`.
|
|||
# It's simple, but is all we need
|
||||
email =~ /\A.+@.+\z/
|
||||
end
|
||||
end if Gem::HAVE_OPENSSL
|
||||
end
|
||||
|
|
|
@ -320,7 +320,7 @@ if you believe they were disclosed to a third party.
|
|||
config = load_file(credentials_path).merge(host => api_key)
|
||||
|
||||
dirname = File.dirname credentials_path
|
||||
Dir.mkdir(dirname) unless File.exist? dirname
|
||||
FileUtils.mkdir_p(dirname) unless File.exist? dirname
|
||||
|
||||
Gem.load_yaml
|
||||
|
||||
|
|
|
@ -23,11 +23,11 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
|
|||
# spaces do not work.
|
||||
#
|
||||
# Details: https://github.com/rubygems/rubygems/issues/977#issuecomment-171544940
|
||||
tmp_dest = get_relative_path(tmp_dest, extension_dir)
|
||||
tmp_dest_relative = get_relative_path(tmp_dest.clone, extension_dir)
|
||||
|
||||
Tempfile.open %w[siteconf .rb], extension_dir do |siteconf|
|
||||
siteconf.puts "require 'rbconfig'"
|
||||
siteconf.puts "dest_path = #{tmp_dest.dump}"
|
||||
siteconf.puts "dest_path = #{tmp_dest_relative.dump}"
|
||||
%w[sitearchdir sitelibdir].each do |dir|
|
||||
siteconf.puts "RbConfig::MAKEFILE_CONFIG['#{dir}'] = dest_path"
|
||||
siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path"
|
||||
|
@ -63,8 +63,8 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
|
|||
|
||||
make dest_path, results, extension_dir
|
||||
|
||||
if tmp_dest
|
||||
full_tmp_dest = File.join(extension_dir, tmp_dest)
|
||||
if tmp_dest_relative
|
||||
full_tmp_dest = File.join(extension_dir, tmp_dest_relative)
|
||||
|
||||
# TODO remove in RubyGems 3
|
||||
if Gem.install_extension_in_lib and lib_dir
|
||||
|
|
|
@ -728,6 +728,10 @@ class Gem::Installer
|
|||
raise Gem::InstallError, "#{spec} has an invalid extensions"
|
||||
end
|
||||
|
||||
if spec.platform.to_s =~ /\R/
|
||||
raise Gem::InstallError, "#{spec.platform} is an invalid platform"
|
||||
end
|
||||
|
||||
unless spec.specification_version.to_s =~ /\A\d+\z/
|
||||
raise Gem::InstallError, "#{spec} has an invalid specification_version"
|
||||
end
|
||||
|
|
|
@ -44,7 +44,7 @@ class Gem::Request
|
|||
end
|
||||
|
||||
def self.configure_connection_for_https(connection, cert_files)
|
||||
raise Gem::Exception.new('OpenSSl is not available. Install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources') unless Gem::HAVE_OPENSSL
|
||||
raise Gem::Exception.new('OpenSSL is not available. Install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources') unless Gem::HAVE_OPENSSL
|
||||
|
||||
connection.use_ssl = true
|
||||
connection.verify_mode =
|
||||
|
|
|
@ -2421,7 +2421,6 @@ class Gem::Specification < Gem::BasicSpecification
|
|||
# still have their default values are omitted.
|
||||
|
||||
def to_ruby
|
||||
require_relative 'openssl'
|
||||
mark_version
|
||||
result = []
|
||||
result << "# -*- encoding: utf-8 -*-"
|
||||
|
@ -2455,16 +2454,21 @@ class Gem::Specification < Gem::BasicSpecification
|
|||
:has_rdoc,
|
||||
:default_executable,
|
||||
:metadata,
|
||||
:signing_key,
|
||||
]
|
||||
|
||||
@@attributes.each do |attr_name|
|
||||
next if handled.include? attr_name
|
||||
current_value = self.send(attr_name)
|
||||
if current_value != default_value(attr_name) || self.class.required_attribute?(attr_name)
|
||||
result << " s.#{attr_name} = #{ruby_code current_value}" unless defined?(OpenSSL::PKey::RSA) && current_value.is_a?(OpenSSL::PKey::RSA)
|
||||
result << " s.#{attr_name} = #{ruby_code current_value}"
|
||||
end
|
||||
end
|
||||
|
||||
if String === signing_key
|
||||
result << " s.signing_key = #{signing_key.dump}.freeze"
|
||||
end
|
||||
|
||||
if @installed_by_version
|
||||
result << nil
|
||||
result << " s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
|
||||
|
|
|
@ -124,25 +124,26 @@ class Gem::SpecificationPolicy
|
|||
end
|
||||
|
||||
metadata.each do |key, value|
|
||||
entry = "metadata['#{key}']"
|
||||
if !key.kind_of?(String)
|
||||
error "metadata keys must be a String"
|
||||
end
|
||||
|
||||
if key.size > 128
|
||||
error "metadata key too large (#{key.size} > 128)"
|
||||
error "metadata key is too large (#{key.size} > 128)"
|
||||
end
|
||||
|
||||
if !value.kind_of?(String)
|
||||
error "metadata values must be a String"
|
||||
error "#{entry} value must be a String"
|
||||
end
|
||||
|
||||
if value.size > 1024
|
||||
error "metadata value too large (#{value.size} > 1024)"
|
||||
error "#{entry} value is too large (#{value.size} > 1024)"
|
||||
end
|
||||
|
||||
if METADATA_LINK_KEYS.include? key
|
||||
if value !~ VALID_URI_PATTERN
|
||||
error "metadata['#{key}'] has invalid link: #{value.inspect}"
|
||||
error "#{entry} has invalid link: #{value.inspect}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -261,7 +261,10 @@ class Gem::Uninstaller
|
|||
|
||||
safe_delete { FileUtils.rm_r gem }
|
||||
|
||||
Gem::RDoc.new(spec).remove
|
||||
begin
|
||||
Gem::RDoc.new(spec).remove
|
||||
rescue NameError
|
||||
end
|
||||
|
||||
gemspec = spec.spec_file
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@ class Gem::Licenses
|
|||
AFL-2.1
|
||||
AFL-3.0
|
||||
AGPL-1.0
|
||||
AGPL-1.0-only
|
||||
AGPL-1.0-or-later
|
||||
AGPL-3.0
|
||||
AGPL-3.0-only
|
||||
AGPL-3.0-or-later
|
||||
|
@ -25,6 +27,7 @@ class Gem::Licenses
|
|||
AML
|
||||
AMPAS
|
||||
ANTLR-PD
|
||||
ANTLR-PD-fallback
|
||||
APAFML
|
||||
APL-1.0
|
||||
APSL-1.0
|
||||
|
@ -48,29 +51,41 @@ class Gem::Licenses
|
|||
BSD-2-Clause-FreeBSD
|
||||
BSD-2-Clause-NetBSD
|
||||
BSD-2-Clause-Patent
|
||||
BSD-2-Clause-Views
|
||||
BSD-3-Clause
|
||||
BSD-3-Clause-Attribution
|
||||
BSD-3-Clause-Clear
|
||||
BSD-3-Clause-LBNL
|
||||
BSD-3-Clause-Modification
|
||||
BSD-3-Clause-No-Military-License
|
||||
BSD-3-Clause-No-Nuclear-License
|
||||
BSD-3-Clause-No-Nuclear-License-2014
|
||||
BSD-3-Clause-No-Nuclear-Warranty
|
||||
BSD-3-Clause-Open-MPI
|
||||
BSD-4-Clause
|
||||
BSD-4-Clause-Shortened
|
||||
BSD-4-Clause-UC
|
||||
BSD-Protection
|
||||
BSD-Source-Code
|
||||
BSL-1.0
|
||||
BUSL-1.1
|
||||
Bahyph
|
||||
Barr
|
||||
Beerware
|
||||
BitTorrent-1.0
|
||||
BitTorrent-1.1
|
||||
BlueOak-1.0.0
|
||||
Borceux
|
||||
C-UDA-1.0
|
||||
CAL-1.0
|
||||
CAL-1.0-Combined-Work-Exception
|
||||
CATOSL-1.1
|
||||
CC-BY-1.0
|
||||
CC-BY-2.0
|
||||
CC-BY-2.5
|
||||
CC-BY-3.0
|
||||
CC-BY-3.0-AT
|
||||
CC-BY-3.0-US
|
||||
CC-BY-4.0
|
||||
CC-BY-NC-1.0
|
||||
CC-BY-NC-2.0
|
||||
|
@ -81,6 +96,7 @@ class Gem::Licenses
|
|||
CC-BY-NC-ND-2.0
|
||||
CC-BY-NC-ND-2.5
|
||||
CC-BY-NC-ND-3.0
|
||||
CC-BY-NC-ND-3.0-IGO
|
||||
CC-BY-NC-ND-4.0
|
||||
CC-BY-NC-SA-1.0
|
||||
CC-BY-NC-SA-2.0
|
||||
|
@ -94,12 +110,17 @@ class Gem::Licenses
|
|||
CC-BY-ND-4.0
|
||||
CC-BY-SA-1.0
|
||||
CC-BY-SA-2.0
|
||||
CC-BY-SA-2.0-UK
|
||||
CC-BY-SA-2.1-JP
|
||||
CC-BY-SA-2.5
|
||||
CC-BY-SA-3.0
|
||||
CC-BY-SA-3.0-AT
|
||||
CC-BY-SA-4.0
|
||||
CC-PDDC
|
||||
CC0-1.0
|
||||
CDDL-1.0
|
||||
CDDL-1.1
|
||||
CDL-1.0
|
||||
CDLA-Permissive-1.0
|
||||
CDLA-Sharing-1.0
|
||||
CECILL-1.0
|
||||
|
@ -108,6 +129,11 @@ class Gem::Licenses
|
|||
CECILL-2.1
|
||||
CECILL-B
|
||||
CECILL-C
|
||||
CERN-OHL-1.1
|
||||
CERN-OHL-1.2
|
||||
CERN-OHL-P-2.0
|
||||
CERN-OHL-S-2.0
|
||||
CERN-OHL-W-2.0
|
||||
CNRI-Jython
|
||||
CNRI-Python
|
||||
CNRI-Python-GPL-Compatible
|
||||
|
@ -123,12 +149,14 @@ class Gem::Licenses
|
|||
Cube
|
||||
D-FSL-1.0
|
||||
DOC
|
||||
DRL-1.0
|
||||
DSDP
|
||||
Dotseqn
|
||||
ECL-1.0
|
||||
ECL-2.0
|
||||
EFL-1.0
|
||||
EFL-2.0
|
||||
EPICS
|
||||
EPL-1.0
|
||||
EPL-2.0
|
||||
EUDatagrid
|
||||
|
@ -144,17 +172,32 @@ class Gem::Licenses
|
|||
FTL
|
||||
Fair
|
||||
Frameworx-1.0
|
||||
FreeBSD-DOC
|
||||
FreeImage
|
||||
GD
|
||||
GFDL-1.1
|
||||
GFDL-1.1-invariants-only
|
||||
GFDL-1.1-invariants-or-later
|
||||
GFDL-1.1-no-invariants-only
|
||||
GFDL-1.1-no-invariants-or-later
|
||||
GFDL-1.1-only
|
||||
GFDL-1.1-or-later
|
||||
GFDL-1.2
|
||||
GFDL-1.2-invariants-only
|
||||
GFDL-1.2-invariants-or-later
|
||||
GFDL-1.2-no-invariants-only
|
||||
GFDL-1.2-no-invariants-or-later
|
||||
GFDL-1.2-only
|
||||
GFDL-1.2-or-later
|
||||
GFDL-1.3
|
||||
GFDL-1.3-invariants-only
|
||||
GFDL-1.3-invariants-or-later
|
||||
GFDL-1.3-no-invariants-only
|
||||
GFDL-1.3-no-invariants-or-later
|
||||
GFDL-1.3-only
|
||||
GFDL-1.3-or-later
|
||||
GL2PS
|
||||
GLWTPL
|
||||
GPL-1.0
|
||||
GPL-1.0+
|
||||
GPL-1.0-only
|
||||
|
@ -178,7 +221,10 @@ class Gem::Licenses
|
|||
Glide
|
||||
Glulxe
|
||||
HPND
|
||||
HPND-sell-variant
|
||||
HTMLTIDY
|
||||
HaskellReport
|
||||
Hippocratic-2.1
|
||||
IBM-pibs
|
||||
ICU
|
||||
IJG
|
||||
|
@ -191,6 +237,7 @@ class Gem::Licenses
|
|||
Intel
|
||||
Intel-ACPI
|
||||
Interbase-1.0
|
||||
JPNIC
|
||||
JSON
|
||||
JasPer-2.0
|
||||
LAL-1.2
|
||||
|
@ -221,11 +268,15 @@ class Gem::Licenses
|
|||
LiLiQ-R-1.1
|
||||
LiLiQ-Rplus-1.1
|
||||
Libpng
|
||||
Linux-OpenIB
|
||||
MIT
|
||||
MIT-0
|
||||
MIT-CMU
|
||||
MIT-Modern-Variant
|
||||
MIT-advertising
|
||||
MIT-enna
|
||||
MIT-feh
|
||||
MIT-open-group
|
||||
MITNFA
|
||||
MPL-1.0
|
||||
MPL-1.1
|
||||
|
@ -237,12 +288,18 @@ class Gem::Licenses
|
|||
MakeIndex
|
||||
MirOS
|
||||
Motosoto
|
||||
MulanPSL-1.0
|
||||
MulanPSL-2.0
|
||||
Multics
|
||||
Mup
|
||||
NAIST-2003
|
||||
NASA-1.3
|
||||
NBPL-1.0
|
||||
NCGL-UK-2.0
|
||||
NCSA
|
||||
NGPL
|
||||
NIST-PD
|
||||
NIST-PD-fallback
|
||||
NLOD-1.0
|
||||
NLPL
|
||||
NOSL
|
||||
|
@ -251,6 +308,7 @@ class Gem::Licenses
|
|||
NPOSL-3.0
|
||||
NRL
|
||||
NTP
|
||||
NTP-0
|
||||
Naumen
|
||||
Net-SNMP
|
||||
NetCDF
|
||||
|
@ -258,11 +316,23 @@ class Gem::Licenses
|
|||
Nokia
|
||||
Noweb
|
||||
Nunit
|
||||
O-UDA-1.0
|
||||
OCCT-PL
|
||||
OCLC-2.0
|
||||
ODC-By-1.0
|
||||
ODbL-1.0
|
||||
OFL-1.0
|
||||
OFL-1.0-RFN
|
||||
OFL-1.0-no-RFN
|
||||
OFL-1.1
|
||||
OFL-1.1-RFN
|
||||
OFL-1.1-no-RFN
|
||||
OGC-1.0
|
||||
OGDL-Taiwan-1.0
|
||||
OGL-Canada-2.0
|
||||
OGL-UK-1.0
|
||||
OGL-UK-2.0
|
||||
OGL-UK-3.0
|
||||
OGTSL
|
||||
OLDAP-1.1
|
||||
OLDAP-1.2
|
||||
|
@ -292,7 +362,12 @@ class Gem::Licenses
|
|||
PDDL-1.0
|
||||
PHP-3.0
|
||||
PHP-3.01
|
||||
PSF-2.0
|
||||
Parity-6.0.0
|
||||
Parity-7.0.0
|
||||
Plexus
|
||||
PolyForm-Noncommercial-1.0.0
|
||||
PolyForm-Small-Business-1.0.0
|
||||
PostgreSQL
|
||||
Python-2.0
|
||||
QPL-1.0
|
||||
|
@ -310,15 +385,21 @@ class Gem::Licenses
|
|||
SGI-B-1.0
|
||||
SGI-B-1.1
|
||||
SGI-B-2.0
|
||||
SHL-0.5
|
||||
SHL-0.51
|
||||
SISSL
|
||||
SISSL-1.2
|
||||
SMLNJ
|
||||
SMPPL
|
||||
SNIA
|
||||
SPL-1.0
|
||||
SSH-OpenSSH
|
||||
SSH-short
|
||||
SSPL-1.0
|
||||
SWL
|
||||
Saxpath
|
||||
Sendmail
|
||||
Sendmail-8.23
|
||||
SimPL-2.0
|
||||
Sleepycat
|
||||
Spencer-86
|
||||
|
@ -326,11 +407,15 @@ class Gem::Licenses
|
|||
Spencer-99
|
||||
StandardML-NJ
|
||||
SugarCRM-1.1.3
|
||||
TAPR-OHL-1.0
|
||||
TCL
|
||||
TCP-wrappers
|
||||
TMate
|
||||
TORQUE-1.1
|
||||
TOSL
|
||||
TU-Berlin-1.0
|
||||
TU-Berlin-2.0
|
||||
UCL-1.0
|
||||
UPL-1.0
|
||||
Unicode-DFS-2015
|
||||
Unicode-DFS-2016
|
||||
|
@ -360,16 +445,22 @@ class Gem::Licenses
|
|||
Zimbra-1.3
|
||||
Zimbra-1.4
|
||||
Zlib
|
||||
blessing
|
||||
bzip2-1.0.5
|
||||
bzip2-1.0.6
|
||||
copyleft-next-0.3.0
|
||||
copyleft-next-0.3.1
|
||||
curl
|
||||
diffmark
|
||||
dvipdfm
|
||||
eCos-2.0
|
||||
eGenix
|
||||
etalab-2.0
|
||||
gSOAP-1.3b
|
||||
gnuplot
|
||||
iMatix
|
||||
libpng-2.0
|
||||
libselinux-1.0
|
||||
libtiff
|
||||
mpich2
|
||||
psfrag
|
||||
|
@ -395,12 +486,26 @@ class Gem::Licenses
|
|||
Font-exception-2.0
|
||||
GCC-exception-2.0
|
||||
GCC-exception-3.1
|
||||
GPL-3.0-linking-exception
|
||||
GPL-3.0-linking-source-exception
|
||||
GPL-CC-1.0
|
||||
LGPL-3.0-linking-exception
|
||||
LLVM-exception
|
||||
LZMA-exception
|
||||
Libtool-exception
|
||||
Linux-syscall-note
|
||||
Nokia-Qt-exception-1.1
|
||||
OCCT-exception-1.0
|
||||
OCaml-LGPL-linking-exception
|
||||
OpenJDK-assembly-exception-1.0
|
||||
PS-or-PDF-font-exception-20170817
|
||||
Qt-GPL-exception-1.0
|
||||
Qt-LGPL-exception-1.1
|
||||
Qwt-exception-1.0
|
||||
SHL-2.0
|
||||
SHL-2.1
|
||||
Swift-exception
|
||||
Universal-FOSS-exception-1.0
|
||||
WxWindows-exception-3.1
|
||||
eCos-exception-2.0
|
||||
freertos-exception-2.0
|
||||
|
@ -413,10 +518,10 @@ class Gem::Licenses
|
|||
|
||||
REGEXP = %r{
|
||||
\A
|
||||
(
|
||||
(?:
|
||||
#{Regexp.union(LICENSE_IDENTIFIERS)}
|
||||
\+?
|
||||
(\s WITH \s #{Regexp.union(EXCEPTION_IDENTIFIERS)})?
|
||||
(?:\s WITH \s #{Regexp.union(EXCEPTION_IDENTIFIERS)})?
|
||||
| #{NONSTANDARD}
|
||||
)
|
||||
\Z
|
||||
|
|
|
@ -268,7 +268,7 @@ RSpec.describe Bundler::Definition do
|
|||
bundled_app_lock,
|
||||
updated_deps_in_gemfile,
|
||||
source_list,
|
||||
:gems => ["shared_owner_a"], :lock_shared_dependencies => true
|
||||
:gems => ["shared_owner_a"], :conservative => true
|
||||
)
|
||||
locked = definition.send(:converge_locked_specs).map(&:name)
|
||||
expect(locked).to eq %w[isolated_dep isolated_owner shared_dep shared_owner_b]
|
||||
|
@ -278,33 +278,6 @@ RSpec.describe Bundler::Definition do
|
|||
end
|
||||
end
|
||||
|
||||
describe "find_resolved_spec" do
|
||||
it "with no platform set in SpecSet" do
|
||||
ss = Bundler::SpecSet.new([build_stub_spec("a", "1.0"), build_stub_spec("b", "1.0")])
|
||||
dfn = Bundler::Definition.new(nil, [], mock_source_list, true)
|
||||
dfn.instance_variable_set("@specs", ss)
|
||||
found = dfn.find_resolved_spec(build_spec("a", "0.9", "ruby").first)
|
||||
expect(found.name).to eq "a"
|
||||
expect(found.version.to_s).to eq "1.0"
|
||||
end
|
||||
end
|
||||
|
||||
describe "find_indexed_specs" do
|
||||
it "with no platform set in indexed specs" do
|
||||
index = Bundler::Index.new
|
||||
%w[1.0.0 1.0.1 1.1.0].each {|v| index << build_stub_spec("foo", v) }
|
||||
|
||||
dfn = Bundler::Definition.new(nil, [], mock_source_list, true)
|
||||
dfn.instance_variable_set("@index", index)
|
||||
found = dfn.find_indexed_specs(build_spec("foo", "0.9", "ruby").first)
|
||||
expect(found.length).to eq 3
|
||||
end
|
||||
end
|
||||
|
||||
def build_stub_spec(name, version)
|
||||
Bundler::StubSpecification.new(name, version, nil, nil)
|
||||
end
|
||||
|
||||
def mock_source_list
|
||||
Class.new do
|
||||
def all_sources
|
||||
|
|
|
@ -231,16 +231,7 @@ RSpec.describe Bundler::Fetcher::Downloader do
|
|||
end
|
||||
end
|
||||
|
||||
context "when error message is about getaddrinfo issues" do
|
||||
let(:message) { "getaddrinfo: nodename nor servname provided for http://www.uri-to-fetch.com" }
|
||||
|
||||
it "should raise a Bundler::Fetcher::NetworkDownError" do
|
||||
expect { subject.request(uri, options) }.to raise_error(Bundler::Fetcher::NetworkDownError,
|
||||
/Could not reach host www.uri-to-fetch.com/)
|
||||
end
|
||||
end
|
||||
|
||||
context "when error message is about neither host down or getaddrinfo" do
|
||||
context "when error message is not about host down" do
|
||||
let(:message) { "other error about network" }
|
||||
|
||||
it "should raise a Bundler::HTTPError" do
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rubygems/remote_fetcher"
|
||||
|
||||
RSpec.describe Bundler::Fetcher::Index do
|
||||
let(:downloader) { nil }
|
||||
let(:remote) { nil }
|
||||
|
|
|
@ -312,16 +312,26 @@ that would suck --ehhh=oh geez it looks like i might have broken bundler somehow
|
|||
describe "BUNDLE_ keys format" do
|
||||
let(:settings) { described_class.new(bundled_app(".bundle")) }
|
||||
|
||||
it "converts older keys without double dashes" do
|
||||
it "converts older keys without double underscore" do
|
||||
config("BUNDLE_MY__PERSONAL.RACK" => "~/Work/git/rack")
|
||||
expect(settings["my.personal.rack"]).to eq("~/Work/git/rack")
|
||||
end
|
||||
|
||||
it "converts older keys without trailing slashes and double dashes" do
|
||||
it "converts older keys without trailing slashes and double underscore" do
|
||||
config("BUNDLE_MIRROR__HTTPS://RUBYGEMS.ORG" => "http://rubygems-mirror.org")
|
||||
expect(settings["mirror.https://rubygems.org/"]).to eq("http://rubygems-mirror.org")
|
||||
end
|
||||
|
||||
it "converts older keys with dashes" do
|
||||
config("BUNDLE_MY-PERSONAL-SERVER__ORG" => "my-personal-server.org")
|
||||
expect(Bundler.ui).to receive(:warn).with(
|
||||
"Your #{bundled_app(".bundle/config")} config includes `BUNDLE_MY-PERSONAL-SERVER__ORG`, which contains the dash character (`-`).\n" \
|
||||
"This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
|
||||
"Please edit #{bundled_app(".bundle/config")} and replace any dashes in configuration keys with a triple underscore (`___`)."
|
||||
)
|
||||
expect(settings["my-personal-server.org"]).to eq("my-personal-server.org")
|
||||
end
|
||||
|
||||
it "reads newer keys format properly" do
|
||||
config("BUNDLE_MIRROR__HTTPS://RUBYGEMS__ORG/" => "http://rubygems-mirror.org")
|
||||
expect(settings["mirror.https://rubygems.org/"]).to eq("http://rubygems-mirror.org")
|
||||
|
|
|
@ -298,6 +298,30 @@ RSpec.describe "bundle cache" do
|
|||
expect(out).to include("frozen").or include("deployment")
|
||||
end
|
||||
end
|
||||
|
||||
context "with gems with extensions" do
|
||||
before do
|
||||
build_repo2 do
|
||||
build_gem "racc", "2.0" do |s|
|
||||
s.add_dependency "rake"
|
||||
s.extensions << "Rakefile"
|
||||
s.write "Rakefile", "task(:default) { puts 'INSTALLING rack' }"
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
|
||||
gem "racc"
|
||||
G
|
||||
end
|
||||
|
||||
it "installs them properly from cache to a different path" do
|
||||
bundle "cache"
|
||||
bundle "config set --local path vendor/bundle"
|
||||
bundle "install --local"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RSpec.describe "bundle install with gem sources" do
|
||||
|
@ -317,7 +341,7 @@ RSpec.describe "bundle install with gem sources" do
|
|||
expect(the_bundle).to include_gems "rack 1.0.0"
|
||||
end
|
||||
|
||||
it "does not hit the remote at all" do
|
||||
it "does not hit the remote at all in frozen mode" do
|
||||
build_repo2
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
|
@ -334,6 +358,24 @@ RSpec.describe "bundle install with gem sources" do
|
|||
expect(the_bundle).to include_gems "rack 1.0.0"
|
||||
end
|
||||
|
||||
it "does not hit the remote at all when cache_all_platforms configured" do
|
||||
build_repo2
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
gem "rack"
|
||||
G
|
||||
|
||||
bundle :cache
|
||||
simulate_new_machine
|
||||
FileUtils.rm_rf gem_repo2
|
||||
|
||||
bundle "config set --local cache_all_platforms true"
|
||||
bundle "config set --local path vendor/bundle"
|
||||
bundle "install --local"
|
||||
expect(out).not_to include("Fetching gem metadata")
|
||||
expect(the_bundle).to include_gems "rack 1.0.0"
|
||||
end
|
||||
|
||||
it "does not reinstall already-installed gems" do
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
|
|
|
@ -288,6 +288,66 @@ RSpec.describe "bundle check" do
|
|||
end
|
||||
end
|
||||
|
||||
describe "when using only scoped rubygems sources" do
|
||||
before do
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo1)}" do
|
||||
gem "rack"
|
||||
end
|
||||
G
|
||||
end
|
||||
|
||||
it "returns success when the Gemfile is satisfied" do
|
||||
system_gems "rack-1.0.0", :path => default_bundle_path
|
||||
bundle :check
|
||||
expect(out).to include("The Gemfile's dependencies are satisfied")
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using only scoped rubygems sources with indirect dependencies" do
|
||||
before do
|
||||
build_repo4 do
|
||||
build_gem "depends_on_rack" do |s|
|
||||
s.add_dependency "rack"
|
||||
end
|
||||
|
||||
build_gem "rack"
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}" do
|
||||
gem "depends_on_rack"
|
||||
end
|
||||
G
|
||||
end
|
||||
|
||||
it "returns success when the Gemfile is satisfied and generates a correct lockfile" do
|
||||
system_gems "depends_on_rack-1.0", "rack-1.0", :gem_repo => gem_repo4, :path => default_bundle_path
|
||||
bundle :check
|
||||
expect(out).to include("The Gemfile's dependencies are satisfied")
|
||||
expect(lockfile).to eq <<~L
|
||||
GEM
|
||||
specs:
|
||||
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
depends_on_rack (1.0)
|
||||
rack
|
||||
rack (1.0)
|
||||
|
||||
PLATFORMS
|
||||
#{lockfile_platforms}
|
||||
|
||||
DEPENDENCIES
|
||||
depends_on_rack!
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
end
|
||||
|
||||
describe "BUNDLED WITH" do
|
||||
def lock_with(bundler_version = nil)
|
||||
lock = <<-L
|
||||
|
|
|
@ -533,7 +533,7 @@ RSpec.describe "bundle lock" do
|
|||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "lock --add-platform x86_64-linux", :artifice => :compact_index, :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
bundle "lock --add-platform x86_64-linux", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
end
|
||||
|
||||
context "when an update is available" do
|
||||
|
|
|
@ -205,8 +205,8 @@ RSpec.describe "bundle outdated" do
|
|||
end
|
||||
|
||||
it "works" do
|
||||
bundle :install, :artifice => :compact_index
|
||||
bundle :outdated, :artifice => :compact_index, :raise_on_error => false
|
||||
bundle :install, :artifice => "compact_index"
|
||||
bundle :outdated, :artifice => "compact_index", :raise_on_error => false
|
||||
|
||||
expected_output = <<~TABLE
|
||||
Gem Current Latest Requested Groups
|
||||
|
@ -1292,4 +1292,53 @@ RSpec.describe "bundle outdated" do
|
|||
expect(out).to end_with(expected_output)
|
||||
end
|
||||
end
|
||||
|
||||
context "when a gem is no longer a dependency after a full update" do
|
||||
before do
|
||||
build_repo4 do
|
||||
build_gem "mini_portile2", "2.5.2" do |s|
|
||||
s.add_dependency "net-ftp", "~> 0.1"
|
||||
end
|
||||
|
||||
build_gem "mini_portile2", "2.5.3"
|
||||
|
||||
build_gem "net-ftp", "0.1.2"
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "mini_portile2"
|
||||
G
|
||||
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
mini_portile2 (2.5.2)
|
||||
net-ftp (~> 0.1)
|
||||
net-ftp (0.1.2)
|
||||
|
||||
PLATFORMS
|
||||
#{lockfile_platforms}
|
||||
|
||||
DEPENDENCIES
|
||||
mini_portile2
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
|
||||
it "works" do
|
||||
bundle "outdated", :raise_on_error => false
|
||||
|
||||
expected_output = <<~TABLE.strip
|
||||
Gem Current Latest Requested Groups
|
||||
mini_portile2 2.5.2 2.5.3 >= 0 default
|
||||
TABLE
|
||||
|
||||
expect(out).to end_with(expected_output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -411,18 +411,7 @@ RSpec.describe "bundle update" do
|
|||
build_repo2
|
||||
end
|
||||
|
||||
it "should not update gems not included in the source that happen to have the same name", :bundler => "< 3" do
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
gem "activesupport"
|
||||
G
|
||||
update_repo2 { build_gem "activesupport", "3.0" }
|
||||
|
||||
bundle "update --source activesupport"
|
||||
expect(the_bundle).to include_gem "activesupport 3.0"
|
||||
end
|
||||
|
||||
it "should not update gems not included in the source that happen to have the same name", :bundler => "3" do
|
||||
it "should not update gems not included in the source that happen to have the same name" do
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
gem "activesupport"
|
||||
|
@ -433,19 +422,15 @@ RSpec.describe "bundle update" do
|
|||
expect(the_bundle).not_to include_gem "activesupport 3.0"
|
||||
end
|
||||
|
||||
context "with unlock_source_unlocks_spec set to false" do
|
||||
before { bundle "config set unlock_source_unlocks_spec false" }
|
||||
it "should not update gems not included in the source that happen to have the same name" do
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
gem "activesupport"
|
||||
G
|
||||
update_repo2 { build_gem "activesupport", "3.0" }
|
||||
|
||||
it "should not update gems not included in the source that happen to have the same name" do
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
gem "activesupport"
|
||||
G
|
||||
update_repo2 { build_gem "activesupport", "3.0" }
|
||||
|
||||
bundle "update --source activesupport"
|
||||
expect(the_bundle).not_to include_gems "activesupport 3.0"
|
||||
end
|
||||
bundle "update --source activesupport"
|
||||
expect(the_bundle).not_to include_gems "activesupport 3.0"
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -465,20 +450,7 @@ RSpec.describe "bundle update" do
|
|||
G
|
||||
end
|
||||
|
||||
it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "< 3" do
|
||||
update_repo2 do
|
||||
build_gem "fred", "2.0"
|
||||
build_gem "harry", "2.0" do |s|
|
||||
s.add_dependency "fred"
|
||||
end
|
||||
end
|
||||
|
||||
bundle "update --source harry"
|
||||
expect(the_bundle).to include_gems "harry 2.0"
|
||||
expect(the_bundle).to include_gems "fred 1.0"
|
||||
end
|
||||
|
||||
it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "3" do
|
||||
it "should not update the child dependencies of a gem that has the same name as the source" do
|
||||
update_repo2 do
|
||||
build_gem "fred", "2.0"
|
||||
build_gem "harry", "2.0" do |s|
|
||||
|
@ -510,21 +482,7 @@ RSpec.describe "bundle update" do
|
|||
G
|
||||
end
|
||||
|
||||
it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "< 3" do
|
||||
update_repo2 do
|
||||
build_gem "george", "2.0"
|
||||
build_gem "harry", "2.0" do |s|
|
||||
s.add_dependency "george"
|
||||
end
|
||||
end
|
||||
|
||||
bundle "update --source harry"
|
||||
expect(the_bundle).to include_gems "harry 2.0"
|
||||
expect(the_bundle).to include_gems "fred 1.0"
|
||||
expect(the_bundle).to include_gems "george 1.0"
|
||||
end
|
||||
|
||||
it "should not update the child dependencies of a gem that has the same name as the source", :bundler => "3" do
|
||||
it "should not update the child dependencies of a gem that has the same name as the source" do
|
||||
update_repo2 do
|
||||
build_gem "george", "2.0"
|
||||
build_gem "harry", "2.0" do |s|
|
||||
|
@ -649,8 +607,8 @@ RSpec.describe "bundle update" do
|
|||
end
|
||||
|
||||
it "works" do
|
||||
bundle :install, :artifice => :compact_index
|
||||
bundle "update oj", :artifice => :compact_index
|
||||
bundle :install, :artifice => "compact_index"
|
||||
bundle "update oj", :artifice => "compact_index"
|
||||
|
||||
expect(out).to include("Bundle updated!")
|
||||
expect(the_bundle).to include_gems "oj 3.11.5"
|
||||
|
@ -1106,9 +1064,9 @@ RSpec.describe "bundle update conservative" do
|
|||
gem 'shared_owner_b'
|
||||
G
|
||||
|
||||
lockfile <<-L
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
isolated_dep (2.0.1)
|
||||
isolated_owner (1.0.1)
|
||||
|
@ -1120,12 +1078,12 @@ RSpec.describe "bundle update conservative" do
|
|||
shared_dep (~> 5.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
#{specific_local_platform}
|
||||
|
||||
DEPENDENCIES
|
||||
isolated_owner
|
||||
shared_owner_a
|
||||
shared_owner_b
|
||||
isolated_owner
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
|
@ -1147,7 +1105,42 @@ RSpec.describe "bundle update conservative" do
|
|||
it "should not eagerly unlock with --conservative" do
|
||||
bundle "update --conservative shared_owner_a isolated_owner"
|
||||
|
||||
expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.2", "shared_dep 5.0.1", "shared_owner_a 3.0.2", "shared_owner_b 4.0.1"
|
||||
expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.1", "shared_dep 5.0.1", "shared_owner_a 3.0.2", "shared_owner_b 4.0.1"
|
||||
end
|
||||
|
||||
it "should only update direct dependencies when fully updating with --conservative" do
|
||||
bundle "update --conservative"
|
||||
|
||||
expect(the_bundle).to include_gems "isolated_owner 1.0.2", "isolated_dep 2.0.1", "shared_dep 5.0.1", "shared_owner_a 3.0.2", "shared_owner_b 4.0.2"
|
||||
end
|
||||
|
||||
it "should only change direct dependencies when updating the lockfile with --conservative" do
|
||||
bundle "lock --update --conservative"
|
||||
|
||||
expect(lockfile).to eq <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
isolated_dep (2.0.1)
|
||||
isolated_owner (1.0.2)
|
||||
isolated_dep (~> 2.0)
|
||||
shared_dep (5.0.1)
|
||||
shared_owner_a (3.0.2)
|
||||
shared_dep (~> 5.0)
|
||||
shared_owner_b (4.0.2)
|
||||
shared_dep (~> 5.0)
|
||||
|
||||
PLATFORMS
|
||||
#{specific_local_platform}
|
||||
|
||||
DEPENDENCIES
|
||||
isolated_owner
|
||||
shared_owner_a
|
||||
shared_owner_b
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
|
||||
it "should match bundle install conservative update behavior when not eagerly unlocking" do
|
||||
|
|
|
@ -358,7 +358,7 @@ RSpec.describe "bundle install with groups" do
|
|||
G
|
||||
|
||||
ruby <<-R
|
||||
require "#{lib_dir}/bundler"
|
||||
require "#{entrypoint}"
|
||||
Bundler.setup :default
|
||||
Bundler.require :default
|
||||
puts RACK
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -141,10 +141,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
2.1.4
|
||||
L
|
||||
|
||||
bundle "install --verbose", :artifice => :compact_index, :env => { "BUNDLER_VERSION" => "2.1.4", "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
|
||||
bundle "install --verbose", :artifice => "compact_index", :env => { "BUNDLER_VERSION" => "2.1.4", "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
|
||||
expect(out).to include("Installing libv8 8.4.255.0 (universal-darwin)")
|
||||
|
||||
bundle "add mini_racer --verbose", :artifice => :compact_index, :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
|
||||
bundle "add mini_racer --verbose", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
|
||||
expect(out).to include("Using libv8 8.4.255.0 (universal-darwin)")
|
||||
end
|
||||
|
||||
|
|
|
@ -366,31 +366,6 @@ The checksum of /versions does not match the checksum provided by the server! So
|
|||
expect(the_bundle).to include_gems "activesupport 1.2.3"
|
||||
end
|
||||
|
||||
it "considers all possible versions of dependencies from all api gem sources when using blocks", :bundler => "< 3" do
|
||||
# In this scenario, the gem "somegem" only exists in repo4. It depends on specific version of activesupport that
|
||||
# exists only in repo1. There happens also be a version of activesupport in repo4, but not the one that version 1.0.0
|
||||
# of somegem wants. This test makes sure that bundler actually finds version 1.2.3 of active support in the other
|
||||
# repo and installs it.
|
||||
build_repo4 do
|
||||
build_gem "activesupport", "1.2.0"
|
||||
build_gem "somegem", "1.0.0" do |s|
|
||||
s.add_dependency "activesupport", "1.2.3" # This version exists only in repo1
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<-G
|
||||
source "#{source_uri}"
|
||||
source "#{source_uri}/extra" do
|
||||
gem 'somegem', '1.0.0'
|
||||
end
|
||||
G
|
||||
|
||||
bundle :install, :artifice => "compact_index_extra_api"
|
||||
|
||||
expect(the_bundle).to include_gems "somegem 1.0.0"
|
||||
expect(the_bundle).to include_gems "activesupport 1.2.3"
|
||||
end
|
||||
|
||||
it "prints API output properly with back deps" do
|
||||
build_repo2 do
|
||||
build_gem "back_deps" do |s|
|
||||
|
@ -467,7 +442,7 @@ The checksum of /versions does not match the checksum provided by the server! So
|
|||
expect(the_bundle).to include_gems "foo 1.0"
|
||||
end
|
||||
|
||||
it "fetches again when more dependencies are found in subsequent sources using --deployment", :bundler => "< 3" do
|
||||
it "fetches again when more dependencies are found in subsequent sources using deployment mode", :bundler => "< 3" do
|
||||
build_repo2 do
|
||||
build_gem "back_deps" do |s|
|
||||
s.add_dependency "foo"
|
||||
|
@ -482,8 +457,8 @@ The checksum of /versions does not match the checksum provided by the server! So
|
|||
G
|
||||
|
||||
bundle :install, :artifice => "compact_index_extra"
|
||||
|
||||
bundle "install --deployment", :artifice => "compact_index_extra"
|
||||
bundle "config --set local deployment true"
|
||||
bundle :install, :artifice => "compact_index_extra"
|
||||
expect(the_bundle).to include_gems "back_deps 1.0"
|
||||
end
|
||||
|
||||
|
|
|
@ -338,31 +338,6 @@ RSpec.describe "gemcutter's dependency API" do
|
|||
expect(the_bundle).to include_gems "activesupport 1.2.3"
|
||||
end
|
||||
|
||||
it "considers all possible versions of dependencies from all api gem sources using blocks" do
|
||||
# In this scenario, the gem "somegem" only exists in repo4. It depends on specific version of activesupport that
|
||||
# exists only in repo1. There happens also be a version of activesupport in repo4, but not the one that version 1.0.0
|
||||
# of somegem wants. This test makes sure that bundler actually finds version 1.2.3 of active support in the other
|
||||
# repo and installs it.
|
||||
build_repo4 do
|
||||
build_gem "activesupport", "1.2.0"
|
||||
build_gem "somegem", "1.0.0" do |s|
|
||||
s.add_dependency "activesupport", "1.2.3" # This version exists only in repo1
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<-G
|
||||
source "#{source_uri}"
|
||||
source "#{source_uri}/extra" do
|
||||
gem 'somegem', '1.0.0'
|
||||
end
|
||||
G
|
||||
|
||||
bundle :install, :artifice => "endpoint_extra_api"
|
||||
|
||||
expect(the_bundle).to include_gems "somegem 1.0.0"
|
||||
expect(the_bundle).to include_gems "activesupport 1.2.3"
|
||||
end
|
||||
|
||||
it "prints API output properly with back deps" do
|
||||
build_repo2 do
|
||||
build_gem "back_deps" do |s|
|
||||
|
@ -438,7 +413,7 @@ RSpec.describe "gemcutter's dependency API" do
|
|||
expect(the_bundle).to include_gems "foo 1.0"
|
||||
end
|
||||
|
||||
it "fetches again when more dependencies are found in subsequent sources using --deployment", :bundler => "< 3" do
|
||||
it "fetches again when more dependencies are found in subsequent sources using deployment mode", :bundler => "< 3" do
|
||||
build_repo2 do
|
||||
build_gem "back_deps" do |s|
|
||||
s.add_dependency "foo"
|
||||
|
@ -453,8 +428,8 @@ RSpec.describe "gemcutter's dependency API" do
|
|||
G
|
||||
|
||||
bundle :install, :artifice => "endpoint_extra"
|
||||
|
||||
bundle "install --deployment", :artifice => "endpoint_extra"
|
||||
bundle "config set --local deployment true"
|
||||
bundle :install, :artifice => "endpoint_extra"
|
||||
expect(the_bundle).to include_gems "back_deps 1.0"
|
||||
end
|
||||
|
||||
|
@ -474,7 +449,6 @@ RSpec.describe "gemcutter's dependency API" do
|
|||
G
|
||||
|
||||
bundle :install, :artifice => "endpoint_extra"
|
||||
|
||||
bundle "config set --local deployment true"
|
||||
bundle "install", :artifice => "endpoint_extra"
|
||||
expect(the_bundle).to include_gems "back_deps 1.0"
|
||||
|
|
|
@ -113,6 +113,8 @@ RSpec.describe "global gem caching" do
|
|||
expect(source2_global_cache("rack-0.9.1.gem")).to exist
|
||||
bundle :install, :artifice => "compact_index_no_gem", :raise_on_error => false
|
||||
expect(err).to include("Internal Server Error 500")
|
||||
expect(err).not_to include("please copy and paste the report template above into a new issue")
|
||||
|
||||
# rack 1.0.0 is not installed and rack 0.9.1 is not
|
||||
expect(the_bundle).not_to include_gems "rack 1.0.0"
|
||||
expect(the_bundle).not_to include_gems "rack 0.9.1"
|
||||
|
@ -126,6 +128,8 @@ RSpec.describe "global gem caching" do
|
|||
expect(source2_global_cache("rack-0.9.1.gem")).to exist
|
||||
bundle :install, :artifice => "compact_index_no_gem", :raise_on_error => false
|
||||
expect(err).to include("Internal Server Error 500")
|
||||
expect(err).not_to include("please copy and paste the report template above into a new issue")
|
||||
|
||||
# rack 0.9.1 is not installed and rack 1.0.0 is not
|
||||
expect(the_bundle).not_to include_gems "rack 0.9.1"
|
||||
expect(the_bundle).not_to include_gems "rack 1.0.0"
|
||||
|
|
|
@ -1347,7 +1347,7 @@ RSpec.describe "the lockfile format" do
|
|||
|
||||
expect do
|
||||
ruby <<-RUBY
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
Bundler.setup
|
||||
RUBY
|
||||
end.not_to change { File.mtime(bundled_app_lock) }
|
||||
|
|
|
@ -409,10 +409,38 @@ RSpec.describe "major deprecations" do
|
|||
)
|
||||
end
|
||||
|
||||
it "doesn't show lockfile deprecations if there's a lockfile", :bundler => "< 3" do
|
||||
bundle "install"
|
||||
|
||||
expect(deprecations).to include(
|
||||
"Your Gemfile contains multiple primary sources. " \
|
||||
"Using `source` more than once without a block is a security risk, and " \
|
||||
"may result in installing unexpected gems. To resolve this warning, use " \
|
||||
"a block to indicate which gems should come from the secondary source."
|
||||
)
|
||||
expect(deprecations).not_to include(
|
||||
"Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. " \
|
||||
"Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."
|
||||
)
|
||||
bundle "config set --local frozen true"
|
||||
bundle "install"
|
||||
|
||||
expect(deprecations).to include(
|
||||
"Your Gemfile contains multiple primary sources. " \
|
||||
"Using `source` more than once without a block is a security risk, and " \
|
||||
"may result in installing unexpected gems. To resolve this warning, use " \
|
||||
"a block to indicate which gems should come from the secondary source."
|
||||
)
|
||||
expect(deprecations).not_to include(
|
||||
"Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. " \
|
||||
"Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."
|
||||
)
|
||||
end
|
||||
|
||||
pending "fails with a helpful error", :bundler => "3"
|
||||
end
|
||||
|
||||
context "bundle install with a lockfile with a single rubygems section with multiple remotes" do
|
||||
context "bundle install in frozen mode with a lockfile with a single rubygems section with multiple remotes" do
|
||||
before do
|
||||
build_repo gem_repo3 do
|
||||
build_gem "rack", "0.9.1"
|
||||
|
@ -441,12 +469,14 @@ RSpec.describe "major deprecations" do
|
|||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "config set --local frozen true"
|
||||
end
|
||||
|
||||
it "shows a deprecation", :bundler => "< 3" do
|
||||
bundle "install"
|
||||
|
||||
expect(deprecations).to include("Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. You should run `bundle update` or generate your lockfile from scratch.")
|
||||
expect(deprecations).to include("Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure.")
|
||||
end
|
||||
|
||||
pending "fails with a helpful error", :bundler => "3"
|
||||
|
@ -461,7 +491,7 @@ RSpec.describe "major deprecations" do
|
|||
G
|
||||
|
||||
ruby <<-RUBY
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
|
||||
Bundler.setup
|
||||
Bundler.setup
|
||||
|
@ -569,18 +599,6 @@ The :gist git source is deprecated, and will be removed in the future. Add this
|
|||
G
|
||||
end
|
||||
|
||||
context "without flags" do
|
||||
before do
|
||||
bundle :show
|
||||
end
|
||||
|
||||
it "prints a deprecation warning recommending `bundle list`", :bundler => "< 3" do
|
||||
expect(deprecations).to include("use `bundle list` instead of `bundle show`")
|
||||
end
|
||||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "with --outdated flag" do
|
||||
before do
|
||||
bundle "show --outdated"
|
||||
|
@ -592,54 +610,6 @@ The :gist git source is deprecated, and will be removed in the future. Add this
|
|||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "with --verbose flag" do
|
||||
before do
|
||||
bundle "show --verbose"
|
||||
end
|
||||
|
||||
it "prints a deprecation warning informing about its removal", :bundler => "< 3" do
|
||||
expect(deprecations).to include("the `--verbose` flag to `bundle show` was undocumented and will be removed without replacement")
|
||||
end
|
||||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "with a gem argument" do
|
||||
before do
|
||||
bundle "show rack"
|
||||
end
|
||||
|
||||
it "prints a deprecation warning recommending `bundle info`", :bundler => "< 3" do
|
||||
expect(deprecations).to include("use `bundle info rack` instead of `bundle show rack`")
|
||||
end
|
||||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "with the --paths option" do
|
||||
before do
|
||||
bundle "show --paths"
|
||||
end
|
||||
|
||||
it "prints a deprecation warning recommending `bundle list`", :bundler => "< 3" do
|
||||
expect(deprecations).to include("use `bundle list` instead of `bundle show --paths`")
|
||||
end
|
||||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "with a gem argument and the --paths option" do
|
||||
before do
|
||||
bundle "show rack --paths"
|
||||
end
|
||||
|
||||
it "prints deprecation warning recommending `bundle info`", :bundler => "< 3" do
|
||||
expect(deprecations).to include("use `bundle info rack --path` instead of `bundle show rack --paths`")
|
||||
end
|
||||
|
||||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
end
|
||||
|
||||
context "bundle console" do
|
||||
|
|
|
@ -25,9 +25,9 @@ RSpec.describe "double checking sources", :realworld => true do
|
|||
RUBY
|
||||
|
||||
cmd = <<-RUBY
|
||||
require "#{lib_dir}/bundler"
|
||||
require "#{entrypoint}"
|
||||
require "#{spec_dir}/support/artifice/vcr"
|
||||
require "#{lib_dir}/bundler/inline"
|
||||
require "#{entrypoint}/inline"
|
||||
gemfile(true) do
|
||||
source "https://rubygems.org"
|
||||
gem "rails", path: "."
|
||||
|
|
|
@ -4,9 +4,9 @@ RSpec.describe "real world edgecases", :realworld => true do
|
|||
def rubygems_version(name, requirement)
|
||||
ruby <<-RUBY
|
||||
require "#{spec_dir}/support/artifice/vcr"
|
||||
require "#{lib_dir}/bundler"
|
||||
require "#{lib_dir}/bundler/source/rubygems/remote"
|
||||
require "#{lib_dir}/bundler/fetcher"
|
||||
require "#{entrypoint}"
|
||||
require "#{entrypoint}/source/rubygems/remote"
|
||||
require "#{entrypoint}/fetcher"
|
||||
rubygem = Bundler.ui.silence do
|
||||
source = Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org"))
|
||||
fetcher = Bundler::Fetcher.new(source)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
RSpec.describe "bundler/inline#gemfile" do
|
||||
def script(code, options = {})
|
||||
requires = ["#{lib_dir}/bundler/inline"]
|
||||
requires = ["#{entrypoint}/inline"]
|
||||
requires.unshift "#{spec_dir}/support/artifice/" + options.delete(:artifice) if options.key?(:artifice)
|
||||
requires = requires.map {|r| "require '#{r}'" }.join("\n")
|
||||
ruby("#{requires}\n\n" + code, options)
|
||||
|
@ -93,7 +93,7 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
|
||||
it "lets me use my own ui object" do
|
||||
script <<-RUBY, :artifice => "endpoint"
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
class MyBundlerUI < Bundler::UI::Silent
|
||||
def confirm(msg, newline = nil)
|
||||
puts "CONFIRMED!"
|
||||
|
@ -110,7 +110,7 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
|
||||
it "has an option for quiet installation" do
|
||||
script <<-RUBY, :artifice => "endpoint"
|
||||
require '#{lib_dir}/bundler/inline'
|
||||
require '#{entrypoint}/inline'
|
||||
|
||||
gemfile(true, :quiet => true) do
|
||||
source "https://notaserver.com"
|
||||
|
@ -136,7 +136,7 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
|
||||
it "does not mutate the option argument" do
|
||||
script <<-RUBY
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
options = { :ui => Bundler::UI::Shell.new }
|
||||
gemfile(false, options) do
|
||||
path "#{lib_path}" do
|
||||
|
@ -218,7 +218,7 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
rake
|
||||
|
||||
BUNDLED WITH
|
||||
1.13.6
|
||||
#{Bundler::VERSION}
|
||||
G
|
||||
|
||||
script <<-RUBY
|
||||
|
|
|
@ -82,7 +82,7 @@ RSpec.describe "Bundler.load" do
|
|||
G
|
||||
|
||||
ruby <<-RUBY
|
||||
require "#{lib_dir}/bundler"
|
||||
require "#{entrypoint}"
|
||||
Bundler.setup :default
|
||||
Bundler.require :default
|
||||
puts RACK
|
||||
|
|
|
@ -22,7 +22,7 @@ RSpec.describe "Bundler.setup with multi platform stuff" do
|
|||
|
||||
ruby <<-R
|
||||
begin
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
Bundler.ui.silence { Bundler.setup }
|
||||
rescue Bundler::GemNotFound => e
|
||||
puts "WIN"
|
||||
|
|
|
@ -192,7 +192,7 @@ RSpec.describe "Bundler.require" do
|
|||
G
|
||||
|
||||
cmd = <<-RUBY
|
||||
require '#{lib_dir}/bundler'
|
||||
require '#{entrypoint}'
|
||||
Bundler.require
|
||||
RUBY
|
||||
ruby(cmd)
|
||||
|
|
|
@ -108,8 +108,8 @@ RSpec.describe "Bundler.setup" do
|
|||
context "load order" do
|
||||
def clean_load_path(lp)
|
||||
without_bundler_load_path = ruby("puts $LOAD_PATH").split("\n")
|
||||
lp -= without_bundler_load_path
|
||||
lp.map! {|p| p.sub(/^#{Regexp.union system_gem_path.to_s, default_bundle_path.to_s, lib_dir.to_s}/i, "") }
|
||||
lp -= [*without_bundler_load_path, lib_dir.to_s]
|
||||
lp.map! {|p| p.sub(system_gem_path.to_s, "") }
|
||||
end
|
||||
|
||||
it "puts loaded gems after -I and RUBYLIB", :ruby_repo do
|
||||
|
@ -143,12 +143,8 @@ RSpec.describe "Bundler.setup" do
|
|||
gem "rails"
|
||||
G
|
||||
|
||||
# We require an absolute path because relying on the $LOAD_PATH behaves
|
||||
# inconsistently depending on whether we're in a ruby-core setup (and
|
||||
# bundler's lib is in RUBYLIB) or not.
|
||||
|
||||
ruby <<-RUBY
|
||||
require '#{lib_dir}/bundler'
|
||||
require 'bundler'
|
||||
Bundler.setup
|
||||
puts $LOAD_PATH
|
||||
RUBY
|
||||
|
@ -157,7 +153,6 @@ RSpec.describe "Bundler.setup" do
|
|||
|
||||
expect(load_path).to start_with(
|
||||
"/gems/rails-2.3.2/lib",
|
||||
"/gems/bundler-#{Bundler::VERSION}/lib",
|
||||
"/gems/activeresource-2.3.2/lib",
|
||||
"/gems/activerecord-2.3.2/lib",
|
||||
"/gems/actionpack-2.3.2/lib",
|
||||
|
@ -168,6 +163,8 @@ RSpec.describe "Bundler.setup" do
|
|||
end
|
||||
|
||||
it "falls back to order the load path alphabetically for backwards compatibility" do
|
||||
bundle "config set path.system true"
|
||||
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
gem "weakling"
|
||||
|
@ -175,12 +172,8 @@ RSpec.describe "Bundler.setup" do
|
|||
gem "terranova"
|
||||
G
|
||||
|
||||
# We require an absolute path because relying on the $LOAD_PATH behaves
|
||||
# inconsistently depending on whether we're in a ruby-core setup (and
|
||||
# bundler's lib is in RUBYLIB) or not.
|
||||
|
||||
ruby <<-RUBY
|
||||
require '#{lib_dir}/bundler/setup'
|
||||
require 'bundler/setup'
|
||||
puts $LOAD_PATH
|
||||
RUBY
|
||||
|
||||
|
@ -200,8 +193,6 @@ RSpec.describe "Bundler.setup" do
|
|||
gem "rack"
|
||||
G
|
||||
|
||||
entrypoint = mis_activates_prerelease_default_bundler? ? "#{lib_dir}/bundler" : "bundler"
|
||||
|
||||
ruby <<-R
|
||||
require '#{entrypoint}'
|
||||
|
||||
|
@ -474,8 +465,6 @@ RSpec.describe "Bundler.setup" do
|
|||
|
||||
break_git!
|
||||
|
||||
entrypoint = mis_activates_prerelease_default_bundler? ? "#{lib_dir}/bundler" : "bundler"
|
||||
|
||||
ruby <<-R
|
||||
require "#{entrypoint}"
|
||||
|
||||
|
@ -1126,9 +1115,8 @@ end
|
|||
|
||||
context "is not present" do
|
||||
it "does not change the lock" do
|
||||
entrypoint = mis_activates_prerelease_default_bundler? ? "#{lib_dir}/bundler/setup" : "bundler/setup"
|
||||
lockfile lock_with(nil)
|
||||
ruby "require '#{entrypoint}'"
|
||||
ruby "require '#{entrypoint}/setup'"
|
||||
lockfile_should_be lock_with(nil)
|
||||
end
|
||||
end
|
||||
|
@ -1145,10 +1133,9 @@ end
|
|||
|
||||
context "is older" do
|
||||
it "does not change the lock" do
|
||||
entrypoint = mis_activates_prerelease_default_bundler? ? "#{lib_dir}/bundler/setup" : "bundler/setup"
|
||||
system_gems "bundler-1.10.1"
|
||||
lockfile lock_with("1.10.1")
|
||||
ruby "require '#{entrypoint}'"
|
||||
ruby "require '#{entrypoint}/setup'"
|
||||
lockfile_should_be lock_with("1.10.1")
|
||||
end
|
||||
end
|
||||
|
@ -1219,9 +1206,8 @@ end
|
|||
describe "with gemified standard libraries" do
|
||||
it "does not load Psych" do
|
||||
gemfile ""
|
||||
entrypoint = mis_activates_prerelease_default_bundler? ? "#{lib_dir}/bundler/setup" : "bundler/setup"
|
||||
ruby <<-RUBY
|
||||
require '#{entrypoint}'
|
||||
require '#{entrypoint}/setup'
|
||||
puts defined?(Psych::VERSION) ? Psych::VERSION : "undefined"
|
||||
require 'psych'
|
||||
puts Psych::VERSION
|
||||
|
@ -1422,9 +1408,4 @@ end
|
|||
expect(last_command.stdboth).to eq("true")
|
||||
end
|
||||
end
|
||||
|
||||
# Tested rubygems does not include https://github.com/rubygems/rubygems/pull/2728 and will not always end up activating the current bundler
|
||||
def mis_activates_prerelease_default_bundler?
|
||||
Gem.rubygems_version < Gem::Version.new("3.1.a")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -45,10 +45,14 @@ class Endpoint < Sinatra::Base
|
|||
Pathname.new(ENV["BUNDLER_SPEC_GEM_REPO"])
|
||||
else
|
||||
case request.host
|
||||
when "gem.repo1"
|
||||
Spec::Path.gem_repo1
|
||||
when "gem.repo2"
|
||||
Spec::Path.gem_repo2
|
||||
when "gem.repo3"
|
||||
Spec::Path.gem_repo3
|
||||
when "gem.repo4"
|
||||
Spec::Path.gem_repo4
|
||||
else
|
||||
Spec::Path.gem_repo1
|
||||
end
|
||||
|
|
|
@ -60,7 +60,7 @@ module Spec
|
|||
def run(cmd, *args)
|
||||
opts = args.last.is_a?(Hash) ? args.pop : {}
|
||||
groups = args.map(&:inspect).join(", ")
|
||||
setup = "require '#{lib_dir}/bundler' ; Bundler.ui.silence { Bundler.setup(#{groups}) }"
|
||||
setup = "require '#{entrypoint}' ; Bundler.ui.silence { Bundler.setup(#{groups}) }"
|
||||
ruby([setup, cmd].join(" ; "), opts)
|
||||
end
|
||||
|
||||
|
@ -468,9 +468,8 @@ module Spec
|
|||
ENV["BUNDLER_SPEC_WINDOWS"] = old
|
||||
end
|
||||
|
||||
# workaround for missing https://github.com/rubygems/rubygems/commit/929e92d752baad3a08f3ac92eaec162cb96aedd1
|
||||
def simulate_bundler_version_when_missing_prerelease_default_gem_activation
|
||||
return yield unless Gem.rubygems_version < Gem::Version.new("3.1.0.pre.1")
|
||||
return yield unless rubygems_version_failing_to_activate_bundler_prereleases
|
||||
|
||||
old = ENV["BUNDLER_VERSION"]
|
||||
ENV["BUNDLER_VERSION"] = Bundler::VERSION
|
||||
|
@ -479,15 +478,20 @@ module Spec
|
|||
ENV["BUNDLER_VERSION"] = old
|
||||
end
|
||||
|
||||
# workaround for missing https://github.com/rubygems/rubygems/commit/929e92d752baad3a08f3ac92eaec162cb96aedd1
|
||||
def env_for_missing_prerelease_default_gem_activation
|
||||
if Gem.rubygems_version < Gem::Version.new("3.1.0.pre.1")
|
||||
if rubygems_version_failing_to_activate_bundler_prereleases
|
||||
{ "BUNDLER_VERSION" => Bundler::VERSION }
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
# versions providing a bundler version finder but not including
|
||||
# https://github.com/rubygems/rubygems/commit/929e92d752baad3a08f3ac92eaec162cb96aedd1
|
||||
def rubygems_version_failing_to_activate_bundler_prereleases
|
||||
Gem.rubygems_version < Gem::Version.new("3.1.0.pre.1") && Gem.rubygems_version >= Gem::Version.new("2.7.0")
|
||||
end
|
||||
|
||||
def revision_for(path)
|
||||
sys_exec("git rev-parse HEAD", :dir => path).strip
|
||||
end
|
||||
|
|
|
@ -20,12 +20,11 @@ module Spec
|
|||
default_source = instance_double("Bundler::Source::Rubygems", :specs => @index)
|
||||
source_requirements = { :default => default_source }
|
||||
@deps.each do |d|
|
||||
source_requirements[d.name] = d.source = default_source
|
||||
@platforms.each do |p|
|
||||
source_requirements[d.name] = d.source = default_source
|
||||
deps << Bundler::DepProxy.get_proxy(d, p)
|
||||
end
|
||||
end
|
||||
source_requirements ||= {}
|
||||
args[0] ||= [] # base
|
||||
args[1] ||= Bundler::GemVersionPromoter.new # gem_version_promoter
|
||||
args[2] ||= [] # additional_base_requirements
|
||||
|
|
|
@ -156,7 +156,7 @@ module Spec
|
|||
actual_source = out.split("\n").last
|
||||
next "Expected #{name} (#{version}) to be installed from `#{source}`, was actually from `#{actual_source}`"
|
||||
end
|
||||
next "Command to check forgem inclusion of gem #{full_name} failed"
|
||||
next "Command to check for inclusion of gem #{full_name} failed"
|
||||
end.compact
|
||||
|
||||
@errors.empty?
|
||||
|
|
|
@ -213,6 +213,13 @@ module Spec
|
|||
root.join("lib")
|
||||
end
|
||||
|
||||
# Sometimes rubygems version under test does not include
|
||||
# https://github.com/rubygems/rubygems/pull/2728 and will not always end up
|
||||
# activating the current bundler. In that case, require bundler absolutely.
|
||||
def entrypoint
|
||||
Gem.rubygems_version < Gem::Version.new("3.1.a") ? "#{lib_dir}/bundler" : "bundler"
|
||||
end
|
||||
|
||||
def global_plugin_gem(*args)
|
||||
home ".bundle", "plugin", "gems", *args
|
||||
end
|
||||
|
|
|
@ -544,6 +544,10 @@ class Gem::TestCase < Test::Unit::TestCase
|
|||
Gem.pre_uninstall_hooks.clear
|
||||
end
|
||||
|
||||
def without_any_upwards_gemfiles
|
||||
ENV["BUNDLE_GEMFILE"] = File.join(@tempdir, "Gemfile")
|
||||
end
|
||||
|
||||
##
|
||||
# A git_gem is used with a gem dependencies file. The gem created here
|
||||
# has no files, just a gem specification for the given +name+ and +version+.
|
||||
|
@ -1291,7 +1295,7 @@ Also, a list:
|
|||
end
|
||||
|
||||
def ruby_with_rubygems_in_load_path
|
||||
[Gem.ruby, "-I", File.expand_path("../../lib", __dir__)]
|
||||
[Gem.ruby, "-I", $LOAD_PATH.find{|p| p == File.dirname($LOADED_FEATURES.find{|f| f.end_with?("/rubygems.rb") }) }]
|
||||
end
|
||||
|
||||
def with_clean_path_to_ruby
|
||||
|
@ -1591,7 +1595,7 @@ class Object
|
|||
metaclass.send :undef_method, name
|
||||
metaclass.send :alias_method, name, new_name
|
||||
metaclass.send :undef_method, new_name
|
||||
end unless method_defined?(:stub) # lib/resolv/test_dns.rb also has the same method definition
|
||||
end
|
||||
end
|
||||
|
||||
require_relative 'utilities'
|
||||
|
|
BIN
test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem
Normal file
BIN
test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem
Normal file
Binary file not shown.
|
@ -6,14 +6,12 @@ class TestGemBundlerVersionFinder < Gem::TestCase
|
|||
super
|
||||
|
||||
@argv = ARGV.dup
|
||||
@env = ENV.to_hash.clone
|
||||
ENV.delete("BUNDLER_VERSION")
|
||||
@dollar_0 = $0
|
||||
without_any_upwards_gemfiles
|
||||
end
|
||||
|
||||
def teardown
|
||||
ARGV.replace @argv
|
||||
ENV.replace @env
|
||||
$0 = @dollar_0
|
||||
|
||||
super
|
||||
|
|
|
@ -189,6 +189,18 @@ class TestGemCommand < Gem::TestCase
|
|||
assert_match %r{Usage: gem doit}, @ui.output
|
||||
end
|
||||
|
||||
def test_add_option
|
||||
assert_nothing_raised RuntimeError do
|
||||
@cmd.add_option('--force', 'skip validation of the spec') {|v,o| }
|
||||
end
|
||||
end
|
||||
|
||||
def test_add_option_with_empty
|
||||
assert_raise RuntimeError, "Do not pass an empty string in opts" do
|
||||
@cmd.add_option('', 'skip validation of the spec') {|v,o| }
|
||||
end
|
||||
end
|
||||
|
||||
def test_option_recognition
|
||||
@cmd.add_option('-h', '--help [COMMAND]', 'Get help on COMMAND') do |value, options|
|
||||
options[:help] = true
|
||||
|
|
|
@ -35,6 +35,13 @@ class TestGemCommandsHelpCommand < Gem::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_gem_help_build
|
||||
util_gem 'build' do |out, err|
|
||||
assert_match(/-C PATH *Run as if gem build was started in <PATH>/, out)
|
||||
assert_equal '', err
|
||||
end
|
||||
end
|
||||
|
||||
def test_gem_help_commands
|
||||
mgr = Gem::CommandManager.new
|
||||
|
||||
|
|
|
@ -155,7 +155,6 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|||
@host => @api_key,
|
||||
}
|
||||
|
||||
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
|
||||
File.open Gem.configuration.credentials_path, 'w' do |f|
|
||||
f.write keys.to_yaml
|
||||
end
|
||||
|
@ -190,7 +189,6 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|||
@host => @api_key,
|
||||
}
|
||||
|
||||
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
|
||||
File.open Gem.configuration.credentials_path, 'w' do |f|
|
||||
f.write keys.to_yaml
|
||||
end
|
||||
|
@ -232,7 +230,6 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|||
:rubygems_api_key => @api_key,
|
||||
}
|
||||
|
||||
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
|
||||
File.open Gem.configuration.credentials_path, 'w' do |f|
|
||||
f.write keys.to_yaml
|
||||
end
|
||||
|
@ -274,7 +271,6 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|||
@host => @api_key,
|
||||
}
|
||||
|
||||
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
|
||||
File.open Gem.configuration.credentials_path, 'w' do |f|
|
||||
f.write keys.to_yaml
|
||||
end
|
||||
|
@ -305,7 +301,6 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|||
host => api_key,
|
||||
}
|
||||
|
||||
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
|
||||
File.open Gem.configuration.credentials_path, 'w' do |f|
|
||||
f.write keys.to_yaml
|
||||
end
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue