mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Merge the latest stable versions of RubyGems and Bundler to Ruby 3.2.x (#7061)
[Bug #19350] * Merge RubyGems-3.4.2 and Bundler-2.4.2 * Merge RubyGems-3.4.3 and Bundler-2.4.3 * Generate parser-text.rb of racc when sync it * Ignore LICENSE files of libraries vendored in rubygems [ci skip] * Adjust spec of bundler like as `sync_default_gems` [ci skip] * Fixed a typo * Removed vendored LICENSE file. * Update LEGAL sections for pub_grub * Merge RubyGems-3.4.4 and Bundler-2.4.4 * Merge RubyGems-3.4.5 and Bundler-2.4.5 Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
This commit is contained in:
parent
fee5b8f263
commit
a22eca8231
105 changed files with 1337 additions and 752 deletions
10
LEGAL
10
LEGAL
|
@ -979,7 +979,6 @@ mentioned below.
|
|||
{MIT License}[rdoc-label:label-MIT+License]
|
||||
|
||||
[lib/rubygems/resolver/molinillo]
|
||||
[lib/bundler/vendor/molinillo]
|
||||
|
||||
molinillo is under the following license.
|
||||
|
||||
|
@ -988,6 +987,15 @@ mentioned below.
|
|||
|
||||
{MIT License}[rdoc-label:label-MIT+License]
|
||||
|
||||
[lib/bundler/vendor/pub_grub]
|
||||
|
||||
pub_grub is under the following license.
|
||||
|
||||
>>>
|
||||
Copyright (c) 2018 John Hawthorn
|
||||
|
||||
{MIT License}[rdoc-label:label-MIT+License]
|
||||
|
||||
[lib/bundler/vendor/connection_pool]
|
||||
|
||||
connection_pool is under the following license.
|
||||
|
|
|
@ -509,6 +509,7 @@ module Bundler
|
|||
subcommand "config", Config
|
||||
|
||||
desc "open GEM", "Opens the source directory of the given bundled gem"
|
||||
method_option "path", :type => :string, :lazy_default => "", :banner => "Open relative path of the gem source."
|
||||
def open(name)
|
||||
require_relative "cli/open"
|
||||
Open.new(options, name).run
|
||||
|
|
|
@ -2,23 +2,25 @@
|
|||
|
||||
module Bundler
|
||||
class CLI::Open
|
||||
attr_reader :options, :name
|
||||
attr_reader :options, :name, :path
|
||||
def initialize(options, name)
|
||||
@options = options
|
||||
@name = name
|
||||
@path = options[:path] unless options[:path].nil?
|
||||
end
|
||||
|
||||
def run
|
||||
raise InvalidOption, "Cannot specify `--path` option without a value" if !@path.nil? && @path.empty?
|
||||
editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }
|
||||
return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
|
||||
return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match)
|
||||
if spec.default_gem?
|
||||
Bundler.ui.info "Unable to open #{name} because it's a default gem, so the directory it would normally be installed to does not exist."
|
||||
else
|
||||
path = spec.full_gem_path
|
||||
Dir.chdir(path) do
|
||||
root_path = spec.full_gem_path
|
||||
Dir.chdir(root_path) do
|
||||
require "shellwords"
|
||||
command = Shellwords.split(editor) + [path]
|
||||
command = Shellwords.split(editor) << File.join([root_path, path].compact)
|
||||
Bundler.with_original_env do
|
||||
system(*command)
|
||||
end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
|
||||
|
|
|
@ -79,6 +79,7 @@ module Bundler
|
|||
@locked_bundler_version = nil
|
||||
@locked_ruby_version = nil
|
||||
@new_platform = nil
|
||||
@removed_platform = nil
|
||||
|
||||
if lockfile && File.exist?(lockfile)
|
||||
@lockfile_contents = Bundler.read_file(lockfile)
|
||||
|
@ -129,7 +130,7 @@ module Bundler
|
|||
end
|
||||
@unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
|
||||
|
||||
add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
|
||||
add_current_platform unless Bundler.frozen_bundle?
|
||||
|
||||
converge_path_sources_to_gemspec_sources
|
||||
@path_changes = converge_paths
|
||||
|
@ -158,13 +159,6 @@ module Bundler
|
|||
resolve
|
||||
end
|
||||
|
||||
def resolve_prefering_local!
|
||||
@prefer_local = true
|
||||
@remote = true
|
||||
sources.remote!
|
||||
resolve
|
||||
end
|
||||
|
||||
def resolve_with_cache!
|
||||
sources.cached!
|
||||
resolve
|
||||
|
@ -176,6 +170,23 @@ module Bundler
|
|||
resolve
|
||||
end
|
||||
|
||||
def resolution_mode=(options)
|
||||
if options["local"]
|
||||
@remote = false
|
||||
else
|
||||
@remote = true
|
||||
@prefer_local = options["prefer-local"]
|
||||
end
|
||||
end
|
||||
|
||||
def setup_sources_for_resolve
|
||||
if @remote == false
|
||||
sources.cached!
|
||||
else
|
||||
sources.remote!
|
||||
end
|
||||
end
|
||||
|
||||
# For given dependency list returns a SpecSet with Gemspec of all the required
|
||||
# dependencies.
|
||||
# 1. The method first resolves the dependencies specified in Gemfile
|
||||
|
@ -267,7 +278,7 @@ module Bundler
|
|||
SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
|
||||
else
|
||||
Bundler.ui.debug "Found no changes, using resolution from the lockfile"
|
||||
if @locked_gems.may_include_redundant_platform_specific_gems?
|
||||
if @removed_platform || @locked_gems.may_include_redundant_platform_specific_gems?
|
||||
SpecSet.new(filter_specs(@locked_specs, @dependencies))
|
||||
else
|
||||
@locked_specs
|
||||
|
@ -446,7 +457,9 @@ module Bundler
|
|||
end
|
||||
|
||||
def remove_platform(platform)
|
||||
return if @platforms.delete(Gem::Platform.new(platform))
|
||||
removed_platform = @platforms.delete(Gem::Platform.new(platform))
|
||||
@removed_platform ||= removed_platform
|
||||
return if removed_platform
|
||||
raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
|
||||
end
|
||||
|
||||
|
@ -470,31 +483,19 @@ module Bundler
|
|||
private
|
||||
|
||||
def resolver
|
||||
@resolver ||= begin
|
||||
last_resolve = converge_locked_specs
|
||||
remove_ruby_from_platforms_if_necessary!(current_dependencies)
|
||||
Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve))
|
||||
end
|
||||
@resolver ||= Resolver.new(resolution_packages, gem_version_promoter)
|
||||
end
|
||||
|
||||
def expanded_dependencies
|
||||
@expanded_dependencies ||= dependencies + metadata_dependencies
|
||||
dependencies + metadata_dependencies
|
||||
end
|
||||
|
||||
def resolution_packages
|
||||
@resolution_packages ||= begin
|
||||
packages = Hash.new do |h, k|
|
||||
h[k] = Resolver::Package.new(k, @platforms, @originally_locked_specs, @unlock[:gems])
|
||||
end
|
||||
|
||||
expanded_dependencies.each do |dep|
|
||||
name = dep.name
|
||||
platforms = dep.gem_platforms(@platforms)
|
||||
|
||||
packages[name] = Resolver::Package.new(name, platforms, @originally_locked_specs, @unlock[:gems], :dependency => dep)
|
||||
end
|
||||
|
||||
packages
|
||||
last_resolve = converge_locked_specs
|
||||
remove_ruby_from_platforms_if_necessary!(current_dependencies)
|
||||
packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, :locked_specs => @originally_locked_specs, :unlock => @unlock[:gems], :prerelease => gem_version_promoter.pre?)
|
||||
additional_base_requirements_for_resolve(packages, last_resolve)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -528,13 +529,15 @@ module Bundler
|
|||
break if incomplete_specs.empty?
|
||||
|
||||
Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
|
||||
@resolve = start_resolution(:exclude_specs => incomplete_specs)
|
||||
setup_sources_for_resolve
|
||||
resolution_packages.delete(incomplete_specs)
|
||||
@resolve = start_resolution
|
||||
specs = resolve.materialize(dependencies)
|
||||
|
||||
still_incomplete_specs = specs.incomplete_specs
|
||||
|
||||
if still_incomplete_specs == incomplete_specs
|
||||
package = resolution_packages[incomplete_specs.first.name]
|
||||
package = resolution_packages.get_package(incomplete_specs.first.name)
|
||||
resolver.raise_not_found! package
|
||||
end
|
||||
|
||||
|
@ -547,14 +550,14 @@ module Bundler
|
|||
specs
|
||||
end
|
||||
|
||||
def start_resolution(exclude_specs: [])
|
||||
result = resolver.start(expanded_dependencies, resolution_packages, :exclude_specs => exclude_specs)
|
||||
def start_resolution
|
||||
result = resolver.start
|
||||
|
||||
SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms))
|
||||
end
|
||||
|
||||
def precompute_source_requirements_for_indirect_dependencies?
|
||||
@remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
|
||||
sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
|
||||
end
|
||||
|
||||
def pin_locally_available_names(source_requirements)
|
||||
|
@ -584,6 +587,8 @@ module Bundler
|
|||
end
|
||||
|
||||
def add_current_platform
|
||||
return if current_ruby_platform_locked?
|
||||
|
||||
add_platform(local_platform)
|
||||
end
|
||||
|
||||
|
@ -880,11 +885,12 @@ module Bundler
|
|||
current == proposed
|
||||
end
|
||||
|
||||
def additional_base_requirements_for_resolve(last_resolve)
|
||||
return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
|
||||
converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
|
||||
Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
|
||||
end.uniq
|
||||
def additional_base_requirements_for_resolve(resolution_packages, last_resolve)
|
||||
return resolution_packages unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
|
||||
converge_specs(@originally_locked_specs - last_resolve).each do |locked_spec|
|
||||
resolution_packages.base_requirements[locked_spec.name] = Gem::Requirement.new(">= #{locked_spec.version}")
|
||||
end
|
||||
resolution_packages
|
||||
end
|
||||
|
||||
def remove_ruby_from_platforms_if_necessary!(dependencies)
|
||||
|
|
|
@ -277,8 +277,8 @@ module Bundler
|
|||
if repo_name =~ GITHUB_PULL_REQUEST_URL
|
||||
{
|
||||
"git" => "https://github.com/#{$1}.git",
|
||||
"branch" => "refs/pull/#{$2}/head",
|
||||
"ref" => nil,
|
||||
"branch" => nil,
|
||||
"ref" => "refs/pull/#{$2}/head",
|
||||
"tag" => nil,
|
||||
}
|
||||
else
|
||||
|
|
|
@ -249,17 +249,13 @@ module Bundler
|
|||
|
||||
# returns whether or not a re-resolve was needed
|
||||
def resolve_if_needed(options)
|
||||
@definition.resolution_mode = options
|
||||
|
||||
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
||||
return false if @definition.nothing_changed? && !@definition.missing_specs?
|
||||
end
|
||||
|
||||
if options["local"]
|
||||
@definition.resolve_with_cache!
|
||||
elsif options["prefer-local"]
|
||||
@definition.resolve_prefering_local!
|
||||
else
|
||||
@definition.resolve_remotely!
|
||||
end
|
||||
@definition.setup_sources_for_resolve
|
||||
|
||||
true
|
||||
end
|
||||
|
|
|
@ -16,7 +16,6 @@ module Bundler
|
|||
@dependencies = []
|
||||
@platform = platform || Gem::Platform::RUBY
|
||||
@source = source
|
||||
@specification = nil
|
||||
@force_ruby_platform = default_force_ruby_platform
|
||||
end
|
||||
|
||||
|
@ -80,37 +79,46 @@ module Bundler
|
|||
def materialize_for_installation
|
||||
source.local!
|
||||
|
||||
candidates = if source.is_a?(Source::Path) || !ruby_platform_materializes_to_ruby_platform?
|
||||
matching_specs = source.specs.search(use_exact_resolved_specifications? ? self : [name, version])
|
||||
return self if matching_specs.empty?
|
||||
|
||||
candidates = if use_exact_resolved_specifications?
|
||||
matching_specs
|
||||
else
|
||||
target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
|
||||
|
||||
GemHelpers.select_best_platform_match(source.specs.search([name, version]), target_platform)
|
||||
else
|
||||
source.specs.search(self)
|
||||
end
|
||||
installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)
|
||||
|
||||
return self if candidates.empty?
|
||||
specification = __materialize__(installable_candidates, :fallback_to_non_installable => false)
|
||||
return specification unless specification.nil?
|
||||
|
||||
if target_platform != platform
|
||||
installable_candidates = GemHelpers.select_best_platform_match(matching_specs, platform)
|
||||
end
|
||||
|
||||
installable_candidates
|
||||
end
|
||||
|
||||
__materialize__(candidates)
|
||||
end
|
||||
|
||||
def __materialize__(candidates)
|
||||
@specification = begin
|
||||
search = candidates.reverse.find do |spec|
|
||||
spec.is_a?(StubSpecification) ||
|
||||
(spec.matches_current_ruby? &&
|
||||
spec.matches_current_rubygems?)
|
||||
end
|
||||
if search.nil? && Bundler.frozen_bundle?
|
||||
search = candidates.last
|
||||
else
|
||||
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
||||
end
|
||||
search
|
||||
# If in frozen mode, we fallback to a non-installable candidate because by
|
||||
# doing this we avoid re-resolving and potentially end up changing the
|
||||
# lock file, which is not allowed. In that case, we will give a proper error
|
||||
# about the mismatch higher up the stack, right before trying to install the
|
||||
# bad gem.
|
||||
def __materialize__(candidates, fallback_to_non_installable: Bundler.frozen_bundle?)
|
||||
search = candidates.reverse.find do |spec|
|
||||
spec.is_a?(StubSpecification) ||
|
||||
(spec.matches_current_ruby? &&
|
||||
spec.matches_current_rubygems?)
|
||||
end
|
||||
end
|
||||
|
||||
def respond_to?(*args)
|
||||
super || @specification ? @specification.respond_to?(*args) : nil
|
||||
if search.nil? && fallback_to_non_installable
|
||||
search = candidates.last
|
||||
else
|
||||
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
||||
end
|
||||
search
|
||||
end
|
||||
|
||||
def to_s
|
||||
|
@ -132,16 +140,8 @@ module Bundler
|
|||
|
||||
private
|
||||
|
||||
def to_ary
|
||||
nil
|
||||
end
|
||||
|
||||
def method_missing(method, *args, &blk)
|
||||
raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification
|
||||
|
||||
return super unless respond_to?(method)
|
||||
|
||||
@specification.send(method, *args, &blk)
|
||||
def use_exact_resolved_specifications?
|
||||
@use_exact_resolved_specifications ||= !source.is_a?(Source::Path) && ruby_platform_materializes_to_ruby_platform?
|
||||
end
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-ADD" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-ADD" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-BINSTUBS" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-CACHE" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-CHECK" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-CLEAN" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-CONFIG" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-config\fR \- Set bundler configuration options
|
||||
|
@ -39,7 +39,7 @@ Bundler default config
|
|||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Executing \fBbundle config list\fR with will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
|
||||
Executing \fBbundle config list\fR will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
|
||||
.
|
||||
.P
|
||||
Executing \fBbundle config get <name>\fR will print the value of that configuration setting, and where it was set\.
|
||||
|
|
|
@ -19,7 +19,7 @@ Bundler loads configuration settings in this order:
|
|||
3. Global config (`~/.bundle/config`)
|
||||
4. Bundler default config
|
||||
|
||||
Executing `bundle config list` with will print a list of all bundler
|
||||
Executing `bundle config list` will print a list of all bundler
|
||||
configuration for the current bundle, and where that configuration
|
||||
was set.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-CONSOLE" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-CONSOLE" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-DOCTOR" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-DOCTOR" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-EXEC" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
||||
|
@ -74,13 +74,13 @@ Finally, \fBbundle exec\fR also implicitly modifies \fBGemfile\.lock\fR if the l
|
|||
By default, when attempting to \fBbundle exec\fR to a file with a ruby shebang, Bundler will \fBKernel\.load\fR that file instead of using \fBKernel\.exec\fR\. For the vast majority of cases, this is a performance improvement\. In a rare few cases, this could cause some subtle side\-effects (such as dependence on the exact contents of \fB$0\fR or \fB__FILE__\fR) and the optimization can be disabled by enabling the \fBdisable_exec_load\fR setting\.
|
||||
.
|
||||
.SS "Shelling out"
|
||||
Any Ruby code that opens a subshell (like \fBsystem\fR, backticks, or \fB%x{}\fR) will automatically use the current Bundler environment\. If you need to shell out to a Ruby command that is not part of your current bundle, use the \fBwith_clean_env\fR method with a block\. Any subshells created inside the block will be given the environment present before Bundler was activated\. For example, Homebrew commands run Ruby, but don\'t work inside a bundle:
|
||||
Any Ruby code that opens a subshell (like \fBsystem\fR, backticks, or \fB%x{}\fR) will automatically use the current Bundler environment\. If you need to shell out to a Ruby command that is not part of your current bundle, use the \fBwith_unbundled_env\fR method with a block\. Any subshells created inside the block will be given the environment present before Bundler was activated\. For example, Homebrew commands run Ruby, but don\'t work inside a bundle:
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
Bundler\.with_clean_env do
|
||||
Bundler\.with_unbundled_env do
|
||||
`brew install wget`
|
||||
end
|
||||
.
|
||||
|
@ -89,13 +89,13 @@ end
|
|||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Using \fBwith_clean_env\fR is also necessary if you are shelling out to a different bundle\. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use \fBwith_clean_env\fR\.
|
||||
Using \fBwith_unbundled_env\fR is also necessary if you are shelling out to a different bundle\. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use \fBwith_unbundled_env\fR\.
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
Bundler\.with_clean_env do
|
||||
Bundler\.with_unbundled_env do
|
||||
Dir\.chdir "/other/bundler/project" do
|
||||
`bundle exec \./script`
|
||||
end
|
||||
|
|
|
@ -84,20 +84,20 @@ the `disable_exec_load` setting.
|
|||
Any Ruby code that opens a subshell (like `system`, backticks, or `%x{}`) will
|
||||
automatically use the current Bundler environment. If you need to shell out to
|
||||
a Ruby command that is not part of your current bundle, use the
|
||||
`with_clean_env` method with a block. Any subshells created inside the block
|
||||
`with_unbundled_env` method with a block. Any subshells created inside the block
|
||||
will be given the environment present before Bundler was activated. For
|
||||
example, Homebrew commands run Ruby, but don't work inside a bundle:
|
||||
|
||||
Bundler.with_clean_env do
|
||||
Bundler.with_unbundled_env do
|
||||
`brew install wget`
|
||||
end
|
||||
|
||||
Using `with_clean_env` is also necessary if you are shelling out to a different
|
||||
Using `with_unbundled_env` is also necessary if you are shelling out to a different
|
||||
bundle. Any Bundler commands run in a subshell will inherit the current
|
||||
Gemfile, so commands that need to run in the context of a different bundle also
|
||||
need to use `with_clean_env`.
|
||||
need to use `with_unbundled_env`.
|
||||
|
||||
Bundler.with_clean_env do
|
||||
Bundler.with_unbundled_env do
|
||||
Dir.chdir "/other/bundler/project" do
|
||||
`bundle exec ./script`
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-GEM" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-GEM" "1" "January 2023" "" ""
|
||||
.
|
||||
.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\-HELP" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-HELP" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-help\fR \- Displays detailed help for each subcommand
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-INFO" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-INFO" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-INIT" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-INJECT" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-INSTALL" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-LIST" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-LOCK" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OPEN" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-OPEN" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
||||
.
|
||||
.SH "SYNOPSIS"
|
||||
\fBbundle open\fR [GEM]
|
||||
\fBbundle open\fR [GEM] [\-\-path=PATH]
|
||||
.
|
||||
.SH "DESCRIPTION"
|
||||
Opens the source directory of the provided GEM in your editor\.
|
||||
|
@ -30,3 +30,23 @@ bundle open \'rack\'
|
|||
.
|
||||
.P
|
||||
Will open the source directory for the \'rack\' gem in your bundle\.
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
bundle open \'rack\' \-\-path \'README\.md\'
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Will open the README\.md file of the \'rack\' gem source in your bundle\.
|
||||
.
|
||||
.SH "OPTIONS"
|
||||
.
|
||||
.TP
|
||||
\fB\-\-path\fR
|
||||
Specify GEM source relative path to open\.
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ bundle-open(1) -- Opens the source directory for a gem in your bundle
|
|||
|
||||
## SYNOPSIS
|
||||
|
||||
`bundle open` [GEM]
|
||||
`bundle open` [GEM] [--path=PATH]
|
||||
|
||||
## DESCRIPTION
|
||||
|
||||
|
@ -17,3 +17,11 @@ Example:
|
|||
bundle open 'rack'
|
||||
|
||||
Will open the source directory for the 'rack' gem in your bundle.
|
||||
|
||||
bundle open 'rack' --path 'README.md'
|
||||
|
||||
Will open the README.md file of the 'rack' gem source in your bundle.
|
||||
|
||||
## OPTIONS
|
||||
* `--path`:
|
||||
Specify GEM source relative path to open.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-OUTDATED" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-OUTDATED" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-PLATFORM" "1" "January 2023" "" ""
|
||||
.
|
||||
.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\-PLUGIN" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-PLUGIN" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-plugin\fR \- Manage Bundler plugins
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-PRISTINE" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-PRISTINE" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-REMOVE" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-SHOW" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE\-UPDATE" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-VERSION" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-VERSION" "1" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBbundle\-version\fR \- Prints Bundler version information
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "BUNDLE\-VIZ" "1" "December 2022" "" ""
|
||||
.TH "BUNDLE\-VIZ" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "BUNDLE" "1" "January 2023" "" ""
|
||||
.
|
||||
.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" "December 2022" "" ""
|
||||
.TH "GEMFILE" "5" "January 2023" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
||||
|
|
|
@ -9,26 +9,21 @@ module Bundler
|
|||
class Resolver
|
||||
require_relative "vendored_pub_grub"
|
||||
require_relative "resolver/base"
|
||||
require_relative "resolver/package"
|
||||
require_relative "resolver/candidate"
|
||||
require_relative "resolver/incompatibility"
|
||||
require_relative "resolver/root"
|
||||
|
||||
include GemHelpers
|
||||
|
||||
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements)
|
||||
@source_requirements = source_requirements
|
||||
@base = Resolver::Base.new(base, additional_base_requirements)
|
||||
def initialize(base, gem_version_promoter)
|
||||
@source_requirements = base.source_requirements
|
||||
@base = base
|
||||
@gem_version_promoter = gem_version_promoter
|
||||
end
|
||||
|
||||
def start(requirements, packages, exclude_specs: [])
|
||||
exclude_specs.each do |spec|
|
||||
remove_from_candidates(spec)
|
||||
end
|
||||
|
||||
@requirements = requirements
|
||||
@packages = packages
|
||||
def start
|
||||
@requirements = @base.requirements
|
||||
@packages = @base.packages
|
||||
|
||||
root, logger = setup_solver
|
||||
|
||||
|
@ -78,33 +73,26 @@ module Bundler
|
|||
rescue PubGrub::SolveFailure => e
|
||||
incompatibility = e.incompatibility
|
||||
|
||||
names_to_unlock = []
|
||||
extended_explanation = nil
|
||||
names_to_unlock, names_to_allow_prereleases_for, extended_explanation = find_names_to_relax(incompatibility)
|
||||
|
||||
while incompatibility.conflict?
|
||||
cause = incompatibility.cause
|
||||
incompatibility = cause.incompatibility
|
||||
names_to_relax = names_to_unlock + names_to_allow_prereleases_for
|
||||
|
||||
incompatibility.terms.each do |term|
|
||||
name = term.package.name
|
||||
names_to_unlock << name if base_requirements[name]
|
||||
if names_to_relax.any?
|
||||
if names_to_unlock.any?
|
||||
Bundler.ui.debug "Found conflicts with locked dependencies. Will retry with #{names_to_unlock.join(", ")} unlocked...", true
|
||||
|
||||
no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(PubGrub::Incompatibility::NoVersions) }
|
||||
next unless no_versions_incompat
|
||||
|
||||
extended_explanation = no_versions_incompat.extended_explanation
|
||||
@base.unlock_names(names_to_unlock)
|
||||
end
|
||||
end
|
||||
|
||||
names_to_unlock.uniq!
|
||||
if names_to_allow_prereleases_for.any?
|
||||
Bundler.ui.debug "Found conflicts with dependencies with prereleases. Will retrying considering prereleases for #{names_to_allow_prereleases_for.join(", ")}...", true
|
||||
|
||||
if names_to_unlock.any?
|
||||
Bundler.ui.debug "Found conflicts with locked dependencies. Retrying with #{names_to_unlock.join(", ")} unlocked...", true
|
||||
|
||||
@base.unlock_names(names_to_unlock)
|
||||
@base.include_prereleases(names_to_allow_prereleases_for)
|
||||
end
|
||||
|
||||
root, logger = setup_solver
|
||||
|
||||
Bundler.ui.debug "Retrying resolution...", true
|
||||
retry
|
||||
end
|
||||
|
||||
|
@ -118,6 +106,35 @@ module Bundler
|
|||
raise SolveFailure.new(explanation)
|
||||
end
|
||||
|
||||
def find_names_to_relax(incompatibility)
|
||||
names_to_unlock = []
|
||||
names_to_allow_prereleases_for = []
|
||||
extended_explanation = nil
|
||||
|
||||
while incompatibility.conflict?
|
||||
cause = incompatibility.cause
|
||||
incompatibility = cause.incompatibility
|
||||
|
||||
incompatibility.terms.each do |term|
|
||||
package = term.package
|
||||
name = package.name
|
||||
|
||||
if base_requirements[name]
|
||||
names_to_unlock << name
|
||||
elsif package.ignores_prereleases?
|
||||
names_to_allow_prereleases_for << name
|
||||
end
|
||||
|
||||
no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(PubGrub::Incompatibility::NoVersions) }
|
||||
next unless no_versions_incompat
|
||||
|
||||
extended_explanation = no_versions_incompat.extended_explanation
|
||||
end
|
||||
end
|
||||
|
||||
[names_to_unlock.uniq, names_to_allow_prereleases_for.uniq, extended_explanation]
|
||||
end
|
||||
|
||||
def parse_dependency(package, dependency)
|
||||
range = if repository_for(package).is_a?(Source::Gemspec)
|
||||
PubGrub::VersionRange.any
|
||||
|
@ -215,7 +232,7 @@ module Bundler
|
|||
|
||||
def all_versions_for(package)
|
||||
name = package.name
|
||||
results = (@base[name] + @all_specs[name]).uniq(&:full_name)
|
||||
results = (@base[name] + filter_prereleases(@all_specs[name], package)).uniq {|spec| [spec.version.hash, spec.platform] }
|
||||
locked_requirement = base_requirements[name]
|
||||
results = filter_matching_specs(results, locked_requirement) if locked_requirement
|
||||
|
||||
|
@ -284,6 +301,12 @@ module Bundler
|
|||
end
|
||||
end
|
||||
|
||||
def filter_prereleases(specs, package)
|
||||
return specs unless package.ignores_prereleases?
|
||||
|
||||
specs.reject {|s| s.version.prerelease? }
|
||||
end
|
||||
|
||||
def requirement_satisfied_by?(requirement, spec)
|
||||
requirement.satisfied_by?(spec.version) || spec.source.is_a?(Source::Gemspec)
|
||||
end
|
||||
|
@ -304,25 +327,20 @@ module Bundler
|
|||
@base.base_requirements
|
||||
end
|
||||
|
||||
def remove_from_candidates(spec)
|
||||
@base.delete(spec)
|
||||
end
|
||||
|
||||
def prepare_dependencies(requirements, packages)
|
||||
to_dependency_hash(requirements, packages).map do |dep_package, dep_constraint|
|
||||
name = dep_package.name
|
||||
|
||||
# If a dependency is scoped to a platform different from the current
|
||||
# one, we ignore it. However, it may reappear during resolution as a
|
||||
# transitive dependency of another package, so we need to reset the
|
||||
# package so the proper versions are considered if reintroduced later.
|
||||
if dep_package.platforms.empty?
|
||||
@packages.delete(name)
|
||||
next
|
||||
end
|
||||
|
||||
next [dep_package, dep_constraint] if name == "bundler"
|
||||
next [dep_package, dep_constraint] unless versions_for(dep_package, dep_constraint.range).empty?
|
||||
|
||||
versions = versions_for(dep_package, dep_constraint.range)
|
||||
if versions.empty? && dep_package.ignores_prereleases?
|
||||
@sorted_versions.delete(dep_package)
|
||||
dep_package.consider_prereleases!
|
||||
versions = versions_for(dep_package, dep_constraint.range)
|
||||
end
|
||||
next [dep_package, dep_constraint] unless versions.empty?
|
||||
|
||||
next unless dep_package.current_platform?
|
||||
|
||||
raise_not_found!(dep_package)
|
||||
|
@ -337,7 +355,8 @@ module Bundler
|
|||
|
||||
def requirement_to_range(requirement)
|
||||
ranges = requirement.requirements.map do |(op, version)|
|
||||
ver = Resolver::Candidate.new(version)
|
||||
ver = Resolver::Candidate.new(version).generic!
|
||||
platform_ver = Resolver::Candidate.new(version).platform_specific!
|
||||
|
||||
case op
|
||||
when "~>"
|
||||
|
@ -345,17 +364,17 @@ module Bundler
|
|||
bump = Resolver::Candidate.new(version.bump.to_s + ".A")
|
||||
PubGrub::VersionRange.new(:name => name, :min => ver, :max => bump, :include_min => true)
|
||||
when ">"
|
||||
PubGrub::VersionRange.new(:min => ver)
|
||||
PubGrub::VersionRange.new(:min => platform_ver)
|
||||
when ">="
|
||||
PubGrub::VersionRange.new(:min => ver, :include_min => true)
|
||||
when "<"
|
||||
PubGrub::VersionRange.new(:max => ver)
|
||||
when "<="
|
||||
PubGrub::VersionRange.new(:max => ver, :include_max => true)
|
||||
PubGrub::VersionRange.new(:max => platform_ver, :include_max => true)
|
||||
when "="
|
||||
PubGrub::VersionRange.new(:min => ver, :max => ver, :include_min => true, :include_max => true)
|
||||
PubGrub::VersionRange.new(:min => ver, :max => platform_ver, :include_min => true, :include_max => true)
|
||||
when "!="
|
||||
PubGrub::VersionRange.new(:min => ver, :max => ver, :include_min => true, :include_max => true).invert
|
||||
PubGrub::VersionRange.new(:min => ver, :max => platform_ver, :include_min => true, :include_max => true).invert
|
||||
else
|
||||
raise "bad version specifier: #{op}"
|
||||
end
|
||||
|
|
|
@ -1,19 +1,47 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "package"
|
||||
|
||||
module Bundler
|
||||
class Resolver
|
||||
class Base
|
||||
def initialize(base, additional_base_requirements)
|
||||
attr_reader :packages, :requirements, :source_requirements
|
||||
|
||||
def initialize(source_requirements, dependencies, base, platforms, options)
|
||||
@source_requirements = source_requirements
|
||||
|
||||
@base = base
|
||||
@additional_base_requirements = additional_base_requirements
|
||||
|
||||
@packages = Hash.new do |hash, name|
|
||||
hash[name] = Package.new(name, platforms, **options)
|
||||
end
|
||||
|
||||
@requirements = dependencies.map do |dep|
|
||||
dep_platforms = dep.gem_platforms(platforms)
|
||||
|
||||
# Dependencies scoped to external platforms are ignored
|
||||
next if dep_platforms.empty?
|
||||
|
||||
name = dep.name
|
||||
|
||||
@packages[name] = Package.new(name, dep_platforms, **options.merge(:dependency => dep))
|
||||
|
||||
dep
|
||||
end.compact
|
||||
end
|
||||
|
||||
def [](name)
|
||||
@base[name]
|
||||
end
|
||||
|
||||
def delete(spec)
|
||||
@base.delete(spec)
|
||||
def delete(specs)
|
||||
specs.each do |spec|
|
||||
@base.delete(spec)
|
||||
end
|
||||
end
|
||||
|
||||
def get_package(name)
|
||||
@packages[name]
|
||||
end
|
||||
|
||||
def base_requirements
|
||||
|
@ -24,10 +52,14 @@ module Bundler
|
|||
names.each do |name|
|
||||
@base.delete_by_name(name)
|
||||
|
||||
@additional_base_requirements.reject! {|dep| dep.name == name }
|
||||
@base_requirements.delete(name)
|
||||
end
|
||||
end
|
||||
|
||||
@base_requirements = nil
|
||||
def include_prereleases(names)
|
||||
names.each do |name|
|
||||
get_package(name).consider_prereleases!
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -38,7 +70,6 @@ module Bundler
|
|||
req = Gem::Requirement.new(ls.version)
|
||||
base_requirements[ls.name] = req
|
||||
end
|
||||
@additional_base_requirements.each {|d| base_requirements[d.name] = d.requirement }
|
||||
base_requirements
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,9 +26,8 @@ module Bundler
|
|||
|
||||
def initialize(version, specs: [])
|
||||
@spec_group = Resolver::SpecGroup.new(specs)
|
||||
@platforms = specs.map(&:platform).sort_by(&:to_s).uniq
|
||||
@version = Gem::Version.new(version)
|
||||
@ruby_only = @platforms == [Gem::Platform::RUBY]
|
||||
@ruby_only = specs.map(&:platform).uniq == [Gem::Platform::RUBY]
|
||||
end
|
||||
|
||||
def dependencies
|
||||
|
@ -41,6 +40,18 @@ module Bundler
|
|||
@spec_group.to_specs(package.force_ruby_platform?)
|
||||
end
|
||||
|
||||
def generic!
|
||||
@ruby_only = true
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def platform_specific!
|
||||
@ruby_only = false
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def prerelease?
|
||||
@version.prerelease?
|
||||
end
|
||||
|
@ -53,27 +64,20 @@ module Bundler
|
|||
[@version, @ruby_only ? -1 : 1]
|
||||
end
|
||||
|
||||
def canonical?
|
||||
!@spec_group.empty?
|
||||
end
|
||||
|
||||
def <=>(other)
|
||||
return unless other.is_a?(self.class)
|
||||
return @version <=> other.version unless canonical? && other.canonical?
|
||||
|
||||
sort_obj <=> other.sort_obj
|
||||
end
|
||||
|
||||
def ==(other)
|
||||
return unless other.is_a?(self.class)
|
||||
return @version == other.version unless canonical? && other.canonical?
|
||||
|
||||
sort_obj == other.sort_obj
|
||||
end
|
||||
|
||||
def eql?(other)
|
||||
return unless other.is_a?(self.class)
|
||||
return @version.eql?(other.version) unless canonical? || other.canonical?
|
||||
|
||||
sort_obj.eql?(other.sort_obj)
|
||||
end
|
||||
|
@ -83,9 +87,7 @@ module Bundler
|
|||
end
|
||||
|
||||
def to_s
|
||||
return @version.to_s if @platforms.empty? || @ruby_only
|
||||
|
||||
"#{@version} (#{@platforms.join(", ")})"
|
||||
@version.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,12 +15,13 @@ module Bundler
|
|||
class Package
|
||||
attr_reader :name, :platforms, :dependency, :locked_version
|
||||
|
||||
def initialize(name, platforms, locked_specs, unlock, dependency: nil)
|
||||
def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, dependency: nil)
|
||||
@name = name
|
||||
@platforms = platforms
|
||||
@locked_version = locked_specs[name].first&.version
|
||||
@unlock = unlock
|
||||
@dependency = dependency || Dependency.new(name, @locked_version)
|
||||
@prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
|
||||
end
|
||||
|
||||
def to_s
|
||||
|
@ -47,8 +48,16 @@ module Bundler
|
|||
@unlock.empty? || @unlock.include?(name)
|
||||
end
|
||||
|
||||
def ignores_prereleases?
|
||||
@prerelease == :ignore
|
||||
end
|
||||
|
||||
def prerelease_specified?
|
||||
@dependency.prerelease?
|
||||
@prerelease == :consider_first
|
||||
end
|
||||
|
||||
def consider_prereleases!
|
||||
@prerelease = :consider_last
|
||||
end
|
||||
|
||||
def force_ruby_platform?
|
||||
|
|
|
@ -284,7 +284,7 @@ module Bundler
|
|||
Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
|
||||
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
|
||||
Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
|
||||
Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__)
|
||||
Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__) unless RUBY_VERSION < "2.7"
|
||||
end
|
||||
|
||||
def set_path
|
||||
|
|
|
@ -292,7 +292,7 @@ module Bundler
|
|||
end
|
||||
|
||||
def dependency_api_available?
|
||||
api_fetchers.any?
|
||||
@allow_remote && api_fetchers.any?
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
|
||||
# a Rust project. Your extensions depedencies should be added to the Cargo.toml
|
||||
# a Rust project. Your extensions dependencies should be added to the Cargo.toml
|
||||
# in the ext/ directory.
|
||||
|
||||
[workspace]
|
||||
|
|
21
lib/bundler/vendor/pub_grub/LICENSE.txt
vendored
21
lib/bundler/vendor/pub_grub/LICENSE.txt
vendored
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 John Hawthorn
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
|
@ -20,6 +20,10 @@ module Bundler::PubGrub
|
|||
range.eql?(other.range)
|
||||
end
|
||||
|
||||
def ==(other)
|
||||
package == other.package && range == other.range
|
||||
end
|
||||
|
||||
class << self
|
||||
def exact(package, version)
|
||||
range = VersionRange.new(min: version, max: version, include_min: true, include_max: true)
|
||||
|
|
|
@ -397,7 +397,7 @@ module Bundler::PubGrub
|
|||
|
||||
def constraints
|
||||
return ["any"] if any?
|
||||
return ["= #{min}"] if min == max
|
||||
return ["= #{min}"] if min.to_s == max.to_s
|
||||
|
||||
c = []
|
||||
c << "#{include_min ? ">=" : ">"} #{min}" if min
|
||||
|
|
|
@ -148,7 +148,7 @@ module Bundler::PubGrub
|
|||
while !ranges.empty?
|
||||
ne = []
|
||||
range = ranges.shift
|
||||
while !ranges.empty? && ranges[0].min == range.max
|
||||
while !ranges.empty? && ranges[0].min.to_s == range.max.to_s
|
||||
ne << range.max
|
||||
range = range.span(ranges.shift)
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: false
|
||||
|
||||
module Bundler
|
||||
VERSION = "2.4.1".freeze
|
||||
VERSION = "2.4.5".freeze
|
||||
|
||||
def self.bundler_major_version
|
||||
@bundler_major_version ||= VERSION.split(".").first.to_i
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
require "rbconfig"
|
||||
|
||||
module Gem
|
||||
VERSION = "3.4.1".freeze
|
||||
VERSION = "3.4.5".freeze
|
||||
end
|
||||
|
||||
# Must be first since it unloads the prelude from 1.9.2
|
||||
|
@ -119,10 +119,6 @@ module Gem
|
|||
# to avoid deprecation warnings in Ruby 2.7.
|
||||
UNTAINT = RUBY_VERSION < "2.7" ? :untaint.to_sym : proc {}
|
||||
|
||||
# When https://bugs.ruby-lang.org/issues/17259 is available, there is no need to override Kernel#warn
|
||||
KERNEL_WARN_IGNORES_INTERNAL_ENTRIES = RUBY_ENGINE == "truffleruby" ||
|
||||
(RUBY_ENGINE == "ruby" && RUBY_VERSION >= "3.0")
|
||||
|
||||
##
|
||||
# An Array of Regexps that match windows Ruby platforms.
|
||||
|
||||
|
@ -1349,7 +1345,16 @@ end
|
|||
Gem::Specification.load_defaults
|
||||
|
||||
require_relative "rubygems/core_ext/kernel_gem"
|
||||
require_relative "rubygems/core_ext/kernel_require"
|
||||
require_relative "rubygems/core_ext/kernel_warn"
|
||||
|
||||
path = File.join(__dir__, "rubygems/core_ext/kernel_require.rb")
|
||||
# When https://bugs.ruby-lang.org/issues/17259 is available, there is no need to override Kernel#warn
|
||||
if RUBY_ENGINE == "truffleruby" ||
|
||||
(RUBY_ENGINE == "ruby" && RUBY_VERSION >= "3.0")
|
||||
file = "<internal:#{path}>"
|
||||
else
|
||||
require_relative "rubygems/core_ext/kernel_warn"
|
||||
file = path
|
||||
end
|
||||
eval File.read(path), nil, file
|
||||
|
||||
require ENV["BUNDLER_SETUP"] if ENV["BUNDLER_SETUP"] && !defined?(Bundler)
|
||||
|
|
|
@ -630,7 +630,11 @@ RubyGems is a package manager for Ruby.
|
|||
Usage:
|
||||
gem -h/--help
|
||||
gem -v/--version
|
||||
gem command [arguments...] [options...]
|
||||
gem [global options...] command [arguments...] [options...]
|
||||
|
||||
Global options:
|
||||
-C PATH run as if gem was started in <PATH>
|
||||
instead of the current working directory
|
||||
|
||||
Examples:
|
||||
gem install rake
|
||||
|
|
|
@ -175,14 +175,20 @@ class Gem::CommandManager
|
|||
when "-v", "--version" then
|
||||
say Gem::VERSION
|
||||
terminate_interaction 0
|
||||
when "-C" then
|
||||
args.shift
|
||||
start_point = args.shift
|
||||
if Dir.exist?(start_point)
|
||||
Dir.chdir(start_point) { invoke_command(args, build_args) }
|
||||
else
|
||||
alert_error clean_text("#{start_point} isn't a directory.")
|
||||
terminate_interaction 1
|
||||
end
|
||||
when /^-/ then
|
||||
alert_error clean_text("Invalid option: #{args.first}. See 'gem --help'.")
|
||||
terminate_interaction 1
|
||||
else
|
||||
cmd_name = args.shift.downcase
|
||||
cmd = find_command cmd_name
|
||||
cmd.deprecation_warning if cmd.deprecated?
|
||||
cmd.invoke_with_build_args args, build_args
|
||||
invoke_command(args, build_args)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -237,4 +243,11 @@ class Gem::CommandManager
|
|||
ui.backtrace e
|
||||
end
|
||||
end
|
||||
|
||||
def invoke_command(args, build_args)
|
||||
cmd_name = args.shift.downcase
|
||||
cmd = find_command cmd_name
|
||||
cmd.deprecation_warning if cmd.deprecated?
|
||||
cmd.invoke_with_build_args args, build_args
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,6 +26,9 @@ class Gem::Commands::BuildCommand < Gem::Command
|
|||
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
|
||||
deprecate_option "-C",
|
||||
version: "4.0",
|
||||
extra_msg: "-C is a global flag now. Use `gem -C PATH build GEMSPEC_FILE [options]` instead"
|
||||
end
|
||||
|
||||
def arguments # :nodoc:
|
||||
|
|
|
@ -15,7 +15,7 @@ The owner command lets you add and remove owners of a gem on a push
|
|||
server (the default is https://rubygems.org). Multiple owners can be
|
||||
added or removed at the same time, if the flag is given multiple times.
|
||||
|
||||
The supported user identifiers are dependant on the push server.
|
||||
The supported user identifiers are dependent on the push server.
|
||||
For rubygems.org, both e-mail and handle are supported, even though the
|
||||
user identifier field is called "email".
|
||||
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
# frozen_string_literal: true
|
||||
##
|
||||
# RubyGems adds the #gem method to allow activation of specific gem versions
|
||||
# and overrides the #require method on Kernel to make gems appear as if they
|
||||
# live on the <code>$LOAD_PATH</code>. See the documentation of these methods
|
||||
# for further detail.
|
||||
|
||||
module Kernel
|
||||
|
||||
|
|
|
@ -13,12 +13,12 @@ module Kernel
|
|||
|
||||
# Make sure we have a reference to Ruby's original Kernel#require
|
||||
unless defined?(gem_original_require)
|
||||
# :stopdoc:
|
||||
alias gem_original_require require
|
||||
private :gem_original_require
|
||||
# :startdoc:
|
||||
end
|
||||
|
||||
file = Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES ? "<internal:#{__FILE__}>" : __FILE__
|
||||
module_eval <<'RUBY', file, __LINE__ + 1 # rubocop:disable Style/EvalWithLocation
|
||||
##
|
||||
# When RubyGems is required, Kernel#require is replaced with our own which
|
||||
# is capable of loading gems on demand.
|
||||
|
@ -33,7 +33,7 @@ module Kernel
|
|||
# The normal <tt>require</tt> functionality of returning false if
|
||||
# that file has already been loaded is preserved.
|
||||
|
||||
def require(path)
|
||||
def require(path) # :doc:
|
||||
if RUBYGEMS_ACTIVATION_MONITOR.respond_to?(:mon_owned?)
|
||||
monitor_owned = RUBYGEMS_ACTIVATION_MONITOR.mon_owned?
|
||||
end
|
||||
|
@ -147,17 +147,17 @@ module Kernel
|
|||
RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
return gem_original_require(path)
|
||||
rescue LoadError => load_error
|
||||
RUBYGEMS_ACTIVATION_MONITOR.enter
|
||||
if load_error.path == path
|
||||
RUBYGEMS_ACTIVATION_MONITOR.enter
|
||||
|
||||
begin
|
||||
if load_error.path == path and Gem.try_activate(path)
|
||||
require_again = true
|
||||
begin
|
||||
require_again = Gem.try_activate(path)
|
||||
ensure
|
||||
RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
end
|
||||
ensure
|
||||
RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
end
|
||||
|
||||
return gem_original_require(path) if require_again
|
||||
return gem_original_require(path) if require_again
|
||||
end
|
||||
|
||||
raise load_error
|
||||
ensure
|
||||
|
@ -168,7 +168,6 @@ module Kernel
|
|||
end
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
private :require
|
||||
|
||||
|
|
|
@ -1,53 +1,50 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
if !Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES
|
||||
module Kernel
|
||||
rubygems_path = "#{__dir__}/" # Frames to be skipped start with this path.
|
||||
|
||||
module Kernel
|
||||
rubygems_path = "#{__dir__}/" # Frames to be skipped start with this path.
|
||||
original_warn = instance_method(:warn)
|
||||
|
||||
original_warn = instance_method(:warn)
|
||||
remove_method :warn
|
||||
|
||||
class << self
|
||||
remove_method :warn
|
||||
end
|
||||
|
||||
class << self
|
||||
remove_method :warn
|
||||
module_function define_method(:warn) {|*messages, **kw|
|
||||
unless uplevel = kw[:uplevel]
|
||||
if Gem.java_platform? && RUBY_VERSION < "3.1"
|
||||
return original_warn.bind(self).call(*messages)
|
||||
else
|
||||
return original_warn.bind(self).call(*messages, **kw)
|
||||
end
|
||||
end
|
||||
|
||||
module_function define_method(:warn) {|*messages, **kw|
|
||||
unless uplevel = kw[:uplevel]
|
||||
if Gem.java_platform? && RUBY_VERSION < "3.1"
|
||||
return original_warn.bind(self).call(*messages)
|
||||
else
|
||||
return original_warn.bind(self).call(*messages, **kw)
|
||||
# Ensure `uplevel` fits a `long`
|
||||
uplevel, = [uplevel].pack("l!").unpack("l!")
|
||||
|
||||
if uplevel >= 0
|
||||
start = 0
|
||||
while uplevel >= 0
|
||||
loc, = caller_locations(start, 1)
|
||||
unless loc
|
||||
# No more backtrace
|
||||
start += uplevel
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
# Ensure `uplevel` fits a `long`
|
||||
uplevel, = [uplevel].pack("l!").unpack("l!")
|
||||
start += 1
|
||||
|
||||
if uplevel >= 0
|
||||
start = 0
|
||||
while uplevel >= 0
|
||||
loc, = caller_locations(start, 1)
|
||||
unless loc
|
||||
# No more backtrace
|
||||
start += uplevel
|
||||
break
|
||||
end
|
||||
|
||||
start += 1
|
||||
|
||||
if path = loc.path
|
||||
unless path.start_with?(rubygems_path) || path.start_with?("<internal:")
|
||||
# Non-rubygems frames
|
||||
uplevel -= 1
|
||||
end
|
||||
if path = loc.path
|
||||
unless path.start_with?(rubygems_path) || path.start_with?("<internal:")
|
||||
# Non-rubygems frames
|
||||
uplevel -= 1
|
||||
end
|
||||
end
|
||||
kw[:uplevel] = start
|
||||
end
|
||||
kw[:uplevel] = start
|
||||
end
|
||||
|
||||
original_warn.bind(self).call(*messages, **kw)
|
||||
}
|
||||
end
|
||||
original_warn.bind(self).call(*messages, **kw)
|
||||
}
|
||||
end
|
||||
|
|
|
@ -203,7 +203,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
|
|||
!!Gem::WIN_PATTERNS.find {|r| target_platform =~ r }
|
||||
end
|
||||
|
||||
# Interpolate substition vars in the arg (i.e. $(DEFFILE))
|
||||
# Interpolate substitution vars in the arg (i.e. $(DEFFILE))
|
||||
def maybe_resolve_ldflag_variable(input_arg, dest_dir)
|
||||
var_matches = input_arg.match(/\$\((\w+)\)/)
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ class Gem::Platform
|
|||
# Of note, this method is not commutative. Indeed the OS 'linux' has a
|
||||
# special case: the version is the libc name, yet while "no version" stands
|
||||
# as a wildcard for a binary gem platform (as for other OSes), for the
|
||||
# runtime platform "no version" stands for 'gnu'. To be able to disinguish
|
||||
# runtime platform "no version" stands for 'gnu'. To be able to distinguish
|
||||
# these, the method receiver is the gem platform, while the argument is
|
||||
# the runtime platform.
|
||||
#
|
||||
|
|
|
@ -29,7 +29,7 @@ RSpec.describe Bundler::Dsl do
|
|||
subject.gem("sparks", :github => "https://github.com/indirect/sparks/pull/5")
|
||||
github_uri = "https://github.com/indirect/sparks.git"
|
||||
expect(subject.dependencies.first.source.uri).to eq(github_uri)
|
||||
expect(subject.dependencies.first.source.branch).to eq("refs/pull/5/head")
|
||||
expect(subject.dependencies.first.source.ref).to eq("refs/pull/5/head")
|
||||
end
|
||||
|
||||
it "rejects :github PR URI with a branch, ref or tag" do
|
||||
|
|
|
@ -16,6 +16,10 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
Bundler::SpecSet.new(build_spec(name, v))
|
||||
end
|
||||
|
||||
def build_package(name, platforms, locked_specs, unlock)
|
||||
Bundler::Resolver::Package.new(name, platforms, :locked_specs => locked_specs, :unlock => unlock)
|
||||
end
|
||||
|
||||
# Rightmost (highest array index) in result is most preferred.
|
||||
# Leftmost (lowest array index) in result is least preferred.
|
||||
# `build_candidates` has all versions of gem in index.
|
||||
|
@ -35,7 +39,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when keeping build_spec, keep current, next release" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_candidates(%w[1.7.8 1.7.9 1.8.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.7.8 1.7.9]
|
||||
|
@ -43,7 +47,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking prefer next release first" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_candidates(%w[1.7.8 1.7.9 1.8.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.7.8 1.7.9]
|
||||
|
@ -51,7 +55,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking keep current when already at latest release" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.9"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.9"), []),
|
||||
build_candidates(%w[1.7.9 1.8.0 2.0.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.7.9]
|
||||
|
@ -68,7 +72,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking favor next releases, remove minor and major increases" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "0.2.0"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "0.2.0"), []),
|
||||
build_candidates(%w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.0 2.0.1])
|
||||
)
|
||||
expect(versions(res)).to eq %w[0.2.0 0.3.0 0.3.1 0.9.0]
|
||||
|
@ -76,7 +80,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when keep locked, keep current, then favor next release, remove minor and major increases" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "0.2.0"), ["bar"]),
|
||||
build_package("foo", [], build_spec_set("foo", "0.2.0"), ["bar"]),
|
||||
build_candidates(%w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.0 2.0.1])
|
||||
)
|
||||
expect(versions(res)).to eq %w[0.3.0 0.3.1 0.9.0 0.2.0]
|
||||
|
@ -93,7 +97,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when not unlocking, same order but make sure build_spec version is most preferred to stay put" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.7"), ["bar"]),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.7"), ["bar"]),
|
||||
build_candidates(%w[1.5.4 1.6.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 2.0.0 2.0.1])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.5.4 1.6.5 1.7.6 2.0.0 2.0.1 1.8.0 1.8.1 1.7.8 1.7.9 1.7.7]
|
||||
|
@ -101,7 +105,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking favor next release, then current over minor increase" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_candidates(%w[1.7.7 1.7.8 1.7.9 1.8.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.7.7 1.8.0 1.7.8 1.7.9]
|
||||
|
@ -109,7 +113,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking do proper integer comparison, not string" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.8"), []),
|
||||
build_candidates(%w[1.7.7 1.7.8 1.7.9 1.7.15 1.8.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[1.7.7 1.8.0 1.7.8 1.7.9 1.7.15]
|
||||
|
@ -117,7 +121,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "leave current when unlocking but already at latest release" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "1.7.9"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "1.7.9"), []),
|
||||
build_candidates(%w[1.7.9 1.8.0 2.0.0])
|
||||
)
|
||||
expect(versions(res)).to eq %w[2.0.0 1.8.0 1.7.9]
|
||||
|
@ -134,7 +138,7 @@ RSpec.describe Bundler::GemVersionPromoter do
|
|||
|
||||
it "when unlocking favor next release, then minor increase over current" do
|
||||
res = gvp.sort_versions(
|
||||
Bundler::Resolver::Package.new("foo", [], build_spec_set("foo", "0.2.0"), []),
|
||||
build_package("foo", [], build_spec_set("foo", "0.2.0"), []),
|
||||
build_candidates(%w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.0 2.0.1])
|
||||
)
|
||||
expect(versions(res)).to eq %w[2.0.0 2.0.1 1.0.0 0.2.0 0.3.0 0.3.1 0.9.0]
|
||||
|
|
|
@ -140,7 +140,7 @@ RSpec.describe Bundler::Plugin::Index do
|
|||
describe "after conflict" do
|
||||
let(:commands) { ["foo"] }
|
||||
let(:sources) { ["bar"] }
|
||||
let(:hooks) { ["hoook"] }
|
||||
let(:hooks) { ["thehook"] }
|
||||
|
||||
shared_examples "it cleans up" do
|
||||
it "the path" do
|
||||
|
@ -156,7 +156,7 @@ RSpec.describe Bundler::Plugin::Index do
|
|||
end
|
||||
|
||||
it "the hook" do
|
||||
expect(index.hook_plugins("xhoook")).to be_empty
|
||||
expect(index.hook_plugins("xthehook")).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -164,7 +164,7 @@ RSpec.describe Bundler::Plugin::Index do
|
|||
before do
|
||||
expect do
|
||||
path = lib_path("cplugin")
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["foo"], ["xbar"], ["xhoook"])
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["foo"], ["xbar"], ["xthehook"])
|
||||
end.to raise_error(Index::CommandConflict)
|
||||
end
|
||||
|
||||
|
@ -175,7 +175,7 @@ RSpec.describe Bundler::Plugin::Index do
|
|||
before do
|
||||
expect do
|
||||
path = lib_path("cplugin")
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["xfoo"], ["bar"], ["xhoook"])
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["xfoo"], ["bar"], ["xthehook"])
|
||||
end.to raise_error(Index::SourceConflict)
|
||||
end
|
||||
|
||||
|
@ -186,7 +186,7 @@ RSpec.describe Bundler::Plugin::Index do
|
|||
before do
|
||||
expect do
|
||||
path = lib_path("cplugin")
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["foo"], ["bar"], ["xhoook"])
|
||||
index.register_plugin("cplugin", path.to_s, [path.join("lib").to_s], ["foo"], ["bar"], ["xthehook"])
|
||||
end.to raise_error(Index::CommandConflict)
|
||||
end
|
||||
|
||||
|
|
|
@ -3,8 +3,19 @@
|
|||
RSpec.describe Bundler::Resolver::Candidate do
|
||||
it "compares fine" do
|
||||
version1 = described_class.new("1.12.5", :specs => [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }])
|
||||
version2 = described_class.new("1.12.5")
|
||||
version2 = described_class.new("1.12.5") # passing no specs creates a platform specific candidate, so sorts higher
|
||||
|
||||
expect(version1 >= version2).to be true
|
||||
expect(version2 >= version1).to be true
|
||||
|
||||
expect(version1.generic! == version2.generic!).to be true
|
||||
expect(version1.platform_specific! == version2.platform_specific!).to be true
|
||||
|
||||
expect(version1.platform_specific! >= version2.generic!).to be true
|
||||
expect(version2.platform_specific! >= version1.generic!).to be true
|
||||
|
||||
version1 = described_class.new("1.12.5", :specs => [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }])
|
||||
version2 = described_class.new("1.12.5", :specs => [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::X64_LINUX }])
|
||||
|
||||
expect(version2 >= version1).to be true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -27,7 +27,7 @@ RSpec.describe Bundler::Settings do
|
|||
"gem.mit" => "false",
|
||||
"gem.test" => "minitest",
|
||||
"thingy" => <<-EOS.tr("\n", " "),
|
||||
--asdf --fdsa --ty=oh man i hope this doesnt break bundler because
|
||||
--asdf --fdsa --ty=oh man i hope this doesn't break bundler because
|
||||
that would suck --ehhh=oh geez it looks like i might have broken bundler somehow
|
||||
--very-important-option=DontDeleteRoo
|
||||
--very-important-option=DontDeleteRoo
|
||||
|
|
|
@ -248,6 +248,8 @@ RSpec.describe Bundler::SharedHelpers do
|
|||
|
||||
shared_examples_for "ENV['BUNDLER_SETUP'] gets set correctly" do
|
||||
it "ensures bundler/setup is set in ENV['BUNDLER_SETUP']" do
|
||||
skip "Does not play well with DidYouMean being a bundled gem instead of a default gem in Ruby 2.6" if RUBY_VERSION < "2.7"
|
||||
|
||||
subject.set_bundle_environment
|
||||
expect(ENV["BUNDLER_SETUP"]).to eq("#{source_lib_dir}/bundler/setup")
|
||||
end
|
||||
|
|
|
@ -144,7 +144,7 @@ RSpec.describe "bundle add" do
|
|||
end
|
||||
|
||||
describe "with --github" do
|
||||
it "adds dependency with specified github source" do
|
||||
it "adds dependency with specified github source", :realworld do
|
||||
bundle "add rake --github=ruby/rake"
|
||||
|
||||
expect(bundled_app_gemfile.read).to match(%r{gem "rake", "~> 13\.0", :github => "ruby\/rake"})
|
||||
|
@ -152,7 +152,7 @@ RSpec.describe "bundle add" do
|
|||
end
|
||||
|
||||
describe "with --github and --branch" do
|
||||
it "adds dependency with specified github source and branch" do
|
||||
it "adds dependency with specified github source and branch", :realworld do
|
||||
bundle "add rake --github=ruby/rake --branch=master"
|
||||
|
||||
expect(bundled_app_gemfile.read).to match(%r{gem "rake", "~> 13\.0", :github => "ruby\/rake", :branch => "master"})
|
||||
|
@ -160,7 +160,7 @@ RSpec.describe "bundle add" do
|
|||
end
|
||||
|
||||
describe "with --github and --ref" do
|
||||
it "adds dependency with specified github source and ref" do
|
||||
it "adds dependency with specified github source and ref", :realworld do
|
||||
bundle "add rake --github=ruby/rake --ref=5c60da8"
|
||||
|
||||
expect(bundled_app_gemfile.read).to match(%r{gem "rake", "~> 13\.0", :github => "ruby\/rake", :ref => "5c60da8"})
|
||||
|
|
|
@ -188,7 +188,7 @@ RSpec.describe "bundle binstubs <gem>" do
|
|||
lockfile lockfile.gsub(/BUNDLED WITH\n .*$/m, "BUNDLED WITH\n 2.3.0")
|
||||
end
|
||||
|
||||
it "installs and runs the exact version of bundler", :rubygems => ">= 3.3.0.dev" do
|
||||
it "installs and runs the exact version of bundler", :rubygems => ">= 3.3.0.dev", :realworld => true do
|
||||
sys_exec "bin/bundle install --verbose", :artifice => "vcr"
|
||||
expect(exitstatus).not_to eq(42)
|
||||
expect(out).to include("Bundler 2.999.999 is running, but your lockfile was generated with 2.3.0. Installing Bundler 2.3.0 and restarting using that version.")
|
||||
|
@ -224,7 +224,7 @@ RSpec.describe "bundle binstubs <gem>" do
|
|||
context "when update --bundler is called" do
|
||||
before { lockfile.gsub(system_bundler_version, "1.1.1") }
|
||||
|
||||
it "calls through to the latest bundler version" do
|
||||
it "calls through to the latest bundler version", :realworld do
|
||||
sys_exec "bin/bundle update --bundler", :env => { "DEBUG" => "1" }
|
||||
using_bundler_line = /Using bundler ([\w\.]+)\n/.match(out)
|
||||
expect(using_bundler_line).to_not be_nil
|
||||
|
|
|
@ -625,7 +625,7 @@ RSpec.describe "bundle clean" do
|
|||
expect(out).to eq("1.0")
|
||||
end
|
||||
|
||||
it "when using --force, it doesn't remove default gem binaries" do
|
||||
it "when using --force, it doesn't remove default gem binaries", :realworld do
|
||||
skip "does not work on old rubies because the realworld gems that need to be installed don't support them" if RUBY_VERSION < "2.7.0"
|
||||
|
||||
skip "does not work on rubygems versions where `--install_dir` doesn't respect --default" unless Gem::Installer.for_spec(loaded_gemspec, :install_dir => "/foo").default_spec_file == "/foo/specifications/default/bundler-#{Bundler::VERSION}.gemspec" # Since rubygems 3.2.0.rc.2
|
||||
|
|
|
@ -134,7 +134,7 @@ RSpec.describe "bundle doctor" do
|
|||
end
|
||||
end
|
||||
|
||||
context "when home contains filesname with special characters" do
|
||||
context "when home contains filenames with special characters" do
|
||||
it "escape filename before command execute" do
|
||||
doctor = Bundler::CLI::Doctor.new({})
|
||||
expect(doctor).to receive(:`).with("/usr/bin/otool -L \\$\\(date\\)\\ \\\"\\'\\\\.bundle").and_return("dummy string")
|
||||
|
|
|
@ -1076,4 +1076,31 @@ RSpec.describe "bundle install with gem sources" do
|
|||
G
|
||||
end
|
||||
end
|
||||
|
||||
context "when a gem has equivalent versions with inconsistent dependencies" do
|
||||
before do
|
||||
build_repo4 do
|
||||
build_gem "autobuild", "1.10.rc2" do |s|
|
||||
s.add_dependency "utilrb", ">= 1.6.0"
|
||||
end
|
||||
|
||||
build_gem "autobuild", "1.10.0.rc2" do |s|
|
||||
s.add_dependency "utilrb", ">= 2.0"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "does not crash unexpectedly" do
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "autobuild", "1.10.rc2"
|
||||
G
|
||||
|
||||
bundle "install --jobs 1", :raise_on_error => false
|
||||
|
||||
expect(err).not_to include("ERROR REPORT TEMPLATE")
|
||||
expect(err).to include("Could not find compatible versions")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -319,6 +319,61 @@ RSpec.describe "bundle lock" do
|
|||
expect(lockfile.platforms).to match_array([x86_mingw32, specific_local_platform].uniq)
|
||||
end
|
||||
|
||||
it "also cleans up redundant platform gems when removing platforms" do
|
||||
build_repo4 do
|
||||
build_gem "nokogiri", "1.12.0"
|
||||
build_gem "nokogiri", "1.12.0" do |s|
|
||||
s.platform = "x86_64-darwin"
|
||||
end
|
||||
end
|
||||
|
||||
simulate_platform "x86_64-darwin-22" do
|
||||
install_gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "nokogiri"
|
||||
G
|
||||
end
|
||||
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.12.0)
|
||||
nokogiri (1.12.0-x86_64-darwin)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
simulate_platform "x86_64-darwin-22" do
|
||||
bundle "lock --remove-platform ruby"
|
||||
end
|
||||
|
||||
expect(lockfile).to eq <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.12.0-x86_64-darwin)
|
||||
|
||||
PLATFORMS
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
|
||||
it "errors when removing all platforms" do
|
||||
bundle "lock --remove-platform #{specific_local_platform}", :raise_on_error => false
|
||||
expect(err).to include("Removing all platforms from the bundle is not allowed")
|
||||
|
@ -713,133 +768,212 @@ RSpec.describe "bundle lock" do
|
|||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
end
|
||||
|
||||
it "properly shows resolution errors including OR requirements" do
|
||||
build_repo4 do
|
||||
build_gem "activeadmin", "2.13.1" do |s|
|
||||
s.add_dependency "railties", ">= 6.1", "< 7.1"
|
||||
end
|
||||
build_gem "actionpack", "6.1.4"
|
||||
build_gem "actionpack", "7.0.3.1"
|
||||
build_gem "actionpack", "7.0.4"
|
||||
build_gem "railties", "6.1.4" do |s|
|
||||
s.add_dependency "actionpack", "6.1.4"
|
||||
end
|
||||
build_gem "rails", "7.0.3.1" do |s|
|
||||
s.add_dependency "railties", "7.0.3.1"
|
||||
end
|
||||
build_gem "rails", "7.0.4" do |s|
|
||||
s.add_dependency "railties", "7.0.4"
|
||||
end
|
||||
it "properly shows resolution errors including OR requirements" do
|
||||
build_repo4 do
|
||||
build_gem "activeadmin", "2.13.1" do |s|
|
||||
s.add_dependency "railties", ">= 6.1", "< 7.1"
|
||||
end
|
||||
build_gem "actionpack", "6.1.4"
|
||||
build_gem "actionpack", "7.0.3.1"
|
||||
build_gem "actionpack", "7.0.4"
|
||||
build_gem "railties", "6.1.4" do |s|
|
||||
s.add_dependency "actionpack", "6.1.4"
|
||||
end
|
||||
build_gem "rails", "7.0.3.1" do |s|
|
||||
s.add_dependency "railties", "7.0.3.1"
|
||||
end
|
||||
build_gem "rails", "7.0.4" do |s|
|
||||
s.add_dependency "railties", "7.0.4"
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "rails", ">= 7.0.3.1"
|
||||
gem "activeadmin", "2.13.1"
|
||||
G
|
||||
|
||||
bundle "lock", :raise_on_error => false
|
||||
|
||||
expect(err).to eq <<~ERR.strip
|
||||
Could not find compatible versions
|
||||
|
||||
Because rails >= 7.0.4 depends on railties = 7.0.4
|
||||
and rails < 7.0.4 depends on railties = 7.0.3.1,
|
||||
railties = 7.0.3.1 OR = 7.0.4 is required.
|
||||
So, because railties = 7.0.3.1 OR = 7.0.4 could not be found in rubygems repository #{file_uri_for(gem_repo4)}/ or installed locally,
|
||||
version solving has failed.
|
||||
ERR
|
||||
end
|
||||
|
||||
it "is able to display some explanation on crazy irresolvable cases" do
|
||||
build_repo4 do
|
||||
build_gem "activeadmin", "2.13.1" do |s|
|
||||
s.add_dependency "ransack", "= 3.1.0"
|
||||
end
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
# Activemodel is missing as a dependency in lockfile
|
||||
build_gem "ransack", "3.1.0" do |s|
|
||||
s.add_dependency "activemodel", ">= 6.0.4"
|
||||
s.add_dependency "activesupport", ">= 6.0.4"
|
||||
end
|
||||
gem "rails", ">= 7.0.3.1"
|
||||
gem "activeadmin", "2.13.1"
|
||||
G
|
||||
|
||||
%w[6.0.4 7.0.2.3 7.0.3.1 7.0.4].each do |version|
|
||||
build_gem "activesupport", version
|
||||
bundle "lock", :raise_on_error => false
|
||||
|
||||
# Activemodel is only available on 6.0.4
|
||||
if version == "6.0.4"
|
||||
build_gem "activemodel", version do |s|
|
||||
s.add_dependency "activesupport", version
|
||||
end
|
||||
expect(err).to eq <<~ERR.strip
|
||||
Could not find compatible versions
|
||||
|
||||
Because rails >= 7.0.4 depends on railties = 7.0.4
|
||||
and rails < 7.0.4 depends on railties = 7.0.3.1,
|
||||
railties = 7.0.3.1 OR = 7.0.4 is required.
|
||||
So, because railties = 7.0.3.1 OR = 7.0.4 could not be found in rubygems repository #{file_uri_for(gem_repo4)}/ or installed locally,
|
||||
version solving has failed.
|
||||
ERR
|
||||
end
|
||||
|
||||
it "is able to display some explanation on crazy irresolvable cases" do
|
||||
build_repo4 do
|
||||
build_gem "activeadmin", "2.13.1" do |s|
|
||||
s.add_dependency "ransack", "= 3.1.0"
|
||||
end
|
||||
|
||||
# Activemodel is missing as a dependency in lockfile
|
||||
build_gem "ransack", "3.1.0" do |s|
|
||||
s.add_dependency "activemodel", ">= 6.0.4"
|
||||
s.add_dependency "activesupport", ">= 6.0.4"
|
||||
end
|
||||
|
||||
%w[6.0.4 7.0.2.3 7.0.3.1 7.0.4].each do |version|
|
||||
build_gem "activesupport", version
|
||||
|
||||
# Activemodel is only available on 6.0.4
|
||||
if version == "6.0.4"
|
||||
build_gem "activemodel", version do |s|
|
||||
s.add_dependency "activesupport", version
|
||||
end
|
||||
end
|
||||
|
||||
build_gem "rails", version do |s|
|
||||
# Depednencies of Rails 7.0.2.3 are in reverse order
|
||||
if version == "7.0.2.3"
|
||||
s.add_dependency "activesupport", version
|
||||
s.add_dependency "activemodel", version
|
||||
else
|
||||
s.add_dependency "activemodel", version
|
||||
s.add_dependency "activesupport", version
|
||||
end
|
||||
build_gem "rails", version do |s|
|
||||
# Depednencies of Rails 7.0.2.3 are in reverse order
|
||||
if version == "7.0.2.3"
|
||||
s.add_dependency "activesupport", version
|
||||
s.add_dependency "activemodel", version
|
||||
else
|
||||
s.add_dependency "activemodel", version
|
||||
s.add_dependency "activesupport", version
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "rails", ">= 7.0.2.3"
|
||||
gem "activeadmin", "= 2.13.1"
|
||||
G
|
||||
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
activeadmin (2.13.1)
|
||||
ransack (= 3.1.0)
|
||||
ransack (3.1.0)
|
||||
activemodel (>= 6.0.4)
|
||||
|
||||
PLATFORMS
|
||||
#{lockfile_platforms}
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin (= 2.13.1)
|
||||
ransack (= 3.1.0)
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "lock", :raise_on_error => false
|
||||
|
||||
expect(err).to eq <<~ERR.strip
|
||||
Could not find compatible versions
|
||||
|
||||
Because every version of activemodel depends on activesupport = 6.0.4
|
||||
and rails >= 7.0.2.3, < 7.0.3.1 depends on activesupport = 7.0.2.3,
|
||||
every version of activemodel is incompatible with rails >= 7.0.2.3, < 7.0.3.1.
|
||||
And because rails >= 7.0.2.3, < 7.0.3.1 depends on activemodel = 7.0.2.3,
|
||||
rails >= 7.0.2.3, < 7.0.3.1 is forbidden.
|
||||
(1) So, because rails >= 7.0.3.1, < 7.0.4 depends on activemodel = 7.0.3.1
|
||||
and rails >= 7.0.4 depends on activemodel = 7.0.4,
|
||||
rails >= 7.0.2.3 requires activemodel = 7.0.3.1 OR = 7.0.4.
|
||||
|
||||
Because rails >= 7.0.2.3, < 7.0.3.1 depends on activemodel = 7.0.2.3
|
||||
and rails >= 7.0.3.1, < 7.0.4 depends on activesupport = 7.0.3.1,
|
||||
rails >= 7.0.2.3, < 7.0.4 requires activemodel = 7.0.2.3 or activesupport = 7.0.3.1.
|
||||
And because rails >= 7.0.4 depends on activesupport = 7.0.4
|
||||
and every version of activemodel depends on activesupport = 6.0.4,
|
||||
activemodel != 7.0.2.3 is incompatible with rails >= 7.0.2.3.
|
||||
And because rails >= 7.0.2.3 requires activemodel = 7.0.3.1 OR = 7.0.4 (1),
|
||||
rails >= 7.0.2.3 is forbidden.
|
||||
So, because Gemfile depends on rails >= 7.0.2.3,
|
||||
version solving has failed.
|
||||
ERR
|
||||
end
|
||||
|
||||
it "does not accidentally resolves to prereleases" do
|
||||
build_repo4 do
|
||||
build_gem "autoproj", "2.0.3" do |s|
|
||||
s.add_dependency "autobuild", ">= 1.10.0.a"
|
||||
s.add_dependency "tty-prompt"
|
||||
end
|
||||
|
||||
build_gem "tty-prompt", "0.6.0"
|
||||
build_gem "tty-prompt", "0.7.0"
|
||||
|
||||
build_gem "autobuild", "1.10.0.b3"
|
||||
build_gem "autobuild", "1.10.1" do |s|
|
||||
s.add_dependency "tty-prompt", "~> 0.6.0"
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
gem "autoproj", ">= 2.0.0"
|
||||
G
|
||||
|
||||
bundle "lock"
|
||||
expect(lockfile).to_not include("autobuild (1.10.0.b3)")
|
||||
expect(lockfile).to include("autobuild (1.10.1)")
|
||||
end
|
||||
|
||||
it "deals with platform specific incompatibilities" do
|
||||
build_repo4 do
|
||||
build_gem "activerecord", "6.0.6"
|
||||
build_gem "activerecord-jdbc-adapter", "60.4" do |s|
|
||||
s.platform = "java"
|
||||
s.add_dependency "activerecord", "~> 6.0.0"
|
||||
end
|
||||
build_gem "activerecord-jdbc-adapter", "61.0" do |s|
|
||||
s.platform = "java"
|
||||
s.add_dependency "activerecord", "~> 6.1.0"
|
||||
end
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
gem "activerecord", "6.0.6"
|
||||
gem "activerecord-jdbc-adapter", "61.0"
|
||||
G
|
||||
|
||||
simulate_platform "universal-java-19" do
|
||||
bundle "lock", :raise_on_error => false
|
||||
end
|
||||
|
||||
expect(err).to include("Could not find compatible versions")
|
||||
expect(err).not_to include("ERROR REPORT TEMPLATE")
|
||||
end
|
||||
|
||||
context "when re-resolving to include prereleases" do
|
||||
before do
|
||||
build_repo4 do
|
||||
build_gem "tzinfo-data", "1.2022.7"
|
||||
build_gem "rails", "7.1.0.alpha" do |s|
|
||||
s.add_dependency "activesupport"
|
||||
end
|
||||
build_gem "activesupport", "7.1.0.alpha"
|
||||
end
|
||||
end
|
||||
|
||||
it "does not end up including gems scoped to other platforms in the lockfile" do
|
||||
gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "rails", ">= 7.0.2.3"
|
||||
gem "activeadmin", "= 2.13.1"
|
||||
gem "rails"
|
||||
gem "tzinfo-data", platform: :windows
|
||||
G
|
||||
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
activeadmin (2.13.1)
|
||||
ransack (= 3.1.0)
|
||||
ransack (3.1.0)
|
||||
activemodel (>= 6.0.4)
|
||||
simulate_platform "x86_64-darwin-22" do
|
||||
bundle "lock"
|
||||
end
|
||||
|
||||
PLATFORMS
|
||||
#{lockfile_platforms}
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin (= 2.13.1)
|
||||
ransack (= 3.1.0)
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "lock", :raise_on_error => false
|
||||
|
||||
expect(err).to eq <<~ERR.strip
|
||||
Could not find compatible versions
|
||||
|
||||
Because every version of activemodel depends on activesupport = 6.0.4
|
||||
and rails >= 7.0.2.3, < 7.0.3.1 depends on activesupport = 7.0.2.3,
|
||||
every version of activemodel is incompatible with rails >= 7.0.2.3, < 7.0.3.1.
|
||||
And because rails >= 7.0.2.3, < 7.0.3.1 depends on activemodel = 7.0.2.3,
|
||||
rails >= 7.0.2.3, < 7.0.3.1 is forbidden.
|
||||
(1) So, because rails >= 7.0.3.1, < 7.0.4 depends on activemodel = 7.0.3.1
|
||||
and rails >= 7.0.4 depends on activemodel = 7.0.4,
|
||||
rails >= 7.0.2.3 requires activemodel = 7.0.3.1 OR = 7.0.4.
|
||||
|
||||
Because rails >= 7.0.2.3, < 7.0.3.1 depends on activemodel = 7.0.2.3
|
||||
and rails >= 7.0.3.1, < 7.0.4 depends on activesupport = 7.0.3.1,
|
||||
rails >= 7.0.2.3, < 7.0.4 requires activemodel = 7.0.2.3 or activesupport = 7.0.3.1.
|
||||
And because rails >= 7.0.4 depends on activesupport = 7.0.4
|
||||
and every version of activemodel depends on activesupport = 6.0.4,
|
||||
activemodel != 7.0.2.3 is incompatible with rails >= 7.0.2.3.
|
||||
And because rails >= 7.0.2.3 requires activemodel = 7.0.3.1 OR = 7.0.4 (1),
|
||||
rails >= 7.0.2.3 is forbidden.
|
||||
So, because Gemfile depends on rails >= 7.0.2.3,
|
||||
version solving has failed.
|
||||
ERR
|
||||
expect(lockfile).not_to include("tzinfo-data (1.2022.7)")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -58,6 +58,64 @@ RSpec.describe "bundle open" do
|
|||
expect(out).to include("bundler_editor #{default_bundle_path("gems", "activerecord-2.3.2")}")
|
||||
end
|
||||
|
||||
it "opens subpath of the gem" do
|
||||
bundle "open activerecord --path lib/activerecord", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }
|
||||
expect(out).to include("editor #{default_bundle_path("gems", "activerecord-2.3.2")}/lib/activerecord")
|
||||
end
|
||||
|
||||
it "opens subpath file of the gem" do
|
||||
bundle "open activerecord --path lib/version.rb", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }
|
||||
expect(out).to include("editor #{default_bundle_path("gems", "activerecord-2.3.2")}/lib/version.rb")
|
||||
end
|
||||
|
||||
it "opens deep subpath of the gem" do
|
||||
bundle "open activerecord --path lib/active_record", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }
|
||||
expect(out).to include("editor #{default_bundle_path("gems", "activerecord-2.3.2")}/lib/active_record")
|
||||
end
|
||||
|
||||
it "requires value for --path arg" do
|
||||
bundle "open activerecord --path", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }, :raise_on_error => false
|
||||
expect(err).to eq "Cannot specify `--path` option without a value"
|
||||
end
|
||||
|
||||
it "suggests alternatives for similar-sounding gems when using subpath" do
|
||||
bundle "open Rails --path README.md", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }, :raise_on_error => false
|
||||
expect(err).to match(/did you mean rails\?/i)
|
||||
end
|
||||
|
||||
it "suggests alternatives for similar-sounding gems when using deep subpath" do
|
||||
bundle "open Rails --path some/path/here", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }, :raise_on_error => false
|
||||
expect(err).to match(/did you mean rails\?/i)
|
||||
end
|
||||
|
||||
it "opens subpath of the short worded gem" do
|
||||
bundle "open rec --path CHANGELOG.md", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }
|
||||
expect(out).to include("editor #{default_bundle_path("gems", "activerecord-2.3.2")}/CHANGELOG.md")
|
||||
end
|
||||
|
||||
it "opens deep subpath of the short worded gem" do
|
||||
bundle "open rec --path lib/activerecord", :env => { "EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => "" }
|
||||
expect(out).to include("editor #{default_bundle_path("gems", "activerecord-2.3.2")}/lib/activerecord")
|
||||
end
|
||||
|
||||
it "opens subpath of the selected matching gem", :readline do
|
||||
env = { "EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor" }
|
||||
bundle "open active --path CHANGELOG.md", :env => env do |input, _, _|
|
||||
input.puts "2"
|
||||
end
|
||||
|
||||
expect(out).to match(%r{bundler_editor #{default_bundle_path('gems', 'activerecord-2.3.2')}/CHANGELOG\.md\z})
|
||||
end
|
||||
|
||||
it "opens deep subpath of the selected matching gem", :readline do
|
||||
env = { "EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor" }
|
||||
bundle "open active --path lib/activerecord/version.rb", :env => env do |input, _, _|
|
||||
input.puts "2"
|
||||
end
|
||||
|
||||
expect(out).to match(%r{bundler_editor #{default_bundle_path('gems', 'activerecord-2.3.2')}/lib/activerecord/version\.rb\z})
|
||||
end
|
||||
|
||||
it "select the gem from many match gems", :readline do
|
||||
env = { "EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor" }
|
||||
bundle "open active", :env => env do |input, _, _|
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "bundle viz", :bundler => "< 3", :if => Bundler.which("dot") do
|
||||
RSpec.describe "bundle viz", :bundler => "< 3", :if => Bundler.which("dot"), :realworld => true do
|
||||
before do
|
||||
realworld_system_gems "ruby-graphviz --version 1.2.5"
|
||||
end
|
||||
|
|
|
@ -1481,8 +1481,6 @@ In Gemfile:
|
|||
|
||||
describe "without git installed" do
|
||||
it "prints a better error message when installing" do
|
||||
build_git "foo"
|
||||
|
||||
gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ RSpec.describe "bundle install with gems on multiple sources" do
|
|||
end
|
||||
|
||||
it "fails", :bundler => "3" do
|
||||
bundle :instal, :artifice => "compact_index", :raise_on_error => false
|
||||
bundle :install, :artifice => "compact_index", :raise_on_error => false
|
||||
expect(err).to include("Each source after the first must include a block")
|
||||
expect(exitstatus).to eq(4)
|
||||
end
|
||||
|
@ -1320,7 +1320,7 @@ RSpec.describe "bundle install with gems on multiple sources" do
|
|||
expect(out).to include("Using example 0.1.0")
|
||||
end
|
||||
|
||||
it "fails inmmediately with a helpful error when a rubygems source does not exist and bundler/setup is required" do
|
||||
it "fails immediately with a helpful error when a rubygems source does not exist and bundler/setup is required" do
|
||||
gemfile <<-G
|
||||
source "https://gem.repo1"
|
||||
|
||||
|
@ -1339,7 +1339,7 @@ RSpec.describe "bundle install with gems on multiple sources" do
|
|||
expect(err).to include("Could not find gem 'example' in locally installed gems.")
|
||||
end
|
||||
|
||||
it "fails inmmediately with a helpful error when a non retriable network error happens while resolving sources" do
|
||||
it "fails immediately with a helpful error when a non retriable network error happens while resolving sources" do
|
||||
gemfile <<-G
|
||||
source "https://gem.repo1"
|
||||
|
||||
|
|
|
@ -6,10 +6,8 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
gem "google-protobuf"
|
||||
G
|
||||
|
||||
context "when on a darwin machine" do
|
||||
before { simulate_platform "x86_64-darwin-15" }
|
||||
|
||||
it "locks to the specific darwin platform" do
|
||||
it "locks to the specific darwin platform" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
install_gemfile(google_protobuf)
|
||||
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
|
||||
|
@ -19,8 +17,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
google-protobuf-3.0.0.alpha.5.0.5.1-universal-darwin
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
it "understands that a non-platform specific gem in a old lockfile doesn't necessarily mean installing the non-specific variant" do
|
||||
it "understands that a non-platform specific gem in a old lockfile doesn't necessarily mean installing the non-specific variant" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
|
||||
system_gems "bundler-2.1.4"
|
||||
|
@ -53,8 +53,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
# make sure the platform that got actually installed with the old bundler is used
|
||||
expect(the_bundle).to include_gem("google-protobuf 3.0.0.alpha.5.0.5.1 universal-darwin")
|
||||
end
|
||||
end
|
||||
|
||||
it "understands that a non-platform specific gem in a new lockfile locked only to RUBY doesn't necessarily mean installing the non-specific variant" do
|
||||
it "understands that a non-platform specific gem in a new lockfile locked only to RUBY doesn't necessarily mean installing the non-specific variant" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
|
||||
system_gems "bundler-2.1.4"
|
||||
|
@ -103,8 +105,59 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
end
|
||||
|
||||
it "doesn't discard previously installed platform specific gem and fall back to ruby on subsequent bundles" do
|
||||
context "when running on a legacy lockfile locked only to RUBY" do
|
||||
around do |example|
|
||||
build_repo4 do
|
||||
build_gem "nokogiri", "1.3.10"
|
||||
build_gem "nokogiri", "1.3.10" do |s|
|
||||
s.platform = "arm64-darwin"
|
||||
s.required_ruby_version = "< #{Gem.ruby_version}"
|
||||
end
|
||||
|
||||
build_gem "bundler", "2.1.4"
|
||||
end
|
||||
|
||||
gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "nokogiri"
|
||||
G
|
||||
|
||||
lockfile <<-L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.3.10)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
|
||||
RUBY VERSION
|
||||
2.5.3p105
|
||||
|
||||
BUNDLED WITH
|
||||
2.1.4
|
||||
L
|
||||
|
||||
simulate_platform "arm64-darwin-22", &example
|
||||
end
|
||||
|
||||
it "still installs the generic RUBY variant if necessary" do
|
||||
bundle "update --bundler", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
end
|
||||
|
||||
it "still installs the generic RUBY variant if necessary, even in frozen mode" do
|
||||
bundle "update --bundler", :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s, "BUNDLE_FROZEN" => "true" }
|
||||
end
|
||||
end
|
||||
|
||||
it "doesn't discard previously installed platform specific gem and fall back to ruby on subsequent bundles" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
build_repo2 do
|
||||
build_gem("libv8", "8.4.255.0")
|
||||
build_gem("libv8", "8.4.255.0") {|s| s.platform = "universal-darwin" }
|
||||
|
@ -147,8 +200,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
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
|
||||
end
|
||||
|
||||
it "chooses platform specific gems even when resolving upon materialization and the API returns more specific plaforms first" do
|
||||
it "chooses platform specific gems even when resolving upon materialization and the API returns more specific platforms first" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
build_repo4 do
|
||||
build_gem("grpc", "1.50.0")
|
||||
build_gem("grpc", "1.50.0") {|s| s.platform = "universal-darwin" }
|
||||
|
@ -179,8 +234,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
bundle "install --verbose", :artifice => "compact_index_precompiled_before", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||
expect(out).to include("Installing grpc 1.50.0 (universal-darwin)")
|
||||
end
|
||||
end
|
||||
|
||||
it "caches the universal-darwin gem when --all-platforms is passed and properly picks it up on further bundler invocations" do
|
||||
it "caches the universal-darwin gem when --all-platforms is passed and properly picks it up on further bundler invocations" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
gemfile(google_protobuf)
|
||||
bundle "cache --all-platforms"
|
||||
|
@ -189,8 +246,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
bundle "install --verbose"
|
||||
expect(err).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
it "caches the universal-darwin gem when cache_all_platforms is configured and properly picks it up on further bundler invocations" do
|
||||
it "caches the universal-darwin gem when cache_all_platforms is configured and properly picks it up on further bundler invocations" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
gemfile(google_protobuf)
|
||||
bundle "config set --local cache_all_platforms true"
|
||||
|
@ -200,44 +259,46 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
bundle "install --verbose"
|
||||
expect(err).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
it "caches multiplatform git gems with a single gemspec when --all-platforms is passed" do
|
||||
git = build_git "pg_array_parser", "1.0"
|
||||
it "caches multiplatform git gems with a single gemspec when --all-platforms is passed" do
|
||||
git = build_git "pg_array_parser", "1.0"
|
||||
|
||||
gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
gem "pg_array_parser", :git => "#{lib_path("pg_array_parser-1.0")}"
|
||||
G
|
||||
gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
gem "pg_array_parser", :git => "#{lib_path("pg_array_parser-1.0")}"
|
||||
G
|
||||
|
||||
lockfile <<-L
|
||||
GIT
|
||||
remote: #{lib_path("pg_array_parser-1.0")}
|
||||
revision: #{git.ref_for("main")}
|
||||
specs:
|
||||
pg_array_parser (1.0-java)
|
||||
pg_array_parser (1.0)
|
||||
lockfile <<-L
|
||||
GIT
|
||||
remote: #{lib_path("pg_array_parser-1.0")}
|
||||
revision: #{git.ref_for("main")}
|
||||
specs:
|
||||
pg_array_parser (1.0-java)
|
||||
pg_array_parser (1.0)
|
||||
|
||||
GEM
|
||||
specs:
|
||||
GEM
|
||||
specs:
|
||||
|
||||
PLATFORMS
|
||||
java
|
||||
#{lockfile_platforms}
|
||||
PLATFORMS
|
||||
java
|
||||
#{lockfile_platforms}
|
||||
|
||||
DEPENDENCIES
|
||||
pg_array_parser!
|
||||
DEPENDENCIES
|
||||
pg_array_parser!
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "config set --local cache_all true"
|
||||
bundle "cache --all-platforms"
|
||||
bundle "config set --local cache_all true"
|
||||
bundle "cache --all-platforms"
|
||||
|
||||
expect(err).to be_empty
|
||||
end
|
||||
expect(err).to be_empty
|
||||
end
|
||||
|
||||
it "uses the platform-specific gem with extra dependencies" do
|
||||
it "uses the platform-specific gem with extra dependencies" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem_with_different_dependencies_per_platform
|
||||
install_gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo2)}"
|
||||
|
@ -250,13 +311,15 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
expect(the_bundle.locked_gems.specs.map(&:full_name)).to eq(["CFPropertyList-1.0",
|
||||
"facter-2.4.6-universal-darwin"])
|
||||
end
|
||||
end
|
||||
|
||||
context "when adding a platform via lock --add_platform" do
|
||||
before do
|
||||
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
|
||||
end
|
||||
context "when adding a platform via lock --add_platform" do
|
||||
before do
|
||||
allow(Bundler::SharedHelpers).to receive(:find_gemfile).and_return(bundled_app_gemfile)
|
||||
end
|
||||
|
||||
it "adds the foreign platform" do
|
||||
it "adds the foreign platform" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
install_gemfile(google_protobuf)
|
||||
bundle "lock --add-platform=#{x64_mingw32}"
|
||||
|
@ -267,8 +330,10 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
google-protobuf-3.0.0.alpha.5.0.5.1-x64-mingw32
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
it "falls back on plain ruby when that version doesnt have a platform-specific gem" do
|
||||
it "falls back on plain ruby when that version doesn't have a platform-specific gem" do
|
||||
simulate_platform "x86_64-darwin-15" do
|
||||
setup_multiplatform_gem
|
||||
install_gemfile(google_protobuf)
|
||||
bundle "lock --add-platform=#{java}"
|
||||
|
@ -483,6 +548,75 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
L
|
||||
end
|
||||
|
||||
it "automatically fixes the lockfile if both RUBY platform and a more specific platform are locked, and some gem has no RUBY variant available" do
|
||||
build_repo4 do
|
||||
build_gem "nokogiri", "1.12.0"
|
||||
build_gem "nokogiri", "1.12.0" do |s|
|
||||
s.platform = "x86_64-darwin"
|
||||
end
|
||||
|
||||
build_gem "nokogiri", "1.13.0"
|
||||
build_gem "nokogiri", "1.13.0" do |s|
|
||||
s.platform = "x86_64-darwin"
|
||||
end
|
||||
|
||||
build_gem("sorbet-static", "0.5.10601") do |s|
|
||||
s.platform = "x86_64-darwin"
|
||||
end
|
||||
end
|
||||
|
||||
simulate_platform "x86_64-darwin-22" do
|
||||
install_gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "nokogiri"
|
||||
gem "sorbet-static"
|
||||
G
|
||||
end
|
||||
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.12.0)
|
||||
nokogiri (1.12.0-x86_64-darwin)
|
||||
sorbet-static (0.5.10601-x86_64-darwin)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
sorbet
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
simulate_platform "x86_64-darwin-22" do
|
||||
bundle "update --conservative nokogiri"
|
||||
end
|
||||
|
||||
expect(lockfile).to eq <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
nokogiri (1.13.0-x86_64-darwin)
|
||||
sorbet-static (0.5.10601-x86_64-darwin)
|
||||
|
||||
PLATFORMS
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
nokogiri
|
||||
sorbet-static
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
|
||||
it "automatically fixes the lockfile if only RUBY platform is locked and some gem has no RUBY variant available" do
|
||||
build_repo4 do
|
||||
build_gem("sorbet-static-and-runtime", "0.5.10160") do |s|
|
||||
|
@ -554,6 +688,63 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
L
|
||||
end
|
||||
|
||||
it "automatically fixes the lockfile without removing other variants if it's missing platform gems, but they are installed locally" do
|
||||
simulate_platform "x86_64-darwin-21" do
|
||||
build_repo4 do
|
||||
build_gem("sorbet-static", "0.5.10549") do |s|
|
||||
s.platform = "universal-darwin-20"
|
||||
end
|
||||
|
||||
build_gem("sorbet-static", "0.5.10549") do |s|
|
||||
s.platform = "universal-darwin-21"
|
||||
end
|
||||
end
|
||||
|
||||
# Make sure sorbet-static-0.5.10549-universal-darwin-21 is installed
|
||||
install_gemfile <<~G
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
|
||||
gem "sorbet-static", "= 0.5.10549"
|
||||
G
|
||||
|
||||
# Make sure the lockfile is missing sorbet-static-0.5.10549-universal-darwin-21
|
||||
lockfile <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
sorbet-static (0.5.10549-universal-darwin-20)
|
||||
|
||||
PLATFORMS
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
sorbet-static (= 0.5.10549)
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
|
||||
bundle "install"
|
||||
|
||||
expect(lockfile).to eq <<~L
|
||||
GEM
|
||||
remote: #{file_uri_for(gem_repo4)}/
|
||||
specs:
|
||||
sorbet-static (0.5.10549-universal-darwin-20)
|
||||
sorbet-static (0.5.10549-universal-darwin-21)
|
||||
|
||||
PLATFORMS
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
sorbet-static (= 0.5.10549)
|
||||
|
||||
BUNDLED WITH
|
||||
#{Bundler::VERSION}
|
||||
L
|
||||
end
|
||||
end
|
||||
|
||||
it "does not remove ruby if gems for other platforms, and not present in the lockfile, exist in the Gemfile" do
|
||||
build_repo4 do
|
||||
build_gem "nokogiri", "1.13.8"
|
||||
|
@ -607,7 +798,7 @@ RSpec.describe "bundle install with specific platforms" do
|
|||
G
|
||||
|
||||
# simulate lockfile which includes both a precompiled gem with:
|
||||
# - Gem the current platform (with imcompatible ruby version)
|
||||
# - Gem the current platform (with incompatible ruby version)
|
||||
# - A source gem with compatible ruby version
|
||||
lockfile <<-L
|
||||
GEM
|
||||
|
|
|
@ -157,7 +157,7 @@ RSpec.shared_examples "bundle install --standalone" do
|
|||
bundle "lock", :dir => cwd, :artifice => "compact_index"
|
||||
end
|
||||
|
||||
it "works and points to the vendored copies, not to the default copies" do
|
||||
it "works and points to the vendored copies, not to the default copies", :realworld do
|
||||
bundle "config set --local path #{bundled_app("bundle")}"
|
||||
bundle :install, :standalone => true, :dir => cwd, :artifice => "compact_index", :env => { "BUNDLER_GEM_DEFAULT_DIR" => system_gem_path.to_s }
|
||||
|
||||
|
|
|
@ -587,7 +587,7 @@ RSpec.describe "major deprecations" do
|
|||
pending "fails with a helpful message", :bundler => "3"
|
||||
end
|
||||
|
||||
context "bundle viz" do
|
||||
context "bundle viz", :realworld do
|
||||
before do
|
||||
realworld_system_gems "ruby-graphviz --version 1.2.5"
|
||||
create_file "gems.rb", "source \"#{file_uri_for(gem_repo1)}\""
|
||||
|
|
|
@ -219,14 +219,14 @@ RSpec.describe "real world edgecases", :realworld => true do
|
|||
end
|
||||
|
||||
it "doesn't hang on big gemfile" do
|
||||
skip "Only for ruby 2.7.3" if RUBY_VERSION != "2.7.3" || RUBY_PLATFORM.include?("darwin")
|
||||
skip "Only for ruby 2.7" unless RUBY_VERSION.start_with?("2.7")
|
||||
|
||||
gemfile <<~G
|
||||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
ruby "2.7.3"
|
||||
ruby "~> 2.7.7"
|
||||
|
||||
gem "rails"
|
||||
gem "pg", ">= 0.18", "< 2.0"
|
||||
|
@ -321,17 +321,17 @@ RSpec.describe "real world edgecases", :realworld => true do
|
|||
G
|
||||
|
||||
if Bundler.feature_flag.bundler_3_mode?
|
||||
# Conflicts on bundler version, so fails earlier
|
||||
# Conflicts on bundler version, so we count attempts differently
|
||||
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }, :raise_on_error => false
|
||||
expect(out).to display_total_steps_of(435)
|
||||
expect(out.split("\n").grep(/backtracking to/).count).to eq(16)
|
||||
else
|
||||
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
|
||||
expect(out).to display_total_steps_of(1025)
|
||||
expect(out).to include("Solution found after 7 attempts")
|
||||
end
|
||||
end
|
||||
|
||||
it "doesn't hang on tricky gemfile" do
|
||||
skip "Only for ruby 2.7.3" if RUBY_VERSION != "2.7.3" || RUBY_PLATFORM.include?("darwin")
|
||||
skip "Only for ruby 2.7" unless RUBY_VERSION.start_with?("2.7")
|
||||
|
||||
gemfile <<~G
|
||||
source 'https://rubygems.org'
|
||||
|
@ -349,190 +349,168 @@ RSpec.describe "real world edgecases", :realworld => true do
|
|||
|
||||
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
|
||||
|
||||
if Bundler.feature_flag.bundler_3_mode?
|
||||
expect(out).to display_total_steps_of(890)
|
||||
else
|
||||
expect(out).to display_total_steps_of(891)
|
||||
end
|
||||
expect(out).to include("Solution found after 6 attempts")
|
||||
end
|
||||
|
||||
it "doesn't hang on nix gemfile" do
|
||||
skip "Only for ruby 3.0.1" if RUBY_VERSION != "3.0.1" || RUBY_PLATFORM.include?("darwin")
|
||||
skip "Only for ruby 3.0" unless RUBY_VERSION.start_with?("3.0")
|
||||
|
||||
gemfile <<~G
|
||||
source "https://rubygems.org" do
|
||||
gem "addressable"
|
||||
gem "atk"
|
||||
gem "awesome_print"
|
||||
gem "bacon"
|
||||
gem "byebug"
|
||||
gem "cairo"
|
||||
gem "cairo-gobject"
|
||||
gem "camping"
|
||||
gem "charlock_holmes"
|
||||
gem "cld3"
|
||||
gem "cocoapods"
|
||||
gem "cocoapods-acknowledgements"
|
||||
gem "cocoapods-art"
|
||||
gem "cocoapods-bin"
|
||||
gem "cocoapods-browser"
|
||||
gem "cocoapods-bugsnag"
|
||||
gem "cocoapods-check"
|
||||
gem "cocoapods-clean"
|
||||
gem "cocoapods-clean_build_phases_scripts"
|
||||
gem "cocoapods-core"
|
||||
gem "cocoapods-coverage"
|
||||
gem "cocoapods-deintegrate"
|
||||
gem "cocoapods-dependencies"
|
||||
gem "cocoapods-deploy"
|
||||
gem "cocoapods-downloader"
|
||||
gem "cocoapods-expert-difficulty"
|
||||
gem "cocoapods-fix-react-native"
|
||||
gem "cocoapods-generate"
|
||||
gem "cocoapods-git_url_rewriter"
|
||||
gem "cocoapods-keys"
|
||||
gem "cocoapods-no-dev-schemes"
|
||||
gem "cocoapods-open"
|
||||
gem "cocoapods-packager"
|
||||
gem "cocoapods-playgrounds"
|
||||
gem "cocoapods-plugins"
|
||||
gem "cocoapods-prune-localizations"
|
||||
gem "cocoapods-rome"
|
||||
gem "cocoapods-search"
|
||||
gem "cocoapods-sorted-search"
|
||||
gem "cocoapods-static-swift-framework"
|
||||
gem "cocoapods-stats"
|
||||
gem "cocoapods-tdfire-binary"
|
||||
gem "cocoapods-testing"
|
||||
gem "cocoapods-trunk"
|
||||
gem "cocoapods-try"
|
||||
gem "cocoapods-try-release-fix"
|
||||
gem "cocoapods-update-if-you-dare"
|
||||
gem "cocoapods-whitelist"
|
||||
gem "cocoapods-wholemodule"
|
||||
gem "coderay"
|
||||
gem "concurrent-ruby"
|
||||
gem "curb"
|
||||
gem "curses"
|
||||
gem "daemons"
|
||||
gem "dep-selector-libgecode"
|
||||
gem "digest-sha3"
|
||||
gem "domain_name"
|
||||
gem "do_sqlite3"
|
||||
gem "ethon"
|
||||
gem "eventmachine"
|
||||
gem "excon"
|
||||
gem "faraday"
|
||||
gem "ffi"
|
||||
gem "ffi-rzmq-core"
|
||||
gem "fog-dnsimple"
|
||||
gem "gdk_pixbuf2"
|
||||
gem "gio2"
|
||||
gem "gitlab-markup"
|
||||
gem "glib2"
|
||||
gem "gpgme"
|
||||
gem "gtk2"
|
||||
gem "hashie"
|
||||
gem "highline"
|
||||
gem "hike"
|
||||
gem "hitimes"
|
||||
gem "hpricot"
|
||||
gem "httpclient"
|
||||
gem "http-cookie"
|
||||
gem "iconv"
|
||||
gem "idn-ruby"
|
||||
gem "jbuilder"
|
||||
gem "jekyll"
|
||||
gem "jmespath"
|
||||
gem "jwt"
|
||||
gem "libv8"
|
||||
gem "libxml-ruby"
|
||||
gem "magic"
|
||||
gem "markaby"
|
||||
gem "method_source"
|
||||
gem "mini_magick"
|
||||
gem "msgpack"
|
||||
gem "mysql2"
|
||||
gem "ncursesw"
|
||||
gem "netrc"
|
||||
gem "net-scp"
|
||||
gem "net-ssh"
|
||||
gem "nokogiri"
|
||||
gem "opus-ruby"
|
||||
gem "ovirt-engine-sdk"
|
||||
gem "pango"
|
||||
gem "patron"
|
||||
gem "pcaprub"
|
||||
gem "pg"
|
||||
gem "pry"
|
||||
gem "pry-byebug"
|
||||
gem "pry-doc"
|
||||
gem "public_suffix"
|
||||
gem "puma"
|
||||
gem "rails"
|
||||
gem "rainbow"
|
||||
gem "rbnacl"
|
||||
gem "rb-readline"
|
||||
gem "re2"
|
||||
gem "redis"
|
||||
gem "redis-rack"
|
||||
gem "rest-client"
|
||||
gem "rmagick"
|
||||
gem "rpam2"
|
||||
gem "rspec"
|
||||
gem "rubocop"
|
||||
gem "rubocop-performance"
|
||||
gem "ruby-libvirt"
|
||||
gem "ruby-lxc"
|
||||
gem "ruby-progressbar"
|
||||
gem "ruby-terminfo"
|
||||
gem "ruby-vips"
|
||||
gem "rubyzip"
|
||||
gem "rugged"
|
||||
gem "sassc"
|
||||
gem "scrypt"
|
||||
gem "semian"
|
||||
gem "sequel"
|
||||
gem "sequel_pg"
|
||||
gem "simplecov"
|
||||
gem "sinatra"
|
||||
gem "slop"
|
||||
gem "snappy"
|
||||
gem "sqlite3"
|
||||
gem "taglib-ruby"
|
||||
gem "thrift"
|
||||
gem "tilt"
|
||||
gem "tiny_tds"
|
||||
gem "treetop"
|
||||
gem "typhoeus"
|
||||
gem "tzinfo"
|
||||
gem "unf_ext"
|
||||
gem "uuid4r"
|
||||
gem "whois"
|
||||
gem "zookeeper"
|
||||
end
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "addressable"
|
||||
gem "atk"
|
||||
gem "awesome_print"
|
||||
gem "bacon"
|
||||
gem "byebug"
|
||||
gem "cairo"
|
||||
gem "cairo-gobject"
|
||||
gem "camping"
|
||||
gem "charlock_holmes"
|
||||
gem "cld3"
|
||||
gem "cocoapods"
|
||||
gem "cocoapods-acknowledgements"
|
||||
gem "cocoapods-art"
|
||||
gem "cocoapods-bin"
|
||||
gem "cocoapods-browser"
|
||||
gem "cocoapods-bugsnag"
|
||||
gem "cocoapods-check"
|
||||
gem "cocoapods-clean"
|
||||
gem "cocoapods-clean_build_phases_scripts"
|
||||
gem "cocoapods-core"
|
||||
gem "cocoapods-coverage"
|
||||
gem "cocoapods-deintegrate"
|
||||
gem "cocoapods-dependencies"
|
||||
gem "cocoapods-deploy"
|
||||
gem "cocoapods-downloader"
|
||||
gem "cocoapods-expert-difficulty"
|
||||
gem "cocoapods-fix-react-native"
|
||||
gem "cocoapods-generate"
|
||||
gem "cocoapods-git_url_rewriter"
|
||||
gem "cocoapods-keys"
|
||||
gem "cocoapods-no-dev-schemes"
|
||||
gem "cocoapods-open"
|
||||
gem "cocoapods-packager"
|
||||
gem "cocoapods-playgrounds"
|
||||
gem "cocoapods-plugins"
|
||||
gem "cocoapods-prune-localizations"
|
||||
gem "cocoapods-rome"
|
||||
gem "cocoapods-search"
|
||||
gem "cocoapods-sorted-search"
|
||||
gem "cocoapods-static-swift-framework"
|
||||
gem "cocoapods-stats"
|
||||
gem "cocoapods-tdfire-binary"
|
||||
gem "cocoapods-testing"
|
||||
gem "cocoapods-trunk"
|
||||
gem "cocoapods-try"
|
||||
gem "cocoapods-try-release-fix"
|
||||
gem "cocoapods-update-if-you-dare"
|
||||
gem "cocoapods-whitelist"
|
||||
gem "cocoapods-wholemodule"
|
||||
gem "coderay"
|
||||
gem "concurrent-ruby"
|
||||
gem "curb"
|
||||
gem "curses"
|
||||
gem "daemons"
|
||||
gem "dep-selector-libgecode"
|
||||
gem "digest-sha3"
|
||||
gem "domain_name"
|
||||
gem "do_sqlite3"
|
||||
gem "ethon"
|
||||
gem "eventmachine"
|
||||
gem "excon"
|
||||
gem "faraday"
|
||||
gem "ffi"
|
||||
gem "ffi-rzmq-core"
|
||||
gem "fog-dnsimple"
|
||||
gem "gdk_pixbuf2"
|
||||
gem "gio2"
|
||||
gem "gitlab-markup"
|
||||
gem "glib2"
|
||||
gem "gpgme"
|
||||
gem "gtk2"
|
||||
gem "hashie"
|
||||
gem "highline"
|
||||
gem "hike"
|
||||
gem "hitimes"
|
||||
gem "hpricot"
|
||||
gem "httpclient"
|
||||
gem "http-cookie"
|
||||
gem "iconv"
|
||||
gem "idn-ruby"
|
||||
gem "jbuilder"
|
||||
gem "jekyll"
|
||||
gem "jmespath"
|
||||
gem "jwt"
|
||||
gem "libv8"
|
||||
gem "libxml-ruby"
|
||||
gem "magic"
|
||||
gem "markaby"
|
||||
gem "method_source"
|
||||
gem "mini_magick"
|
||||
gem "msgpack"
|
||||
gem "mysql2"
|
||||
gem "ncursesw"
|
||||
gem "netrc"
|
||||
gem "net-scp"
|
||||
gem "net-ssh"
|
||||
gem "nokogiri"
|
||||
gem "opus-ruby"
|
||||
gem "ovirt-engine-sdk"
|
||||
gem "pango"
|
||||
gem "patron"
|
||||
gem "pcaprub"
|
||||
gem "pg"
|
||||
gem "pry"
|
||||
gem "pry-byebug"
|
||||
gem "pry-doc"
|
||||
gem "public_suffix"
|
||||
gem "puma"
|
||||
gem "rails"
|
||||
gem "rainbow"
|
||||
gem "rbnacl"
|
||||
gem "rb-readline"
|
||||
gem "re2"
|
||||
gem "redis"
|
||||
gem "redis-rack"
|
||||
gem "rest-client"
|
||||
gem "rmagick"
|
||||
gem "rpam2"
|
||||
gem "rspec"
|
||||
gem "rubocop"
|
||||
gem "rubocop-performance"
|
||||
gem "ruby-libvirt"
|
||||
gem "ruby-lxc"
|
||||
gem "ruby-progressbar"
|
||||
gem "ruby-terminfo"
|
||||
gem "ruby-vips"
|
||||
gem "rubyzip"
|
||||
gem "rugged"
|
||||
gem "sassc"
|
||||
gem "scrypt"
|
||||
gem "semian"
|
||||
gem "sequel"
|
||||
gem "sequel_pg"
|
||||
gem "simplecov"
|
||||
gem "sinatra"
|
||||
gem "slop"
|
||||
gem "snappy"
|
||||
gem "sqlite3"
|
||||
gem "taglib-ruby"
|
||||
gem "thrift"
|
||||
gem "tilt"
|
||||
gem "tiny_tds"
|
||||
gem "treetop"
|
||||
gem "typhoeus"
|
||||
gem "tzinfo"
|
||||
gem "unf_ext"
|
||||
gem "uuid4r"
|
||||
gem "whois"
|
||||
gem "zookeeper"
|
||||
G
|
||||
|
||||
bundle :lock, :env => { "DEBUG_RESOLVER" => "1" }
|
||||
|
||||
if Bundler.feature_flag.bundler_3_mode?
|
||||
expect(out).to display_total_steps_of(1874)
|
||||
else
|
||||
expect(out).to display_total_steps_of(1922)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
RSpec::Matchers.define :display_total_steps_of do |expected_steps|
|
||||
match do |out|
|
||||
out.include?("BUNDLER: Finished resolution (#{expected_steps} steps)")
|
||||
end
|
||||
|
||||
failure_message do |out|
|
||||
actual_steps = out.scan(/BUNDLER: Finished resolution \((\d+) steps\)/).first.first
|
||||
|
||||
"Expected resolution to finish in #{expected_steps} steps, but took #{actual_steps}"
|
||||
end
|
||||
expect(out).to include("Solution found after 4 attempts")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "loading dinamically linked library on a bundle exec context", :realworld => true do
|
||||
RSpec.describe "loading dynamically linked library on a bundle exec context", :realworld => true do
|
||||
it "passes ENV right after argv in memory" do
|
||||
create_file "foo.rb", <<~RUBY
|
||||
require 'ffi'
|
||||
|
|
11
spec/bundler/realworld/git_spec.rb
Normal file
11
spec/bundler/realworld/git_spec.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "github source", :realworld => true do
|
||||
it "properly fetches PRs" do
|
||||
install_gemfile <<-G
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "reline", github: "https://github.com/ruby/reline/pull/488"
|
||||
G
|
||||
end
|
||||
end
|
|
@ -28,6 +28,6 @@ RSpec.describe "bundle install with complex dependencies", :realworld => true do
|
|||
gem 'rspec-rails'
|
||||
G
|
||||
|
||||
expect { bundle "lock" }.to take_less_than(18) # seconds
|
||||
expect { bundle "lock" }.to take_less_than(30) # seconds
|
||||
end
|
||||
end
|
||||
|
|
|
@ -155,21 +155,32 @@ RSpec.describe "Resolving platform craziness" do
|
|||
end
|
||||
end
|
||||
|
||||
it "takes the latest ruby gem if the platform specific gem doesn't match the required_ruby_version" do
|
||||
@index = build_index do
|
||||
gem "foo", "1.0.0"
|
||||
gem "foo", "1.0.0", "x64-mingw32"
|
||||
gem "foo", "1.1.0"
|
||||
gem "foo", "1.1.0", "x64-mingw32" do |s|
|
||||
s.required_ruby_version = [">= 2.0", "< 2.4"]
|
||||
context "when the platform specific gem doesn't match the required_ruby_version" do
|
||||
before do
|
||||
@index = build_index do
|
||||
gem "foo", "1.0.0"
|
||||
gem "foo", "1.0.0", "x64-mingw32"
|
||||
gem "foo", "1.1.0"
|
||||
gem "foo", "1.1.0", "x64-mingw32" do |s|
|
||||
s.required_ruby_version = [">= 2.0", "< 2.4"]
|
||||
end
|
||||
gem "Ruby\0", "2.5.1"
|
||||
end
|
||||
gem "Ruby\0", "2.5.1"
|
||||
dep "Ruby\0", "2.5.1"
|
||||
platforms "x64-mingw32"
|
||||
end
|
||||
dep "foo"
|
||||
dep "Ruby\0", "2.5.1"
|
||||
platforms "x64-mingw32"
|
||||
|
||||
should_resolve_as %w[foo-1.1.0]
|
||||
it "takes the latest ruby gem" do
|
||||
dep "foo"
|
||||
|
||||
should_resolve_as %w[foo-1.1.0]
|
||||
end
|
||||
|
||||
it "takes the latest ruby gem, even if requirement does not match previous versions with the same ruby requirement" do
|
||||
dep "foo", "1.1.0"
|
||||
|
||||
should_resolve_as %w[foo-1.1.0]
|
||||
end
|
||||
end
|
||||
|
||||
it "takes the latest ruby gem with required_ruby_version if the platform specific gem doesn't match the required_ruby_version" do
|
||||
|
|
|
@ -168,6 +168,29 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
expect(err).to be_empty
|
||||
end
|
||||
|
||||
it "installs subdependencies quietly if necessary when the install option is not set" do
|
||||
build_repo4 do
|
||||
build_gem "rack" do |s|
|
||||
s.add_dependency "rackdep"
|
||||
end
|
||||
|
||||
build_gem "rackdep", "1.0.0"
|
||||
end
|
||||
|
||||
script <<-RUBY
|
||||
gemfile do
|
||||
source "#{file_uri_for(gem_repo4)}"
|
||||
gem "rack"
|
||||
end
|
||||
|
||||
require "rackdep"
|
||||
puts RACKDEP
|
||||
RUBY
|
||||
|
||||
expect(out).to eq("1.0.0")
|
||||
expect(err).to be_empty
|
||||
end
|
||||
|
||||
it "installs quietly from git if necessary when the install option is not set" do
|
||||
build_git "foo", "1.0.0"
|
||||
baz_ref = build_git("baz", "2.0.0").ref_for("HEAD")
|
||||
|
@ -436,7 +459,7 @@ RSpec.describe "bundler/inline#gemfile" do
|
|||
expect(err).to be_empty
|
||||
end
|
||||
|
||||
it "when requiring fileutils after does not show redefinition warnings" do
|
||||
it "when requiring fileutils after does not show redefinition warnings", :realworld do
|
||||
dependency_installer_loads_fileutils = ruby "require 'rubygems/dependency_installer'; puts $LOADED_FEATURES.grep(/fileutils/)", :raise_on_error => false
|
||||
skip "does not work if rubygems/dependency_installer loads fileutils, which happens until rubygems 3.2.0" unless dependency_installer_loads_fileutils.empty?
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ RSpec.describe "Self management", :rubygems => ">= 3.3.0.dev", :realworld => tru
|
|||
expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION)
|
||||
end
|
||||
|
||||
it "shows a discreet message if locked bundler does not exist" do
|
||||
it "shows a discrete message if locked bundler does not exist" do
|
||||
missing_minor ="#{Bundler::VERSION[0]}.999.999"
|
||||
|
||||
lockfile_bundled_with(missing_minor)
|
||||
|
|
|
@ -556,12 +556,12 @@ RSpec.describe "Bundler.setup" do
|
|||
|
||||
gemfile <<-G
|
||||
source "#{file_uri_for(gem_repo1)}"
|
||||
gem "rack", :git => "#{lib_path("rack-0.8")}", :ref => "main", :branch => "nonexistant"
|
||||
gem "rack", :git => "#{lib_path("rack-0.8")}", :ref => "main", :branch => "nonexistent"
|
||||
G
|
||||
|
||||
bundle %(config set local.rack #{lib_path("local-rack")})
|
||||
run "require 'rack'", :raise_on_error => false
|
||||
expect(err).to match(/is using branch main but Gemfile specifies nonexistant/)
|
||||
expect(err).to match(/is using branch main but Gemfile specifies nonexistent/)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ require "net/http"
|
|||
require_relative "../path"
|
||||
|
||||
CASSETTE_PATH = "#{Spec::Path.spec_dir}/support/artifice/vcr_cassettes"
|
||||
USED_CASSETTES_PATH = "#{Spec::Path.spec_dir}/support/artifice/used_cassettes.txt"
|
||||
CASSETTE_NAME = ENV.fetch("BUNDLER_SPEC_VCR_CASSETTE_NAME") { "realworld" }
|
||||
|
||||
class BundlerVCRHTTP < Net::HTTP
|
||||
|
@ -22,6 +23,10 @@ class BundlerVCRHTTP < Net::HTTP
|
|||
@__vcr_request_handler = handler
|
||||
end
|
||||
|
||||
File.open(USED_CASSETTES_PATH, "a+") do |f|
|
||||
f.puts request_pair_paths.map {|path| Pathname.new(path).relative_path_from(Spec::Path.source_root).to_s }.join("\n")
|
||||
end
|
||||
|
||||
if recorded_response?
|
||||
recorded_response
|
||||
else
|
||||
|
@ -74,27 +79,10 @@ class BundlerVCRHTTP < Net::HTTP
|
|||
|
||||
def request_pair_paths
|
||||
%w[request response].map do |kind|
|
||||
File.join(CASSETTE_PATH, CASSETTE_NAME, file_name_for_key(key + [kind]))
|
||||
File.join(CASSETTE_PATH, CASSETTE_NAME, file_name_for_key(key), kind)
|
||||
end
|
||||
end
|
||||
|
||||
def read_stored_request(path)
|
||||
contents = File.binread(path)
|
||||
headers = {}
|
||||
method = nil
|
||||
path = nil
|
||||
contents.lines.grep(/^> /).each do |line|
|
||||
if line =~ /^> (GET|HEAD|POST|PATCH|PUT|DELETE) (.*)/
|
||||
method = $1
|
||||
path = $2.strip
|
||||
elsif line =~ /^> (.*?): (.*)/
|
||||
headers[$1] = $2
|
||||
end
|
||||
end
|
||||
body = contents =~ /^([^>].*)/m && $1
|
||||
Net::HTTP.const_get(method.capitalize).new(path, headers).tap {|r| r.body = body if body }
|
||||
end
|
||||
|
||||
def request_to_string(request)
|
||||
request_string = []
|
||||
request_string << "> #{request.method.upcase} #{request.path}"
|
||||
|
|
|
@ -298,10 +298,6 @@ module Spec
|
|||
end
|
||||
end
|
||||
|
||||
def build_dep(name, requirements = Gem::Requirement.default, type = :runtime)
|
||||
Bundler::Dependency.new(name, :version => requirements)
|
||||
end
|
||||
|
||||
def build_lib(name, *args, &blk)
|
||||
build_with(LibBuilder, name, args, &blk)
|
||||
end
|
||||
|
|
|
@ -18,22 +18,17 @@ module Spec
|
|||
@platforms ||= ["ruby"]
|
||||
default_source = instance_double("Bundler::Source::Rubygems", :specs => @index, :to_s => "locally install gems")
|
||||
source_requirements = { :default => default_source }
|
||||
args[0] ||= Bundler::SpecSet.new([]) # base
|
||||
args[0].each {|ls| ls.source = default_source }
|
||||
args[1] ||= Bundler::GemVersionPromoter.new # gem_version_promoter
|
||||
args[2] ||= [] # additional_base_requirements
|
||||
originally_locked = args[3] || Bundler::SpecSet.new([])
|
||||
unlock = args[4] || []
|
||||
packages = Hash.new do |h, k|
|
||||
h[k] = Bundler::Resolver::Package.new(k, @platforms, originally_locked, unlock)
|
||||
end
|
||||
base = args[0] || Bundler::SpecSet.new([])
|
||||
base.each {|ls| ls.source = default_source }
|
||||
gem_version_promoter = args[1] || Bundler::GemVersionPromoter.new
|
||||
originally_locked = args[2] || Bundler::SpecSet.new([])
|
||||
unlock = args[3] || []
|
||||
@deps.each do |d|
|
||||
name = d.name
|
||||
platforms = d.gem_platforms(@platforms)
|
||||
source_requirements[name] = d.source = default_source
|
||||
packages[name] = Bundler::Resolver::Package.new(name, platforms, originally_locked, unlock, :dependency => d)
|
||||
end
|
||||
Bundler::Resolver.new(source_requirements, *args[0..2]).start(@deps, packages)
|
||||
packages = Bundler::Resolver::Base.new(source_requirements, @deps, base, @platforms, :locked_specs => originally_locked, :unlock => unlock)
|
||||
Bundler::Resolver.new(packages, gem_version_promoter).start
|
||||
end
|
||||
|
||||
def should_not_resolve
|
||||
|
@ -71,7 +66,7 @@ module Spec
|
|||
s.level = opts.first
|
||||
s.strict = opts.include?(:strict)
|
||||
end
|
||||
should_resolve_and_include specs, [@base, search, [], @locked, unlock]
|
||||
should_resolve_and_include specs, [@base, search, @locked, unlock]
|
||||
end
|
||||
|
||||
def an_awesome_index
|
||||
|
|
|
@ -126,6 +126,46 @@ class TestGemCommandManager < Gem::TestCase
|
|||
@command_manager.unregister_command :crash
|
||||
end
|
||||
|
||||
def test_process_args_with_c_flag
|
||||
custom_start_point = File.join @tempdir, "nice_folder"
|
||||
FileUtils.mkdir_p custom_start_point
|
||||
|
||||
execution_path = nil
|
||||
use_ui @ui do
|
||||
@command_manager[:install].when_invoked do
|
||||
execution_path = Dir.pwd
|
||||
true
|
||||
end
|
||||
@command_manager.process_args %W[-C #{custom_start_point} install net-scp-4.0.0.gem --local]
|
||||
end
|
||||
|
||||
assert_equal custom_start_point, execution_path
|
||||
end
|
||||
|
||||
def test_process_args_with_c_flag_without_path
|
||||
use_ui @ui do
|
||||
assert_raise Gem::MockGemUi::TermError do
|
||||
@command_manager.process_args %w[-C install net-scp-4.0.0.gem --local]
|
||||
end
|
||||
end
|
||||
|
||||
assert_match(/install isn't a directory./i, @ui.error)
|
||||
end
|
||||
|
||||
def test_process_args_with_c_flag_path_not_found
|
||||
custom_start_point = File.join @tempdir, "nice_folder"
|
||||
FileUtils.mkdir_p custom_start_point
|
||||
custom_start_point.tr!("_", "-")
|
||||
|
||||
use_ui @ui do
|
||||
assert_raise Gem::MockGemUi::TermError do
|
||||
@command_manager.process_args %W[-C #{custom_start_point} install net-scp-4.0.0.gem --local]
|
||||
end
|
||||
end
|
||||
|
||||
assert_match(/#{custom_start_point} isn't a directory./i, @ui.error)
|
||||
end
|
||||
|
||||
def test_process_args_bad_arg
|
||||
use_ui @ui do
|
||||
assert_raise Gem::MockGemUi::TermError do
|
||||
|
|
|
@ -41,6 +41,16 @@ class TestGemCommandsBuildCommand < Gem::TestCase
|
|||
assert_includes Gem.platforms, Gem::Platform.local
|
||||
end
|
||||
|
||||
def test_handle_deprecated_options
|
||||
use_ui @ui do
|
||||
@cmd.handle_options %w[-C ./test/dir]
|
||||
end
|
||||
|
||||
assert_equal "WARNING: The \"-C\" option has been deprecated and will be removed in Rubygems 4.0. " \
|
||||
"-C is a global flag now. Use `gem -C PATH build GEMSPEC_FILE [options]` instead\n",
|
||||
@ui.error
|
||||
end
|
||||
|
||||
def test_options_filename
|
||||
gemspec_file = File.join(@tempdir, @gem.spec_name)
|
||||
|
||||
|
|
|
@ -151,18 +151,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rb-sys"
|
||||
version = "0.9.52"
|
||||
version = "0.9.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02fffdb0162fc4cc1b6509b2d9b32a75f7e7ed392f58bde639e0c33b23e74b97"
|
||||
checksum = "b3277448b8eee18de8bedb18883ae02dcd60d47922ddfc6ab408def77da0a9b4"
|
||||
dependencies = [
|
||||
"rb-sys-build",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rb-sys-build"
|
||||
version = "0.9.52"
|
||||
version = "0.9.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85d1a236755f879fc155d16d9ba4cd3b1975fd52ef6a28113702ae3881b73c03"
|
||||
checksum = "c9baae802c93180af02cccb21819589d109070f8e28e14e7070a9ffdeca9b464"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"regex",
|
||||
|
|
|
@ -7,4 +7,4 @@ edition = "2021"
|
|||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
||||
rb-sys = "0.9.52"
|
||||
rb-sys = "0.9.54"
|
||||
|
|
|
@ -144,18 +144,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rb-sys"
|
||||
version = "0.9.52"
|
||||
version = "0.9.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02fffdb0162fc4cc1b6509b2d9b32a75f7e7ed392f58bde639e0c33b23e74b97"
|
||||
checksum = "b3277448b8eee18de8bedb18883ae02dcd60d47922ddfc6ab408def77da0a9b4"
|
||||
dependencies = [
|
||||
"rb-sys-build",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rb-sys-build"
|
||||
version = "0.9.52"
|
||||
version = "0.9.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85d1a236755f879fc155d16d9ba4cd3b1975fd52ef6a28113702ae3881b73c03"
|
||||
checksum = "c9baae802c93180af02cccb21819589d109070f8e28e14e7070a9ffdeca9b464"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"regex",
|
||||
|
|
|
@ -7,4 +7,4 @@ edition = "2021"
|
|||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
||||
rb-sys = "0.9.52"
|
||||
rb-sys = "0.9.54"
|
||||
|
|
|
@ -1828,7 +1828,7 @@ gem 'other', version
|
|||
|
||||
installer = Gem::Installer.at(
|
||||
gem_with_ill_formated_platform,
|
||||
:install_dir => @gem_home,
|
||||
:install_dir => @gemhome,
|
||||
:user_install => false,
|
||||
:force => true
|
||||
)
|
||||
|
|
|
@ -275,7 +275,7 @@ DEPENDENCIES
|
|||
Gem::Resolver::LockSet === set
|
||||
end
|
||||
|
||||
refute lockfile_set, "fount a LockSet"
|
||||
refute lockfile_set, "found a LockSet"
|
||||
|
||||
git_set = @set.sets.find do |set|
|
||||
Gem::Resolver::GitSet === set
|
||||
|
@ -318,7 +318,7 @@ DEPENDENCIES
|
|||
Gem::Resolver::LockSet === set
|
||||
end
|
||||
|
||||
refute lockfile_set, "fount a LockSet"
|
||||
refute lockfile_set, "found a LockSet"
|
||||
|
||||
git_set = @set.sets.find do |set|
|
||||
Gem::Resolver::GitSet === set
|
||||
|
@ -355,7 +355,7 @@ DEPENDENCIES
|
|||
Gem::Resolver::LockSet === set
|
||||
end
|
||||
|
||||
refute lockfile_set, "fount a LockSet"
|
||||
refute lockfile_set, "found a LockSet"
|
||||
|
||||
git_set = @set.sets.find do |set|
|
||||
Gem::Resolver::GitSet === set
|
||||
|
@ -392,7 +392,7 @@ DEPENDENCIES
|
|||
Gem::Resolver::LockSet === set
|
||||
end
|
||||
|
||||
refute lockfile_set, "fount a LockSet"
|
||||
refute lockfile_set, "found a LockSet"
|
||||
|
||||
git_set = @set.sets.find do |set|
|
||||
Gem::Resolver::GitSet === set
|
||||
|
|
|
@ -680,8 +680,7 @@ class TestGemRequire < Gem::TestCase
|
|||
require "json"
|
||||
RUBY
|
||||
out = Gem::Util.popen({ "GEM_HOME" => @gemhome }, *ruby_with_rubygems_in_load_path, "-e", cmd)
|
||||
puts out
|
||||
assert $?.success?
|
||||
assert_predicate $?, :success?, "Require failed due to #{out}"
|
||||
end
|
||||
|
||||
private
|
||||
|
|
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