Merge RubyGems-3.3.20 and Bundler-2.3.20

This commit is contained in:
Hiroshi SHIBATA 2022-08-22 11:50:00 +09:00 committed by nagachika
parent 44c926f3a9
commit 522b75f1b6
135 changed files with 1131 additions and 613 deletions

View file

@ -218,6 +218,8 @@ module Bundler
"Specify the number of jobs to run in parallel" "Specify the number of jobs to run in parallel"
method_option "local", :type => :boolean, :banner => method_option "local", :type => :boolean, :banner =>
"Do not attempt to fetch gems remotely and use the gem cache instead" "Do not attempt to fetch gems remotely and use the gem cache instead"
method_option "prefer-local", :type => :boolean, :banner =>
"Only attempt to fetch gems remotely if not present locally, even if newer versions are available remotely"
method_option "no-cache", :type => :boolean, :banner => method_option "no-cache", :type => :boolean, :banner =>
"Don't update the existing gem cache." "Don't update the existing gem cache."
method_option "redownload", :type => :boolean, :aliases => "--force", :banner => method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
@ -399,9 +401,9 @@ module Bundler
"Do not attempt to fetch gems remotely and use the gem cache instead" "Do not attempt to fetch gems remotely and use the gem cache instead"
method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems" method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems"
method_option "source", :type => :array, :banner => "Check against a specific source" method_option "source", :type => :array, :banner => "Check against a specific source"
method_option "filter-strict", :type => :boolean, :banner => method_option "filter-strict", :type => :boolean, :aliases => "--strict", :banner =>
"Only list newer versions allowed by your Gemfile requirements" "Only list newer versions allowed by your Gemfile requirements"
method_option "strict", :type => :boolean, :aliases => "--update-strict", :banner => method_option "update-strict", :type => :boolean, :banner =>
"Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor | --major" "Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor | --major"
method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version" method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version"
method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)" method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)"

View file

@ -147,8 +147,11 @@ module Bundler
def normalize_settings def normalize_settings
Bundler.settings.set_command_option :path, nil if options[:system] Bundler.settings.set_command_option :path, nil if options[:system]
Bundler.settings.set_command_option_if_given :path, options[:path] Bundler.settings.set_command_option_if_given :path, options[:path]
if options["standalone"] && Bundler.settings[:path].nil? && !options["local"]
Bundler.settings.temporary(:path_relative_to_cwd => false) do Bundler.settings.temporary(:path_relative_to_cwd => false) do
Bundler.settings.set_command_option :path, "bundle" if options["standalone"] && Bundler.settings[:path].nil? Bundler.settings.set_command_option :path, "bundle"
end
end end
bin_option = options["binstubs"] bin_option = options["binstubs"]

View file

@ -46,7 +46,7 @@ module Bundler
Bundler::CLI::Common.configure_gem_version_promoter( Bundler::CLI::Common.configure_gem_version_promoter(
Bundler.definition, Bundler.definition,
options options.merge(:strict => @strict)
) )
definition_resolution = proc do definition_resolution = proc do
@ -129,6 +129,12 @@ module Bundler
private private
def loaded_from_for(spec)
return unless spec.respond_to?(:loaded_from)
spec.loaded_from
end
def groups_text(group_text, groups) def groups_text(group_text, groups)
"#{group_text}#{groups.split(",").size > 1 ? "s" : ""} \"#{groups}\"" "#{group_text}#{groups.split(",").size > 1 ? "s" : ""} \"#{groups}\""
end end
@ -184,7 +190,10 @@ module Bundler
def print_gem(current_spec, active_spec, dependency, groups) def print_gem(current_spec, active_spec, dependency, groups)
spec_version = "#{active_spec.version}#{active_spec.git_version}" spec_version = "#{active_spec.version}#{active_spec.git_version}"
spec_version += " (from #{active_spec.loaded_from})" if Bundler.ui.debug? && active_spec.loaded_from if Bundler.ui.debug?
loaded_from = loaded_from_for(active_spec)
spec_version += " (from #{loaded_from})" if loaded_from
end
current_version = "#{current_spec.version}#{current_spec.git_version}" current_version = "#{current_spec.version}#{current_spec.git_version}"
if dependency && dependency.specific? if dependency && dependency.specific?
@ -211,7 +220,7 @@ module Bundler
dependency = dependency.requirement if dependency dependency = dependency.requirement if dependency
ret_val = [active_spec.name, current_version, spec_version, dependency.to_s, groups.to_s] ret_val = [active_spec.name, current_version, spec_version, dependency.to_s, groups.to_s]
ret_val << active_spec.loaded_from.to_s if Bundler.ui.debug? ret_val << loaded_from_for(active_spec).to_s if Bundler.ui.debug?
ret_val ret_val
end end

View file

@ -9,7 +9,7 @@ module Bundler
def run def run
platforms, ruby_version = Bundler.ui.silence do platforms, ruby_version = Bundler.ui.silence do
locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version.gsub(/p\d+\Z/, "")
gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string
[Bundler.definition.platforms.map {|p| "* #{p}" }, [Bundler.definition.platforms.map {|p| "* #{p}" },
locked_ruby_version || gemfile_ruby_version] locked_ruby_version || gemfile_ruby_version]

View file

@ -70,6 +70,7 @@ module Bundler
@unlock = unlock @unlock = unlock
@optional_groups = optional_groups @optional_groups = optional_groups
@remote = false @remote = false
@prefer_local = false
@specs = nil @specs = nil
@ruby_version = ruby_version @ruby_version = ruby_version
@gemfiles = gemfiles @gemfiles = gemfiles
@ -170,6 +171,13 @@ module Bundler
resolve resolve
end end
def resolve_prefering_local!
@prefer_local = true
@remote = true
sources.remote!
resolve
end
def resolve_with_cache! def resolve_with_cache!
sources.cached! sources.cached!
resolve resolve
@ -476,6 +484,7 @@ module Bundler
def reresolve def reresolve
last_resolve = converge_locked_specs last_resolve = converge_locked_specs
remove_ruby_from_platforms_if_necessary!(dependencies)
expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true) expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true)
Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms) Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
end end
@ -516,10 +525,8 @@ module Bundler
end end
end end
unless specs["bundler"].any?
bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
specs["bundler"] = bundler specs["bundler"] = bundler
end
specs specs
end end
@ -528,6 +535,19 @@ module Bundler
@remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source? @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
end end
def pin_locally_available_names(source_requirements)
source_requirements.each_with_object({}) do |(name, original_source), new_source_requirements|
local_source = original_source.dup
local_source.local_only!
new_source_requirements[name] = if local_source.specs.search(name).any?
local_source
else
original_source
end
end
end
def current_ruby_platform_locked? def current_ruby_platform_locked?
return false unless generic_local_platform == Gem::Platform::RUBY return false unless generic_local_platform == Gem::Platform::RUBY
return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY) return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)
@ -719,17 +739,25 @@ module Bundler
specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) } specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
end end
@specs_that_changed_sources = []
specs.each do |s| specs.each do |s|
# Replace the locked dependency's source with the equivalent source from the Gemfile
dep = @dependencies.find {|d| s.satisfies?(d) } dep = @dependencies.find {|d| s.satisfies?(d) }
s.source = (dep && dep.source) || sources.get(s.source) || sources.default_source # Replace the locked dependency's source with the equivalent source from the Gemfile
s.source = if dep && dep.source
gemfile_source = dep.source
lockfile_source = s.source
@specs_that_changed_sources << s if gemfile_source != lockfile_source
gemfile_source
else
sources.get_with_fallback(s.source)
end
next if @unlock[:sources].include?(s.source.name) next if @unlock[:sources].include?(s.source.name)
# If the spec is from a path source and it doesn't exist anymore
# then we unlock it.
# Path sources have special logic # Path sources have special logic
if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec) if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec)
new_specs = begin new_specs = begin
@ -765,7 +793,7 @@ module Bundler
def metadata_dependencies def metadata_dependencies
@metadata_dependencies ||= [ @metadata_dependencies ||= [
Dependency.new("Ruby\0", RubyVersion.system.gem_version), Dependency.new("Ruby\0", Gem.ruby_version),
Dependency.new("RubyGems\0", Gem::VERSION), Dependency.new("RubyGems\0", Gem::VERSION),
] ]
end end
@ -792,7 +820,9 @@ module Bundler
# specs will be available later when the resolver knows where to # specs will be available later when the resolver knows where to
# look for that gemspec (or its dependencies) # look for that gemspec (or its dependencies)
source_requirements = if precompute_source_requirements_for_indirect_dependencies? source_requirements = if precompute_source_requirements_for_indirect_dependencies?
{ :default => sources.default_source }.merge(source_map.all_requirements) all_requirements = source_map.all_requirements
all_requirements = pin_locally_available_names(all_requirements) if @prefer_local
{ :default => sources.default_source }.merge(all_requirements)
else else
{ :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements) { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
end end
@ -802,9 +832,18 @@ module Bundler
end end
source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
source_requirements["bundler"] = sources.metadata_source # needs to come last to override source_requirements["bundler"] = sources.metadata_source # needs to come last to override
verify_changed_sources!
source_requirements source_requirements
end end
def verify_changed_sources!
@specs_that_changed_sources.each do |s|
if s.source.specs.search(s.name).empty?
raise GemNotFound, "Could not find gem '#{s.name}' in #{s.source}"
end
end
end
def requested_groups def requested_groups
values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with] values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
values &= Bundler.settings[:only] unless Bundler.settings[:only].empty? values &= Bundler.settings[:only] unless Bundler.settings[:only].empty?
@ -844,6 +883,17 @@ module Bundler
end end
end end
def remove_ruby_from_platforms_if_necessary!(dependencies)
return if Bundler.frozen_bundle? ||
Bundler.local_platform == Gem::Platform::RUBY ||
!platforms.include?(Gem::Platform::RUBY) ||
(@new_platform && platforms.last == Gem::Platform::RUBY) ||
!@originally_locked_specs.incomplete_ruby_specs?(dependencies)
remove_platform(Gem::Platform::RUBY)
add_current_platform
end
def source_map def source_map
@source_map ||= SourceMap.new(sources, dependencies, @locked_specs) @source_map ||= SourceMap.new(sources, dependencies, @locked_specs)
end end

View file

@ -44,6 +44,12 @@ module Bundler
def select_best_platform_match(specs, platform) def select_best_platform_match(specs, platform)
matching = specs.select {|spec| spec.match_platform(platform) } matching = specs.select {|spec| spec.match_platform(platform) }
sort_best_platform_match(matching, platform)
end
module_function :select_best_platform_match
def sort_best_platform_match(matching, platform)
exact = matching.select {|spec| spec.platform == platform } exact = matching.select {|spec| spec.platform == platform }
return exact if exact.any? return exact if exact.any?
@ -52,7 +58,7 @@ module Bundler
sorted_matching.take_while {|spec| same_specificity(platform, spec, exemplary_spec) && same_deps(spec, exemplary_spec) } sorted_matching.take_while {|spec| same_specificity(platform, spec, exemplary_spec) && same_deps(spec, exemplary_spec) }
end end
module_function :select_best_platform_match module_function :sort_best_platform_match
class PlatformMatch class PlatformMatch
def self.specificity_score(spec_platform, user_platform) def self.specificity_score(spec_platform, user_platform)

View file

@ -0,0 +1,12 @@
# frozen_string_literal: true
module Bundler
class IncompleteSpecification
attr_reader :name, :platform
def initialize(name, platform)
@name = name
@platform = platform
end
end
end

View file

@ -268,7 +268,14 @@ module Bundler
return false if @definition.nothing_changed? && !@definition.missing_specs? return false if @definition.nothing_changed? && !@definition.missing_specs?
end end
options["local"] ? @definition.resolve_with_cache! : @definition.resolve_remotely! if options["local"]
@definition.resolve_with_cache!
elsif options["prefer-local"]
@definition.resolve_prefering_local!
else
@definition.resolve_remotely!
end
true true
end end

View file

@ -47,7 +47,7 @@ module Bundler
end end
def bundler_path def bundler_path
Bundler.root.join(Bundler.settings[:path], "bundler") Bundler.root.join(Bundler.settings[:path].to_s, "bundler")
end end
def gem_path(path, spec) def gem_path(path, spec)

View file

@ -76,35 +76,35 @@ module Bundler
end end
def materialize_for_installation def materialize_for_installation
__materialize__(ruby_platform_materializes_to_ruby_platform? ? platform : Bundler.local_platform) source.local!
candidates = if source.is_a?(Source::Path) || !ruby_platform_materializes_to_ruby_platform?
target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : Bundler.local_platform
source.specs.search(Dependency.new(name, version)).select do |spec|
MatchPlatform.platforms_match?(spec.platform, target_platform)
end end
def materialize_for_resolution
return self unless Gem::Platform.match_spec?(self)
__materialize__(platform)
end
def __materialize__(platform)
@specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name
source.gemspec.tap {|s| s.source = source }
else else
search_object = if source.is_a?(Source::Path) source.specs.search(self)
Dependency.new(name, version)
else
ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version)
end end
candidates = source.specs.search(search_object)
same_platform_candidates = candidates.select do |spec| return self if candidates.empty?
MatchPlatform.platforms_match?(spec.platform, platform)
__materialize__(candidates)
end end
installable_candidates = same_platform_candidates.select do |spec|
def __materialize__(candidates)
@specification = begin
search = candidates.reverse.find do |spec|
spec.is_a?(StubSpecification) || spec.is_a?(StubSpecification) ||
(spec.required_ruby_version.satisfied_by?(Gem.ruby_version) && (spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)) spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version))
end end
search = installable_candidates.last || same_platform_candidates.last if search.nil? && Bundler.frozen_bundle?
search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification)) search = candidates.last
else
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
end
search search
end end
end end

View file

@ -9,6 +9,9 @@
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBbundle cache\fR \fBbundle cache\fR
. .
.P
alias: \fBpackage\fR, \fBpack\fR
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\. Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\.
. .
@ -53,3 +56,6 @@ One way to be sure that you have the right platformed versions of all your gems
. .
.P .P
By default, bundle cache(1) \fIbundle\-cache\.1\.html\fR fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle cache \-\-no\-install\fR\. By default, bundle cache(1) \fIbundle\-cache\.1\.html\fR fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle cache \-\-no\-install\fR\.
.
.SH "HISTORY"
In Bundler 2\.1, \fBcache\fR took in the functionalities of \fBpackage\fR and now \fBpackage\fR and \fBpack\fR are aliases of \fBcache\fR\.

View file

@ -5,6 +5,8 @@ bundle-cache(1) -- Package your needed `.gem` files into your application
`bundle cache` `bundle cache`
alias: `package`, `pack`
## DESCRIPTION ## DESCRIPTION
Copy all of the `.gem` files needed to run the application into the Copy all of the `.gem` files needed to run the application into the
@ -70,3 +72,8 @@ By default, [bundle cache(1)](bundle-cache.1.html) fetches and also
installs the gems to the default location. To package the installs the gems to the default location. To package the
dependencies to `vendor/cache` without installing them to the dependencies to `vendor/cache` without installing them to the
local install location, you can run `bundle cache --no-install`. local install location, you can run `bundle cache --no-install`.
## HISTORY
In Bundler 2.1, `cache` took in the functionalities of `package` and now
`package` and `pack` are aliases of `cache`.

View file

@ -51,7 +51,7 @@ Executing \fBbundle config unset <name>\fR will delete the configuration in both
Executing \fBbundle config unset \-\-global <name>\fR will delete the configuration only from the user configuration\. Executing \fBbundle config unset \-\-global <name>\fR will delete the configuration only from the user configuration\.
. .
.P .P
Executing \fBbundle config unset \-\-local <name> <value>\fR will delete the configuration only from the local application\. Executing \fBbundle config unset \-\-local <name>\fR will delete the configuration only from the local application\.
. .
.P .P
Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\. Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\.
@ -298,7 +298,7 @@ The following is a list of all configuration keys and their purpose\. You can le
.IP "" 0 .IP "" 0
. .
.P .P
In general, you should set these settings per\-application by using the applicable flag to the bundle install(1) \fIbundle\-install\.1\.html\fR or bundle package(1) \fIbundle\-package\.1\.html\fR command\. In general, you should set these settings per\-application by using the applicable flag to the bundle install(1) \fIbundle\-install\.1\.html\fR or bundle cache(1) \fIbundle\-cache\.1\.html\fR command\.
. .
.P .P
You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\. You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\.

View file

@ -43,8 +43,8 @@ local and global sources.
Executing `bundle config unset --global <name>` will delete the configuration Executing `bundle config unset --global <name>` will delete the configuration
only from the user configuration. only from the user configuration.
Executing `bundle config unset --local <name> <value>` will delete the Executing `bundle config unset --local <name>` will delete the configuration
configuration only from the local application. only from the local application.
Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will
cause it to ignore all configuration. cause it to ignore all configuration.
@ -280,7 +280,7 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
A `:`-separated list of groups whose gems bundler should not install. A `:`-separated list of groups whose gems bundler should not install.
In general, you should set these settings per-application by using the applicable In general, you should set these settings per-application by using the applicable
flag to the [bundle install(1)](bundle-install.1.html) or [bundle package(1)](bundle-package.1.html) command. flag to the [bundle install(1)](bundle-install.1.html) or [bundle cache(1)](bundle-cache.1.html) command.
You can set them globally either via environment variables or `bundle config`, You can set them globally either via environment variables or `bundle config`,
whichever is preferable for your setup. If you use both, environment variables whichever is preferable for your setup. If you use both, environment variables

View file

@ -70,6 +70,10 @@ The maximum number of parallel download and install jobs\. The default is the nu
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\. Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
. .
.TP .TP
\fB\-\-prefer\-local\fR
Force using locally installed gems, or gems already present in Rubygems\' cache or in \fBvendor/cache\fR, when resolving, even if newer versions are available remotely\. Only attempt to connect to \fBrubygems\.org\fR for gems that are not present locally\.
.
.TP
\fB\-\-no\-cache\fR \fB\-\-no\-cache\fR
Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\. Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\.
. .

View file

@ -109,6 +109,12 @@ automatically and that requires `bundler` to silently remember them. Since
appropriate platform-specific gem exists on `rubygems.org` it will not be appropriate platform-specific gem exists on `rubygems.org` it will not be
found. found.
* `--prefer-local`:
Force using locally installed gems, or gems already present in Rubygems' cache
or in `vendor/cache`, when resolving, even if newer versions are available
remotely. Only attempt to connect to `rubygems.org` for gems that are not
present locally.
* `--no-cache`: * `--no-cache`:
Do not update the cache in `vendor/cache` with the newly bundled gems. This Do not update the cache in `vendor/cache` with the newly bundled gems. This
does not remove any gems in the cache but keeps the newly bundled gems from does not remove any gems in the cache but keeps the newly bundled gems from

View file

@ -10,7 +10,7 @@
\fBbundle platform\fR [\-\-ruby] \fBbundle platform\fR [\-\-ruby]
. .
.SH "DESCRIPTION" .SH "DESCRIPTION"
\fBplatform\fR will display information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\. \fBplatform\fR displays information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\.
. .
.P .P
For instance, using this Gemfile(5): For instance, using this Gemfile(5):
@ -21,7 +21,7 @@ For instance, using this Gemfile(5):
source "https://rubygems\.org" source "https://rubygems\.org"
ruby "1\.9\.3" ruby "3\.1\.2"
gem "rack" gem "rack"
. .
@ -30,7 +30,7 @@ gem "rack"
.IP "" 0 .IP "" 0
. .
.P .P
If you run \fBbundle platform\fR on Ruby 1\.9\.3, it will display the following output: If you run \fBbundle platform\fR on Ruby 3\.1\.2, it displays the following output:
. .
.IP "" 4 .IP "" 4
. .
@ -39,10 +39,13 @@ If you run \fBbundle platform\fR on Ruby 1\.9\.3, it will display the following
Your platform is: x86_64\-linux Your platform is: x86_64\-linux
Your app has gems that work on these platforms: Your app has gems that work on these platforms:
* arm64\-darwin\-21
* ruby * ruby
* x64\-mingw\-ucrt
* x86_64\-linux
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby 1\.9\.3 * ruby 3\.1\.2
Your current platform satisfies the Ruby version requirement\. Your current platform satisfies the Ruby version requirement\.
. .
@ -51,11 +54,18 @@ Your current platform satisfies the Ruby version requirement\.
.IP "" 0 .IP "" 0
. .
.P .P
\fBplatform\fR will list all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It will also let you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it will tell you what part does not\. \fBplatform\fR lists all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It also lets you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it tells you what part does not\.
. .
.SH "OPTIONS" .SH "OPTIONS"
. .
.TP .TP
\fB\-\-ruby\fR \fB\-\-ruby\fR
It will display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\. It will display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
bundle\-lock(1) \fIbundle\-lock\.1\.ronn\fR
.
.IP "" 0

View file

@ -7,36 +7,43 @@ bundle-platform(1) -- Displays platform compatibility information
## DESCRIPTION ## DESCRIPTION
`platform` will display information from your Gemfile, Gemfile.lock, and Ruby `platform` displays information from your Gemfile, Gemfile.lock, and Ruby
VM about your platform. VM about your platform.
For instance, using this Gemfile(5): For instance, using this Gemfile(5):
source "https://rubygems.org" source "https://rubygems.org"
ruby "1.9.3" ruby "3.1.2"
gem "rack" gem "rack"
If you run `bundle platform` on Ruby 1.9.3, it will display the following output: If you run `bundle platform` on Ruby 3.1.2, it displays the following output:
Your platform is: x86_64-linux Your platform is: x86_64-linux
Your app has gems that work on these platforms: Your app has gems that work on these platforms:
* arm64-darwin-21
* ruby * ruby
* x64-mingw-ucrt
* x86_64-linux
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby 1.9.3 * ruby 3.1.2
Your current platform satisfies the Ruby version requirement. Your current platform satisfies the Ruby version requirement.
`platform` will list all the platforms in your `Gemfile.lock` as well as the `platform` lists all the platforms in your `Gemfile.lock` as well as the
`ruby` directive if applicable from your Gemfile(5). It will also let you know `ruby` directive if applicable from your Gemfile(5). It also lets you know
if the `ruby` directive requirement has been met. If `ruby` directive doesn't if the `ruby` directive requirement has been met. If `ruby` directive doesn't
match the running Ruby VM, it will tell you what part does not. match the running Ruby VM, it tells you what part does not.
## OPTIONS ## OPTIONS
* `--ruby`: * `--ruby`:
It will display the ruby directive information, so you don't have to It will display the ruby directive information, so you don't have to
parse it from the Gemfile(5). parse it from the Gemfile(5).
## SEE ALSO
* [bundle-lock(1)](bundle-lock.1.ronn)

View file

@ -43,8 +43,8 @@ Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR
Update dependencies to their latest versions Update dependencies to their latest versions
. .
.TP .TP
\fBbundle package(1)\fR \fIbundle\-package\.1\.html\fR \fBbundle cache(1)\fR \fIbundle\-cache\.1\.html\fR
Package the \.gem files required by your application into the \fBvendor/cache\fR directory Package the \.gem files required by your application into the \fBvendor/cache\fR directory (aliases: \fBbundle package\fR, \fBbundle pack\fR)
. .
.TP .TP
\fBbundle exec(1)\fR \fIbundle\-exec\.1\.html\fR \fBbundle exec(1)\fR \fIbundle\-exec\.1\.html\fR
@ -81,7 +81,7 @@ Show the source location of a particular gem in the bundle
Show all of the outdated gems in the current bundle Show all of the outdated gems in the current bundle
. .
.TP .TP
\fBbundle console(1)\fR \fBbundle console(1)\fR (deprecated)
Start an IRB session in the current bundle Start an IRB session in the current bundle
. .
.TP .TP
@ -127,9 +127,6 @@ When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bund
These commands are obsolete and should no longer be used: These commands are obsolete and should no longer be used:
. .
.IP "\(bu" 4 .IP "\(bu" 4
\fBbundle cache(1)\fR
.
.IP "\(bu" 4
\fBbundle inject(1)\fR \fBbundle inject(1)\fR
. .
.IP "" 0 .IP "" 0

View file

@ -36,9 +36,9 @@ We divide `bundle` subcommands into primary commands and utilities:
* [`bundle update(1)`](bundle-update.1.html): * [`bundle update(1)`](bundle-update.1.html):
Update dependencies to their latest versions Update dependencies to their latest versions
* [`bundle package(1)`](bundle-package.1.html): * [`bundle cache(1)`](bundle-cache.1.html):
Package the .gem files required by your application into the Package the .gem files required by your application into the
`vendor/cache` directory `vendor/cache` directory (aliases: `bundle package`, `bundle pack`)
* [`bundle exec(1)`](bundle-exec.1.html): * [`bundle exec(1)`](bundle-exec.1.html):
Execute a script in the current bundle Execute a script in the current bundle
@ -67,7 +67,7 @@ We divide `bundle` subcommands into primary commands and utilities:
* [`bundle outdated(1)`](bundle-outdated.1.html): * [`bundle outdated(1)`](bundle-outdated.1.html):
Show all of the outdated gems in the current bundle Show all of the outdated gems in the current bundle
* `bundle console(1)`: * `bundle console(1)` (deprecated):
Start an IRB session in the current bundle Start an IRB session in the current bundle
* [`bundle open(1)`](bundle-open.1.html): * [`bundle open(1)`](bundle-open.1.html):
@ -107,5 +107,4 @@ and execute it, passing down any extra arguments to it.
These commands are obsolete and should no longer be used: These commands are obsolete and should no longer be used:
* `bundle cache(1)`
* `bundle inject(1)` * `bundle inject(1)`

View file

@ -28,10 +28,11 @@ module Bundler
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements) def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
@source_requirements = source_requirements @source_requirements = source_requirements
@metadata_requirements = metadata_requirements @metadata_requirements = metadata_requirements
@base = base
@resolver = Molinillo::Resolver.new(self, self) @resolver = Molinillo::Resolver.new(self, self)
@search_for = {} @search_for = {}
@base_dg = Molinillo::DependencyGraph.new @base_dg = Molinillo::DependencyGraph.new
@base = base.materialized_for_resolution do |ls| base.each do |ls|
dep = Dependency.new(ls.name, ls.version) dep = Dependency.new(ls.name, ls.version)
@base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true) @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
end end

View file

@ -32,12 +32,12 @@ module Bundler
@engine = engine && engine.to_s || "ruby" @engine = engine && engine.to_s || "ruby"
@engine_versions = (engine_version && Array(engine_version)) || @versions @engine_versions = (engine_version && Array(engine_version)) || @versions
@engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last @engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last
@patchlevel = patchlevel @patchlevel = patchlevel || (@gem_version.prerelease? ? "-1" : nil)
end end
def to_s(versions = self.versions) def to_s(versions = self.versions)
output = String.new("ruby #{versions_string(versions)}") output = String.new("ruby #{versions_string(versions)}")
output << "p#{patchlevel}" if patchlevel output << "p#{patchlevel}" if patchlevel && patchlevel != "-1"
output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby" output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby"
output output
@ -46,7 +46,7 @@ module Bundler
# @private # @private
PATTERN = / PATTERN = /
ruby\s ruby\s
([\d.]+) # ruby version (\d+\.\d+\.\d+(?:\.\S+)?) # ruby version
(?:p(-?\d+))? # optional patchlevel (?:p(-?\d+))? # optional patchlevel
(?:\s\((\S+)\s(.+)\))? # optional engine info (?:\s\((\S+)\s(.+)\))? # optional engine info
/xo.freeze /xo.freeze
@ -103,8 +103,8 @@ module Bundler
def self.system def self.system
ruby_engine = RUBY_ENGINE.dup ruby_engine = RUBY_ENGINE.dup
ruby_version = RUBY_VERSION.dup ruby_version = Gem.ruby_version.to_s
ruby_engine_version = RUBY_ENGINE_VERSION.dup ruby_engine_version = RUBY_ENGINE == "ruby" ? ruby_version : RUBY_ENGINE_VERSION.dup
patchlevel = RUBY_PATCHLEVEL.to_s patchlevel = RUBY_PATCHLEVEL.to_s
@ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version) @ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version)

View file

@ -17,6 +17,15 @@ require "rubygems/source"
require_relative "match_platform" require_relative "match_platform"
# Cherry-pick fixes to `Gem.ruby_version` to be useful for modern Bundler
# versions and ignore patchlevels
# (https://github.com/rubygems/rubygems/pull/5472,
# https://github.com/rubygems/rubygems/pull/5486). May be removed once RubyGems
# 3.3.12 support is dropped.
unless Gem.ruby_version.to_s == RUBY_VERSION || RUBY_PATCHLEVEL == -1
Gem.instance_variable_set(:@ruby_version, Gem::Version.new(RUBY_VERSION))
end
module Gem module Gem
class Specification class Specification
include ::Bundler::MatchPlatform include ::Bundler::MatchPlatform
@ -146,6 +155,10 @@ module Gem
alias_method :eql?, :== alias_method :eql?, :==
def force_ruby_platform
false
end
def encode_with(coder) def encode_with(coder)
to_yaml_properties.each do |ivar| to_yaml_properties.each do |ivar|
coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar) coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar)

View file

@ -5,7 +5,7 @@ module Bundler
class Metadata < Source class Metadata < Source
def specs def specs
@specs ||= Index.build do |idx| @specs ||= Index.build do |idx|
idx << Gem::Specification.new("Ruby\0", RubyVersion.system.gem_version) idx << Gem::Specification.new("Ruby\0", Gem.ruby_version)
idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s| idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s|
s.required_rubygems_version = Gem::Requirement.default s.required_rubygems_version = Gem::Requirement.default
end end

View file

@ -101,6 +101,10 @@ module Bundler
source_list_for(source).find {|s| equivalent_source?(source, s) } source_list_for(source).find {|s| equivalent_source?(source, s) }
end end
def get_with_fallback(source)
get(source) || default_source
end
def lock_sources def lock_sources
lock_other_sources + lock_rubygems_sources lock_other_sources + lock_rubygems_sources
end end

View file

@ -13,14 +13,16 @@ module Bundler
def for(dependencies, check = false, platforms = [nil]) def for(dependencies, check = false, platforms = [nil])
handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
deps = dependencies.product(platforms).map {|dep, platform| [dep.name, platform && dep.force_ruby_platform ? Gem::Platform::RUBY : platform] } deps = dependencies.product(platforms)
specs = [] specs = []
loop do loop do
break unless dep = deps.shift break unless dep = deps.shift
next if handled.key?(dep)
handled[dep] = true key = [dep[0].name, dep[1]]
next if handled.key?(key)
handled[key] = true
specs_for_dep = specs_for_dependency(*dep) specs_for_dep = specs_for_dependency(*dep)
if specs_for_dep.any? if specs_for_dep.any?
@ -28,17 +30,13 @@ module Bundler
specs_for_dep.first.dependencies.each do |d| specs_for_dep.first.dependencies.each do |d|
next if d.type == :development next if d.type == :development
deps << [d.name, dep[1]] deps << [d, dep[1]]
end end
elsif check elsif check
specs << IncompleteSpecification.new(*dep) specs << IncompleteSpecification.new(*key)
end end
end end
if spec = lookup["bundler"].first
specs << spec
end
specs specs
end end
@ -66,13 +64,8 @@ module Bundler
end end
def materialize(deps) def materialize(deps)
materialized = self.for(deps, true).uniq materialized = self.for(deps, true)
materialized.map! do |s|
next s unless s.is_a?(LazySpecification)
s.source.local!
s.materialize_for_installation || s
end
SpecSet.new(materialized) SpecSet.new(materialized)
end end
@ -82,7 +75,6 @@ module Bundler
def materialized_for_all_platforms def materialized_for_all_platforms
@specs.map do |s| @specs.map do |s|
next s unless s.is_a?(LazySpecification) next s unless s.is_a?(LazySpecification)
s.source.local!
s.source.remote! s.source.remote!
spec = s.materialize_for_installation spec = s.materialize_for_installation
raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
@ -90,13 +82,8 @@ module Bundler
end end
end end
def materialized_for_resolution def incomplete_ruby_specs?(deps)
materialized = @specs.map do |s| self.class.new(self.for(deps, true, [Gem::Platform::RUBY])).incomplete_specs.any?
spec = s.materialize_for_resolution
yield spec if spec
spec
end.compact
SpecSet.new(materialized)
end end
def missing_specs def missing_specs
@ -181,13 +168,13 @@ module Bundler
@specs.sort_by(&:name).each {|s| yield s } @specs.sort_by(&:name).each {|s| yield s }
end end
def specs_for_dependency(name, platform) def specs_for_dependency(dep, platform)
specs_for_name = lookup[name] specs_for_name = lookup[dep.name]
if platform.nil? if platform.nil?
GemHelpers.select_best_platform_match(specs_for_name.select {|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform) matching_specs = specs_for_name.map {|s| s.materialize_for_installation if Gem::Platform.match_spec?(s) }.compact
GemHelpers.sort_best_platform_match(matching_specs, Bundler.local_platform)
else else
specs_for_name_and_platform = GemHelpers.select_best_platform_match(specs_for_name, platform) GemHelpers.select_best_platform_match(specs_for_name, dep.force_ruby_platform ? Gem::Platform::RUBY : platform)
specs_for_name_and_platform.any? ? specs_for_name_and_platform : specs_for_name
end end
end end

View file

@ -1,7 +1,7 @@
# frozen_string_literal: false # frozen_string_literal: false
module Bundler module Bundler
VERSION = "2.3.19".freeze VERSION = "2.3.20".freeze
def self.bundler_major_version def self.bundler_major_version
@bundler_major_version ||= VERSION.split(".").first.to_i @bundler_major_version ||= VERSION.split(".").first.to_i

View file

@ -8,7 +8,7 @@
require "rbconfig" require "rbconfig"
module Gem module Gem
VERSION = "3.3.19".freeze VERSION = "3.3.20".freeze
end end
# Must be first since it unloads the prelude from 1.9.2 # Must be first since it unloads the prelude from 1.9.2
@ -741,8 +741,8 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
def self.prefix def self.prefix
prefix = File.dirname RUBYGEMS_DIR prefix = File.dirname RUBYGEMS_DIR
if prefix != File.expand_path(RbConfig::CONFIG["sitelibdir"]) and if prefix != File.expand_path(RbConfig::CONFIG["sitelibdir"]) &&
prefix != File.expand_path(RbConfig::CONFIG["libdir"]) and prefix != File.expand_path(RbConfig::CONFIG["libdir"]) &&
"lib" == File.basename(RUBYGEMS_DIR) "lib" == File.basename(RUBYGEMS_DIR)
prefix prefix
end end
@ -845,8 +845,8 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
# Returns the latest release version of RubyGems. # Returns the latest release version of RubyGems.
def self.latest_rubygems_version def self.latest_rubygems_version
latest_version_for("rubygems-update") or latest_version_for("rubygems-update") ||
raise "Can't find 'rubygems-update' in any repo. Check `gem source list`." raise("Can't find 'rubygems-update' in any repo. Check `gem source list`.")
end end
## ##
@ -854,7 +854,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
def self.latest_version_for(name) def self.latest_version_for(name)
spec = latest_spec_for name spec = latest_spec_for name
spec and spec.version spec && spec.version
end end
## ##
@ -944,7 +944,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
".rb", ".rb",
*%w[DLEXT DLEXT2].map do |key| *%w[DLEXT DLEXT2].map do |key|
val = RbConfig::CONFIG[key] val = RbConfig::CONFIG[key]
next unless val and not val.empty? next unless val && !val.empty?
".#{val}" ".#{val}"
end, end,
].compact.uniq ].compact.uniq

View file

@ -26,7 +26,7 @@ class Gem::AvailableSet
s = o.set s = o.set
when Array when Array
s = o.map do |sp,so| s = o.map do |sp,so|
if !sp.kind_of?(Gem::Specification) or !so.kind_of?(Gem::Source) if !sp.kind_of?(Gem::Specification) || !so.kind_of?(Gem::Source)
raise TypeError, "Array must be in [[spec, source], ...] form" raise TypeError, "Array must be in [[spec, source], ...] form"
end end
@ -149,8 +149,8 @@ class Gem::AvailableSet
@set.reject! do |t| @set.reject! do |t|
# already locally installed # already locally installed
Gem::Specification.any? do |installed_spec| Gem::Specification.any? do |installed_spec|
dep.name == installed_spec.name and dep.name == installed_spec.name &&
dep.requirement.satisfied_by? installed_spec.version dep.requirement.satisfied_by?(installed_spec.version)
end end
end end

View file

@ -131,7 +131,7 @@ class Gem::BasicSpecification
# default Ruby platform. # default Ruby platform.
def full_name def full_name
if platform == Gem::Platform::RUBY or platform.nil? if platform == Gem::Platform::RUBY || platform.nil?
"#{name}-#{version}".dup.tap(&Gem::UNTAINT) "#{name}-#{version}".dup.tap(&Gem::UNTAINT)
else else
"#{name}-#{version}-#{platform}".dup.tap(&Gem::UNTAINT) "#{name}-#{version}-#{platform}".dup.tap(&Gem::UNTAINT)

View file

@ -159,11 +159,11 @@ class Gem::Command
gem = "'#{gem_name}' (#{version})" gem = "'#{gem_name}' (#{version})"
msg = String.new "Could not find a valid gem #{gem}" msg = String.new "Could not find a valid gem #{gem}"
if errors and !errors.empty? if errors && !errors.empty?
msg << ", here is why:\n" msg << ", here is why:\n"
errors.each {|x| msg << " #{x.wordy}\n" } errors.each {|x| msg << " #{x.wordy}\n" }
else else
if required_by and gem != required_by if required_by && gem != required_by
msg << " (required by #{required_by}) in any repository" msg << " (required by #{required_by}) in any repository"
else else
msg << " in any repository" msg << " in any repository"
@ -186,7 +186,7 @@ class Gem::Command
def get_all_gem_names def get_all_gem_names
args = options[:args] args = options[:args]
if args.nil? or args.empty? if args.nil? || args.empty?
raise Gem::CommandLineError, raise Gem::CommandLineError,
"Please specify at least one gem name (e.g. gem build GEMNAME)" "Please specify at least one gem name (e.g. gem build GEMNAME)"
end end
@ -216,7 +216,7 @@ class Gem::Command
def get_one_gem_name def get_one_gem_name
args = options[:args] args = options[:args]
if args.nil? or args.empty? if args.nil? || args.empty?
raise Gem::CommandLineError, raise Gem::CommandLineError,
"Please specify a gem name on the command line (e.g. gem build GEMNAME)" "Please specify a gem name on the command line (e.g. gem build GEMNAME)"
end end
@ -554,7 +554,7 @@ class Gem::Command
end end
def configure_options(header, option_list) def configure_options(header, option_list)
return if option_list.nil? or option_list.empty? return if option_list.nil? || option_list.empty?
header = header.to_s.empty? ? "" : "#{header} " header = header.to_s.empty? ? "" : "#{header} "
@parser.separator " #{header}Options:" @parser.separator " #{header}Options:"
@ -586,7 +586,7 @@ class Gem::Command
add_common_option("-V", "--[no-]verbose", add_common_option("-V", "--[no-]verbose",
"Set the verbose level of output") do |value, options| "Set the verbose level of output") do |value, options|
# Set us to "really verbose" so the progress meter works # Set us to "really verbose" so the progress meter works
if Gem.configuration.verbose and value if Gem.configuration.verbose && value
Gem.configuration.verbose = 1 Gem.configuration.verbose = 1
else else
Gem.configuration.verbose = value Gem.configuration.verbose = value

View file

@ -149,7 +149,7 @@ If no gems are named all gems in GEM_HOME are cleaned.
@primary_gems = {} @primary_gems = {}
Gem::Specification.each do |spec| Gem::Specification.each do |spec|
if @primary_gems[spec.name].nil? or if @primary_gems[spec.name].nil? ||
@primary_gems[spec.name].version < spec.version @primary_gems[spec.name].version < spec.version
@primary_gems[spec.name] = spec @primary_gems[spec.name] = spec
end end

View file

@ -77,7 +77,7 @@ prefix or only the files that are requireable.
gem_contents name gem_contents name
end end
terminate_interaction 1 unless found or names.length > 1 terminate_interaction 1 unless found || names.length > 1
end end
end end

View file

@ -77,7 +77,7 @@ use with other commands.
name_matches = name_pattern ? name_pattern =~ spec.name : true name_matches = name_pattern ? name_pattern =~ spec.name : true
version_matches = requirement.satisfied_by?(spec.version) version_matches = requirement.satisfied_by?(spec.version)
name_matches and version_matches name_matches && version_matches
}.map(&:to_spec) }.map(&:to_spec)
end end
@ -133,7 +133,7 @@ use with other commands.
end end
def ensure_local_only_reverse_dependencies # :nodoc: def ensure_local_only_reverse_dependencies # :nodoc:
if options[:reverse_dependencies] and remote? and not local? if options[:reverse_dependencies] && remote? && !local?
alert_error "Only reverse dependencies for local gems are supported." alert_error "Only reverse dependencies for local gems are supported."
terminate_interaction 1 terminate_interaction 1
end end
@ -182,7 +182,7 @@ use with other commands.
sp.dependencies.each do |dep| sp.dependencies.each do |dep|
dep = Gem::Dependency.new(*dep) unless Gem::Dependency === dep dep = Gem::Dependency.new(*dep) unless Gem::Dependency === dep
if spec.name == dep.name and if spec.name == dep.name &&
dep.requirement.satisfied_by?(spec.version) dep.requirement.satisfied_by?(spec.version)
result << [sp.full_name, dep] result << [sp.full_name, dep]
end end
@ -197,7 +197,7 @@ use with other commands.
def name_pattern(args) def name_pattern(args)
return if args.empty? return if args.empty?
if args.length == 1 and args.first =~ /\A(.*)(i)?\z/m if args.length == 1 && args.first =~ /\A(.*)(i)?\z/m
flags = $2 ? Regexp::IGNORECASE : nil flags = $2 ? Regexp::IGNORECASE : nil
Regexp.new $1, flags Regexp.new $1, flags
else else

View file

@ -52,7 +52,7 @@ then repackaging it.
end end
def check_version # :nodoc: def check_version # :nodoc:
if options[:version] != Gem::Requirement.default and if options[:version] != Gem::Requirement.default &&
get_all_gem_names.size > 1 get_all_gem_names.size > 1
alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \ alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
" version requirements using `gem fetch 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`" " version requirements using `gem fetch 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"

View file

@ -68,8 +68,8 @@ Marshal::MINOR_VERSION constants. It is used to ensure compatibility.
# This is always true because it's the only way now. # This is always true because it's the only way now.
options[:build_modern] = true options[:build_modern] = true
if not File.exist?(options[:directory]) or if !File.exist?(options[:directory]) ||
not File.directory?(options[:directory]) !File.directory?(options[:directory])
alert_error "unknown directory name #{options[:directory]}." alert_error "unknown directory name #{options[:directory]}."
terminate_interaction 1 terminate_interaction 1
else else

View file

@ -134,14 +134,14 @@ You can use `i` command instead of `install`.
end end
def check_install_dir # :nodoc: def check_install_dir # :nodoc:
if options[:install_dir] and options[:user_install] if options[:install_dir] && options[:user_install]
alert_error "Use --install-dir or --user-install but not both" alert_error "Use --install-dir or --user-install but not both"
terminate_interaction 1 terminate_interaction 1
end end
end end
def check_version # :nodoc: def check_version # :nodoc:
if options[:version] != Gem::Requirement.default and if options[:version] != Gem::Requirement.default &&
get_all_gem_names.size > 1 get_all_gem_names.size > 1
alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \ alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
" version requirements using `gem install 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`" " version requirements using `gem install 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
@ -191,8 +191,8 @@ You can use `i` command instead of `install`.
end end
def install_gem(name, version) # :nodoc: def install_gem(name, version) # :nodoc:
return if options[:conservative] and return if options[:conservative] &&
not Gem::Dependency.new(name, version).matching_specs.empty? !Gem::Dependency.new(name, version).matching_specs.empty?
req = Gem::Requirement.create(version) req = Gem::Requirement.create(version)

View file

@ -102,10 +102,10 @@ extensions will be restored.
# `--extensions` must be explicitly given to pristine only gems # `--extensions` must be explicitly given to pristine only gems
# with extensions. # with extensions.
elsif options[:extensions_set] and elsif options[:extensions_set] &&
options[:extensions] and options[:args].empty? options[:extensions] && options[:args].empty?
Gem::Specification.select do |spec| Gem::Specification.select do |spec|
spec.extensions and not spec.extensions.empty? spec.extensions && !spec.extensions.empty?
end end
else else
get_all_gem_names.sort.map do |gem_name| get_all_gem_names.sort.map do |gem_name|
@ -135,14 +135,14 @@ extensions will be restored.
end end
end end
unless spec.extensions.empty? or options[:extensions] or options[:only_executables] or options[:only_plugins] unless spec.extensions.empty? || options[:extensions] || options[:only_executables] || options[:only_plugins]
say "Skipped #{spec.full_name}, it needs to compile an extension" say "Skipped #{spec.full_name}, it needs to compile an extension"
next next
end end
gem = spec.cache_file gem = spec.cache_file
unless File.exist? gem or options[:only_executables] or options[:only_plugins] unless File.exist?(gem) || options[:only_executables] || options[:only_plugins]
require_relative "../remote_fetcher" require_relative "../remote_fetcher"
say "Cached gem for #{spec.full_name} not found, attempting to fetch..." say "Cached gem for #{spec.full_name} not found, attempting to fetch..."

View file

@ -329,9 +329,9 @@ By default, this RubyGems will install gem as:
# ignore # ignore
end end
if File.writable? gem_doc_dir and if File.writable?(gem_doc_dir) &&
(not File.exist? rubygems_doc_dir or (!File.exist?(rubygems_doc_dir) ||
File.writable? rubygems_doc_dir) File.writable?(rubygems_doc_dir))
say "Removing old RubyGems RDoc and ri" if @verbose say "Removing old RubyGems RDoc and ri" if @verbose
Dir[File.join(Gem.dir, "doc", "rubygems-[0-9]*")].each do |dir| Dir[File.join(Gem.dir, "doc", "rubygems-[0-9]*")].each do |dir|
rm_rf dir rm_rf dir
@ -559,7 +559,7 @@ abort "#{deprecation_message}"
history_string = "" history_string = ""
until versions.length == 0 or until versions.length == 0 ||
versions.shift <= options[:previous_version] do versions.shift <= options[:previous_version] do
history_string += version_lines.shift + text.shift history_string += version_lines.shift + text.shift
end end

View file

@ -82,7 +82,7 @@ Do you want to add this source?
def check_rubygems_https(source_uri) # :nodoc: def check_rubygems_https(source_uri) # :nodoc:
uri = URI source_uri uri = URI source_uri
if uri.scheme and uri.scheme.downcase == "http" and if uri.scheme && uri.scheme.downcase == "http" &&
uri.host.downcase == "rubygems.org" uri.host.downcase == "rubygems.org"
question = <<-QUESTION.chomp question = <<-QUESTION.chomp
https://rubygems.org is recommended for security over #{uri} https://rubygems.org is recommended for security over #{uri}
@ -215,9 +215,9 @@ To remove a source use the --remove argument:
def remove_cache_file(desc, path) # :nodoc: def remove_cache_file(desc, path) # :nodoc:
FileUtils.rm_rf path FileUtils.rm_rf path
if not File.exist?(path) if !File.exist?(path)
say "*** Removed #{desc} source cache ***" say "*** Removed #{desc} source cache ***"
elsif not File.writable?(path) elsif !File.writable?(path)
say "*** Unable to remove #{desc} source cache (write protected) ***" say "*** Unable to remove #{desc} source cache (write protected) ***"
else else
say "*** Unable to remove #{desc} source cache ***" say "*** Unable to remove #{desc} source cache ***"

View file

@ -88,7 +88,7 @@ Specific fields in the specification can be extracted in YAML format:
raise Gem::CommandLineError, "Unsupported version type: '#{v}'" raise Gem::CommandLineError, "Unsupported version type: '#{v}'"
end end
if !req.none? and options[:all] if !req.none? && options[:all]
alert_error "Specify --all or -v, not both" alert_error "Specify --all or -v, not both"
terminate_interaction 1 terminate_interaction 1
end end
@ -102,7 +102,7 @@ Specific fields in the specification can be extracted in YAML format:
field = get_one_optional_argument field = get_one_optional_argument
raise Gem::CommandLineError, "--ruby and FIELD are mutually exclusive" if raise Gem::CommandLineError, "--ruby and FIELD are mutually exclusive" if
field and options[:format] == :ruby field && options[:format] == :ruby
if local? if local?
if File.exist? gem if File.exist? gem

View file

@ -114,7 +114,7 @@ that is a dependency of an existing gem. You can use the
end end
def check_version # :nodoc: def check_version # :nodoc:
if options[:version] != Gem::Requirement.default and if options[:version] != Gem::Requirement.default &&
get_all_gem_names.size > 1 get_all_gem_names.size > 1
alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \ alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
" version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`" " version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
@ -125,7 +125,7 @@ that is a dependency of an existing gem. You can use the
def execute def execute
check_version check_version
if options[:all] and not options[:args].empty? if options[:all] && !options[:args].empty?
uninstall_specific uninstall_specific
elsif options[:all] elsif options[:all]
uninstall_all uninstall_all

View file

@ -155,7 +155,7 @@ command to remove old versions.
Gem::Specification.dirs = Gem.user_dir if options[:user_install] Gem::Specification.dirs = Gem.user_dir if options[:user_install]
Gem::Specification.each do |spec| Gem::Specification.each do |spec|
if hig[spec.name].nil? or hig[spec.name].version < spec.version if hig[spec.name].nil? || hig[spec.name].version < spec.version
hig[spec.name] = spec hig[spec.name] = spec
end end
end end
@ -292,7 +292,7 @@ command to remove old versions.
args << "--no-document" unless options[:document].include?("rdoc") || options[:document].include?("ri") args << "--no-document" unless options[:document].include?("rdoc") || options[:document].include?("ri")
args << "--no-format-executable" if options[:no_format_executable] args << "--no-format-executable" if options[:no_format_executable]
args << "--previous-version" << Gem::VERSION if args << "--previous-version" << Gem::VERSION if
options[:system] == true or options[:system] == true ||
Gem::Version.new(options[:system]) >= Gem::Version.new(2) Gem::Version.new(options[:system]) >= Gem::Version.new(2)
args args
end end
@ -301,7 +301,7 @@ command to remove old versions.
result = [] result = []
highest_installed_gems.each do |l_name, l_spec| highest_installed_gems.each do |l_name, l_spec|
next if not gem_names.empty? and next if !gem_names.empty? &&
gem_names.none? {|name| name == l_spec.name } gem_names.none? {|name| name == l_spec.name }
highest_remote_tup = highest_remote_name_tuple l_spec highest_remote_tup = highest_remote_name_tuple l_spec

View file

@ -71,7 +71,7 @@ requiring to see why it does not behave as you expect.
dirs.each do |dir| dirs.each do |dir|
Gem.suffixes.each do |ext| Gem.suffixes.each do |ext|
full_path = File.join dir, "#{package_name}#{ext}" full_path = File.join dir, "#{package_name}#{ext}"
if File.exist? full_path and not File.directory? full_path if File.exist?(full_path) && !File.directory?(full_path)
result << full_path result << full_path
return result unless options[:show_all] return result unless options[:show_all]
end end

View file

@ -39,7 +39,7 @@ require "rbconfig"
class Gem::ConfigFile class Gem::ConfigFile
include Gem::UserInteraction include Gem::UserInteraction
DEFAULT_BACKTRACE = false DEFAULT_BACKTRACE = true
DEFAULT_BULK_THRESHOLD = 1000 DEFAULT_BULK_THRESHOLD = 1000
DEFAULT_VERBOSITY = true DEFAULT_VERBOSITY = true
DEFAULT_UPDATE_SOURCES = true DEFAULT_UPDATE_SOURCES = true
@ -368,7 +368,7 @@ if you believe they were disclosed to a third party.
# True if the backtrace option has been specified, or debug is on. # True if the backtrace option has been specified, or debug is on.
def backtrace def backtrace
@backtrace or $DEBUG @backtrace || $DEBUG
end end
# The name of the configuration file. # The name of the configuration file.
@ -477,11 +477,11 @@ if you believe they were disclosed to a third party.
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@backtrace == other.backtrace and @backtrace == other.backtrace &&
@bulk_threshold == other.bulk_threshold and @bulk_threshold == other.bulk_threshold &&
@verbose == other.verbose and @verbose == other.verbose &&
@update_sources == other.update_sources and @update_sources == other.update_sources &&
@hash == other.hash @hash == other.hash
end end

View file

@ -39,7 +39,7 @@ if RUBY_VERSION >= "2.5" && !Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES
start += 1 start += 1
if path = loc.path if path = loc.path
unless path.start_with?(rubygems_path) or path.start_with?("<internal:") unless path.start_with?(rubygems_path) || path.start_with?("<internal:")
# Non-rubygems frames # Non-rubygems frames
uplevel -= 1 uplevel -= 1
end end

View file

@ -161,7 +161,7 @@ module Gem
path = [] path = []
path << user_dir if user_home && File.exist?(user_home) path << user_dir if user_home && File.exist?(user_home)
path << default_dir path << default_dir
path << vendor_dir if vendor_dir and File.directory? vendor_dir path << vendor_dir if vendor_dir && File.directory?(vendor_dir)
path path
end end

View file

@ -115,7 +115,7 @@ class Gem::Dependency
# What does this dependency require? # What does this dependency require?
def requirement def requirement
return @requirement if defined?(@requirement) and @requirement return @requirement if defined?(@requirement) && @requirement
# @version_requirements and @version_requirement are legacy ivar # @version_requirements and @version_requirement are legacy ivar
# names, and supported here because older gems need to keep # names, and supported here because older gems need to keep
@ -230,10 +230,10 @@ class Gem::Dependency
version = Gem::Version.new version version = Gem::Version.new version
return true if requirement.none? and not version.prerelease? return true if requirement.none? && !version.prerelease?
return false if version.prerelease? and return false if version.prerelease? &&
not allow_prerelease and !allow_prerelease &&
not prerelease? !prerelease?
requirement.satisfied_by? version requirement.satisfied_by? version
end end

View file

@ -109,7 +109,7 @@ class Gem::DependencyInstaller
# gems should be considered. # gems should be considered.
def consider_local? def consider_local?
@domain == :both or @domain == :local @domain == :both || @domain == :local
end end
## ##
@ -117,7 +117,7 @@ class Gem::DependencyInstaller
# gems should be considered. # gems should be considered.
def consider_remote? def consider_remote?
@domain == :both or @domain == :remote @domain == :both || @domain == :remote
end end
## ##
@ -197,7 +197,7 @@ class Gem::DependencyInstaller
def in_background(what) # :nodoc: def in_background(what) # :nodoc:
fork_happened = false fork_happened = false
if @build_docs_in_background and Process.respond_to?(:fork) if @build_docs_in_background && Process.respond_to?(:fork)
begin begin
Process.fork do Process.fork do
yield yield
@ -268,7 +268,7 @@ class Gem::DependencyInstaller
end end
def install_development_deps # :nodoc: def install_development_deps # :nodoc:
if @development and @dev_shallow if @development && @dev_shallow
:shallow :shallow
elsif @development elsif @development
:all :all
@ -289,7 +289,7 @@ class Gem::DependencyInstaller
installer_set.force = @force installer_set.force = @force
if consider_local? if consider_local?
if dep_or_name =~ /\.gem$/ and File.file? dep_or_name if dep_or_name =~ /\.gem$/ && File.file?(dep_or_name)
src = Gem::Source::SpecificFile.new dep_or_name src = Gem::Source::SpecificFile.new dep_or_name
installer_set.add_local dep_or_name, src.spec, src installer_set.add_local dep_or_name, src.spec, src
version = src.spec.version if version == Gem::Requirement.default version = src.spec.version if version == Gem::Requirement.default

View file

@ -119,11 +119,11 @@ class Gem::DependencyList
each do |spec| each do |spec|
spec.runtime_dependencies.each do |dep| spec.runtime_dependencies.each do |dep|
inst = Gem::Specification.any? do |installed_spec| inst = Gem::Specification.any? do |installed_spec|
dep.name == installed_spec.name and dep.name == installed_spec.name &&
dep.requirement.satisfied_by? installed_spec.version dep.requirement.satisfied_by?(installed_spec.version)
end end
unless inst or @specs.find {|s| s.satisfies_requirement? dep } unless inst || @specs.find {|s| s.satisfies_requirement? dep }
unsatisfied[spec.name] << dep unsatisfied[spec.name] << dep
return unsatisfied if quick return unsatisfied if quick
end end
@ -175,7 +175,7 @@ class Gem::DependencyList
def remove_specs_unsatisfied_by(dependencies) def remove_specs_unsatisfied_by(dependencies)
specs.reject! do |spec| specs.reject! do |spec|
dep = dependencies[spec.name] dep = dependencies[spec.name]
dep and not dep.requirement.satisfied_by? spec.version dep && !dep.requirement.satisfied_by?(spec.version)
end end
end end

View file

@ -59,7 +59,7 @@ class Gem::Doctor
# Are we doctoring a gem repository? # Are we doctoring a gem repository?
def gem_repository? def gem_repository?
not installed_specs.empty? !installed_specs.empty?
end end
## ##
@ -111,8 +111,8 @@ class Gem::Doctor
basename = File.basename(child, extension) basename = File.basename(child, extension)
next if installed_specs.include? basename next if installed_specs.include? basename
next if /^rubygems-\d/ =~ basename next if /^rubygems-\d/ =~ basename
next if "specifications" == sub_directory and "default" == basename next if "specifications" == sub_directory && "default" == basename
next if "plugins" == sub_directory and Gem.plugin_suffix_regexp =~ basename next if "plugins" == sub_directory && Gem.plugin_suffix_regexp =~ (basename)
type = File.directory?(child) ? "directory" : "file" type = File.directory?(child) ? "directory" : "file"

View file

@ -254,7 +254,7 @@ class Gem::UnsatisfiableDependencyError < Gem::DependencyError
# Gem::Resolver::DependencyRequest +dep+ # Gem::Resolver::DependencyRequest +dep+
def initialize(dep, platform_mismatch=nil) def initialize(dep, platform_mismatch=nil)
if platform_mismatch and !platform_mismatch.empty? if platform_mismatch && !platform_mismatch.empty?
plats = platform_mismatch.map {|x| x.platform.to_s }.sort.uniq plats = platform_mismatch.map {|x| x.platform.to_s }.sort.uniq
super "Unable to resolve dependency: No match for '#{dep}' on this platform. Found: #{plats.join(', ')}" super "Unable to resolve dependency: No match for '#{dep}' on this platform. Found: #{plats.join(', ')}"
else else

View file

@ -44,7 +44,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
full_tmp_dest = File.join(extension_dir, tmp_dest_relative) full_tmp_dest = File.join(extension_dir, tmp_dest_relative)
# TODO remove in RubyGems 4 # TODO remove in RubyGems 4
if Gem.install_extension_in_lib and lib_dir if Gem.install_extension_in_lib && lib_dir
FileUtils.mkdir_p lib_dir FileUtils.mkdir_p lib_dir
entries = Dir.entries(full_tmp_dest) - %w[. ..] entries = Dir.entries(full_tmp_dest) - %w[. ..]
entries = entries.map {|entry| File.join full_tmp_dest, entry } entries = entries.map {|entry| File.join full_tmp_dest, entry }
@ -53,7 +53,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
FileUtils::Entry_.new(full_tmp_dest).traverse do |ent| FileUtils::Entry_.new(full_tmp_dest).traverse do |ent|
destent = ent.class.new(dest_path, ent.rel) destent = ent.class.new(dest_path, ent.rel)
destent.exist? or FileUtils.mv(ent.path, destent.path) destent.exist? || FileUtils.mv(ent.path, destent.path)
end end
ensure ensure
ENV["DESTDIR"] = destdir ENV["DESTDIR"] = destdir

View file

@ -71,7 +71,7 @@ module Gem::GemcutterUtilities
begin begin
env_rubygems_host = ENV["RUBYGEMS_HOST"] env_rubygems_host = ENV["RUBYGEMS_HOST"]
env_rubygems_host = nil if env_rubygems_host = nil if
env_rubygems_host and env_rubygems_host.empty? env_rubygems_host && env_rubygems_host.empty?
env_rubygems_host || configured_host env_rubygems_host || configured_host
end end

View file

@ -149,7 +149,7 @@ class Gem::Indexer
next next
end end
platform = Gem::Platform::RUBY if platform.nil? or platform.empty? platform = Gem::Platform::RUBY if platform.nil? || platform.empty?
[spec.name, spec.version, platform] [spec.name, spec.version, platform]
end end
@ -296,7 +296,7 @@ class Gem::Indexer
files = @files files = @files
files.delete @quick_marshal_dir if files.include? @quick_dir files.delete @quick_marshal_dir if files.include? @quick_dir
if files.include? @quick_marshal_dir and not files.include? @quick_dir if files.include?(@quick_marshal_dir) && !files.include?(@quick_dir)
files.delete @quick_marshal_dir files.delete @quick_marshal_dir
dst_name = File.join(@dest_directory, @quick_marshal_dir_base) dst_name = File.join(@dest_directory, @quick_marshal_dir_base)
@ -414,7 +414,7 @@ class Gem::Indexer
index.each do |spec| index.each do |spec|
platform = spec.original_platform platform = spec.original_platform
platform = Gem::Platform::RUBY if platform.nil? or platform.empty? platform = Gem::Platform::RUBY if platform.nil? || platform.empty?
specs_index << [spec.name, spec.version, platform] specs_index << [spec.name, spec.version, platform]
end end

View file

@ -251,7 +251,7 @@ class Gem::Installer
return if spec.name == existing return if spec.name == existing
# somebody has written to RubyGems' directory, overwrite, too bad # somebody has written to RubyGems' directory, overwrite, too bad
return if Gem.default_bindir != @bin_dir and not ruby_executable return if Gem.default_bindir != @bin_dir && !ruby_executable
question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup
@ -418,10 +418,10 @@ class Gem::Installer
# True if the gems in the system satisfy +dependency+. # True if the gems in the system satisfy +dependency+.
def installation_satisfies_dependency?(dependency) def installation_satisfies_dependency?(dependency)
return true if @options[:development] and dependency.type == :development return true if @options[:development] && dependency.type == :development
return true if installed_specs.detect {|s| dependency.matches_spec? s } return true if installed_specs.detect {|s| dependency.matches_spec? s }
return false if @only_install_dir return false if @only_install_dir
not dependency.matching_specs.empty? !dependency.matching_specs.empty?
end end
## ##
@ -483,22 +483,14 @@ class Gem::Installer
end end
def generate_bin # :nodoc: def generate_bin # :nodoc:
return if spec.executables.nil? or spec.executables.empty? return if spec.executables.nil? || spec.executables.empty?
ensure_writable_dir @bin_dir ensure_writable_dir @bin_dir
spec.executables.each do |filename| spec.executables.each do |filename|
filename.tap(&Gem::UNTAINT) filename.tap(&Gem::UNTAINT)
bin_path = File.join gem_dir, spec.bindir, filename bin_path = File.join gem_dir, spec.bindir, filename
next unless File.exist? bin_path
unless File.exist? bin_path
if File.symlink? bin_path
alert_warning "`#{bin_path}` is dangling symlink pointing to `#{File.readlink bin_path}`"
else
alert_warning "`#{bin_path}` does not exist, maybe `gem pristine #{spec.name}` will fix it?"
end
next
end
mode = File.stat(bin_path).mode mode = File.stat(bin_path).mode
dir_mode = options[:prog_mode] || (mode | 0111) dir_mode = options[:prog_mode] || (mode | 0111)

View file

@ -10,7 +10,7 @@ class Gem::NameTuple
@version = version @version = version
unless platform.kind_of? Gem::Platform unless platform.kind_of? Gem::Platform
platform = "ruby" if !platform or platform.empty? platform = "ruby" if !platform || platform.empty?
end end
@platform = platform @platform = platform
@ -102,8 +102,8 @@ class Gem::NameTuple
def ==(other) def ==(other)
case other case other
when self.class when self.class
@name == other.name and @name == other.name &&
@version == other.version and @version == other.version &&
@platform == other.platform @platform == other.platform
when Array when Array
to_a == other to_a == other

View file

@ -409,18 +409,23 @@ EOM
def extract_tar_gz(io, destination_dir, pattern = "*") # :nodoc: def extract_tar_gz(io, destination_dir, pattern = "*") # :nodoc:
directories = [] directories = []
symlinks = []
open_tar_gz io do |tar| open_tar_gz io do |tar|
tar.each do |entry| tar.each do |entry|
next unless File.fnmatch pattern, entry.full_name, File::FNM_DOTMATCH full_name = entry.full_name
next unless File.fnmatch pattern, full_name, File::FNM_DOTMATCH
destination = install_location entry.full_name, destination_dir destination = install_location full_name, destination_dir
if entry.symlink? if entry.symlink?
link_target = entry.header.linkname link_target = entry.header.linkname
real_destination = link_target.start_with?("/") ? link_target : File.expand_path(link_target, File.dirname(destination)) real_destination = link_target.start_with?("/") ? link_target : File.expand_path(link_target, File.dirname(destination))
raise Gem::Package::SymlinkError.new(entry.full_name, real_destination, destination_dir) unless raise Gem::Package::SymlinkError.new(full_name, real_destination, destination_dir) unless
normalize_path(real_destination).start_with? normalize_path(destination_dir + "/") normalize_path(real_destination).start_with? normalize_path(destination_dir + "/")
symlinks << [full_name, link_target, destination, real_destination]
end end
FileUtils.rm_rf destination FileUtils.rm_rf destination
@ -444,12 +449,18 @@ EOM
FileUtils.chmod file_mode(entry.header.mode), destination FileUtils.chmod file_mode(entry.header.mode), destination
end if entry.file? end if entry.file?
File.symlink(entry.header.linkname, destination) if entry.symlink?
verbose destination verbose destination
end end
end end
symlinks.each do |name, target, destination, real_destination|
if File.exist?(real_destination)
File.symlink(target, destination)
else
alert_warning "#{@spec.full_name} ships with a dangling symlink named #{name} pointing to missing #{target} file. Ignoring"
end
end
if dir_mode if dir_mode
File.chmod(dir_mode, *directories) File.chmod(dir_mode, *directories)
end end
@ -676,7 +687,7 @@ EOM
"package content (data.tar.gz) is missing", @gem "package content (data.tar.gz) is missing", @gem
end end
if duplicates = @files.group_by {|f| f }.select {|k,v| v.size > 1 }.map(&:first) and duplicates.any? if (duplicates = @files.group_by {|f| f }.select {|k,v| v.size > 1 }.map(&:first)) && duplicates.any?
raise Gem::Security::Exception, "duplicate files in the package: (#{duplicates.map(&:inspect).join(', ')})" raise Gem::Security::Exception, "duplicate files in the package: (#{duplicates.map(&:inspect).join(', ')})"
end end
end end

View file

@ -173,22 +173,22 @@ class Gem::Package::TarHeader
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@checksum == other.checksum and @checksum == other.checksum &&
@devmajor == other.devmajor and @devmajor == other.devmajor &&
@devminor == other.devminor and @devminor == other.devminor &&
@gid == other.gid and @gid == other.gid &&
@gname == other.gname and @gname == other.gname &&
@linkname == other.linkname and @linkname == other.linkname &&
@magic == other.magic and @magic == other.magic &&
@mode == other.mode and @mode == other.mode &&
@mtime == other.mtime and @mtime == other.mtime &&
@name == other.name and @name == other.name &&
@prefix == other.prefix and @prefix == other.prefix &&
@size == other.size and @size == other.size &&
@typeflag == other.typeflag and @typeflag == other.typeflag &&
@uid == other.uid and @uid == other.uid &&
@uname == other.uname and @uname == other.uname &&
@version == other.version @version == other.version
end end

View file

@ -314,7 +314,7 @@ class Gem::Package::TarWriter
prefix = parts.join("/") prefix = parts.join("/")
end end
if name.bytesize > 100 or prefix.empty? if name.bytesize > 100 || prefix.empty?
raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)") raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)")
end end

View file

@ -23,9 +23,9 @@ class Gem::Platform
def self.match_platforms?(platform, platforms) def self.match_platforms?(platform, platforms)
platforms.any? do |local_platform| platforms.any? do |local_platform|
platform.nil? or platform.nil? ||
local_platform == platform or local_platform == platform ||
(local_platform != Gem::Platform::RUBY and local_platform =~ platform) (local_platform != Gem::Platform::RUBY && local_platform =~ platform)
end end
end end
private_class_method :match_platforms? private_class_method :match_platforms?
@ -70,7 +70,7 @@ class Gem::Platform
when String then when String then
arch = arch.split "-" arch = arch.split "-"
if arch.length > 2 and arch.last !~ /\d/ # reassemble x86-linux-gnu if arch.length > 2 && arch.last !~ (/\d/) # reassemble x86-linux-gnu
extra = arch.pop extra = arch.pop
arch.last << "-#{extra}" arch.last << "-#{extra}"
end end
@ -82,7 +82,7 @@ class Gem::Platform
else cpu else cpu
end end
if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/ # for command-line if arch.length == 2 && arch.last =~ /^\d+(\.\d+)?$/ # for command-line
@os, @version = arch @os, @version = arch
return return
end end
@ -107,7 +107,7 @@ class Gem::Platform
when /mingw-?(\w+)?/ then [ "mingw", $1 ] when /mingw-?(\w+)?/ then [ "mingw", $1 ]
when /(mswin\d+)(\_(\d+))?/ then when /(mswin\d+)(\_(\d+))?/ then
os, version = $1, $3 os, version = $1, $3
@cpu = "x86" if @cpu.nil? and os =~ /32$/ @cpu = "x86" if @cpu.nil? && os =~ /32$/
[os, version] [os, version]
when /netbsdelf/ then [ "netbsdelf", nil ] when /netbsdelf/ then [ "netbsdelf", nil ]
when /openbsd(\d+\.\d+)?/ then [ "openbsd", $1 ] when /openbsd(\d+\.\d+)?/ then [ "openbsd", $1 ]
@ -139,7 +139,7 @@ class Gem::Platform
# the same CPU, OS and version. # the same CPU, OS and version.
def ==(other) def ==(other)
self.class === other and to_a == other.to_a self.class === other && to_a == other.to_a
end end
alias :eql? :== alias :eql? :==
@ -160,18 +160,18 @@ class Gem::Platform
return nil unless Gem::Platform === other return nil unless Gem::Platform === other
# universal-mingw32 matches x64-mingw-ucrt # universal-mingw32 matches x64-mingw-ucrt
return true if (@cpu == "universal" or other.cpu == "universal") and return true if (@cpu == "universal" || other.cpu == "universal") &&
@os.start_with?("mingw") and other.os.start_with?("mingw") @os.start_with?("mingw") && other.os.start_with?("mingw")
# cpu # cpu
([nil,"universal"].include?(@cpu) or [nil, "universal"].include?(other.cpu) or @cpu == other.cpu or ([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
(@cpu == "arm" and other.cpu.start_with?("arm"))) and (@cpu == "arm" && other.cpu.start_with?("arm"))) &&
# os # os
@os == other.os and @os == other.os &&
# version # version
(@version.nil? or other.version.nil? or @version == other.version) (@version.nil? || other.version.nil? || @version == other.version)
end end
## ##

View file

@ -112,7 +112,7 @@ module Gem::QueryUtils
end end
def display_header(type) def display_header(type)
if (ui.outs.tty? and Gem.configuration.verbose) or both? if (ui.outs.tty? && Gem.configuration.verbose) || both?
say say
say "*** #{type} GEMS ***" say "*** #{type} GEMS ***"
say say
@ -132,7 +132,7 @@ module Gem::QueryUtils
name_matches = name ? s.name =~ name : true name_matches = name ? s.name =~ name : true
version_matches = show_prereleases? || !s.version.prerelease? version_matches = show_prereleases? || !s.version.prerelease?
name_matches and version_matches name_matches && version_matches
end end
spec_tuples = specs.map do |spec| spec_tuples = specs.map do |spec|
@ -176,7 +176,7 @@ module Gem::QueryUtils
# Check if gem +name+ version +version+ is installed. # Check if gem +name+ version +version+ is installed.
def installed?(name, req = Gem::Requirement.default) def installed?(name, req = Gem::Requirement.default)
Gem::Specification.any? {|s| s.name =~ name and req =~ s.version } Gem::Specification.any? {|s| s.name =~ name && req =~ s.version }
end end
def output_query_results(spec_tuples) def output_query_results(spec_tuples)
@ -242,7 +242,7 @@ module Gem::QueryUtils
return unless options[:versions] return unless options[:versions]
list = list =
if platforms.empty? or options[:details] if platforms.empty? || options[:details]
name_tuples.map {|n| n.version }.uniq name_tuples.map {|n| n.version }.uniq
else else
platforms.sort.reverse.map do |version, pls| platforms.sort.reverse.map do |version, pls|
@ -289,13 +289,13 @@ module Gem::QueryUtils
end end
def spec_homepage(entry, spec) def spec_homepage(entry, spec)
return if spec.homepage.nil? or spec.homepage.empty? return if spec.homepage.nil? || spec.homepage.empty?
entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4) entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4)
end end
def spec_license(entry, spec) def spec_license(entry, spec)
return if spec.license.nil? or spec.license.empty? return if spec.license.nil? || spec.license.empty?
licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: ".dup licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: ".dup
licenses << spec.licenses.join(", ") licenses << spec.licenses.join(", ")

View file

@ -114,7 +114,7 @@ class Gem::RemoteFetcher
cache_dir = cache_dir =
if Dir.pwd == install_dir # see fetch_command if Dir.pwd == install_dir # see fetch_command
install_dir install_dir
elsif File.writable?(install_cache_dir) || (File.writable?(install_dir) && (not File.exist?(install_cache_dir))) elsif File.writable?(install_cache_dir) || (File.writable?(install_dir) && (!File.exist?(install_cache_dir)))
install_cache_dir install_cache_dir
else else
File.join Gem.user_dir, "cache" File.join Gem.user_dir, "cache"
@ -247,7 +247,7 @@ class Gem::RemoteFetcher
data = send "fetch_#{uri.scheme}", uri, mtime, head data = send "fetch_#{uri.scheme}", uri, mtime, head
if data and !head and uri.to_s.end_with?(".gz") if data && !head && uri.to_s.end_with?(".gz")
begin begin
data = Gem::Util.gunzip data data = Gem::Util.gunzip data
rescue Zlib::GzipFile::Error rescue Zlib::GzipFile::Error
@ -288,7 +288,7 @@ class Gem::RemoteFetcher
return Gem.read_binary(path) return Gem.read_binary(path)
end end
if update and path if update && path
Gem.write_binary(path, data) Gem.write_binary(path, data)
end end

View file

@ -173,7 +173,7 @@ class Gem::Request
require "uri" require "uri"
uri = URI(Gem::UriFormatter.new(env_proxy).normalize) uri = URI(Gem::UriFormatter.new(env_proxy).normalize)
if uri and uri.user.nil? and uri.password.nil? if uri && uri.user.nil? && uri.password.nil?
user = ENV["#{_scheme}_proxy_user"] || ENV["#{_SCHEME}_PROXY_USER"] user = ENV["#{_scheme}_proxy_user"] || ENV["#{_SCHEME}_PROXY_USER"]
password = ENV["#{_scheme}_proxy_pass"] || ENV["#{_SCHEME}_PROXY_PASS"] password = ENV["#{_scheme}_proxy_pass"] || ENV["#{_SCHEME}_PROXY_PASS"]

View file

@ -39,7 +39,7 @@ class Gem::Request::ConnectionPools # :nodoc:
def get_no_proxy_from_env def get_no_proxy_from_env
env_no_proxy = ENV["no_proxy"] || ENV["NO_PROXY"] env_no_proxy = ENV["no_proxy"] || ENV["NO_PROXY"]
return [] if env_no_proxy.nil? or env_no_proxy.empty? return [] if env_no_proxy.nil? || env_no_proxy.empty?
env_no_proxy.split(/\s*,\s*/) env_no_proxy.split(/\s*,\s*/)
end end
@ -78,7 +78,7 @@ class Gem::Request::ConnectionPools # :nodoc:
no_proxy = get_no_proxy_from_env no_proxy = get_no_proxy_from_env
if proxy_uri and not no_proxy?(hostname, no_proxy) if proxy_uri && !no_proxy?(hostname, no_proxy)
proxy_hostname = proxy_uri.respond_to?(:hostname) ? proxy_uri.hostname : proxy_uri.host proxy_hostname = proxy_uri.respond_to?(:hostname) ? proxy_uri.hostname : proxy_uri.host
net_http_args + [ net_http_args + [
proxy_hostname, proxy_hostname,

View file

@ -26,7 +26,7 @@ class Gem::Request::HTTPPool # :nodoc:
def close_all def close_all
until @queue.empty? until @queue.empty?
if connection = @queue.pop(true) and connection.started? if (connection = @queue.pop(true)) && connection.started?
connection.finish connection.finish
end end
end end

View file

@ -443,14 +443,14 @@ class Gem::RequestSet
def tsort_each_child(node) # :nodoc: def tsort_each_child(node) # :nodoc:
node.spec.dependencies.each do |dep| node.spec.dependencies.each do |dep|
next if dep.type == :development and not @development next if dep.type == :development && !@development
match = @requests.find do |r| match = @requests.find do |r|
dep.match? r.spec.name, r.spec.version, @prerelease dep.match? r.spec.name, r.spec.version, r.spec.is_a?(Gem::Resolver::InstalledSpecification) || @prerelease
end end
unless match unless match
next if dep.type == :development and @development_shallow next if dep.type == :development && @development_shallow
next if @soft_missing next if @soft_missing
raise Gem::DependencyError, raise Gem::DependencyError,
"Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})" "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})"

View file

@ -371,7 +371,7 @@ class Gem::RequestSet::GemDependencyAPI
duplicate = @dependencies.include? name duplicate = @dependencies.include? name
@dependencies[name] = @dependencies[name] =
if requirements.empty? and not source_set if requirements.empty? && !source_set
Gem::Requirement.default Gem::Requirement.default
elsif source_set elsif source_set
Gem::Requirement.source_set Gem::Requirement.source_set
@ -789,7 +789,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta
raise ArgumentError, raise ArgumentError,
"You must specify engine_version along with the Ruby engine" if "You must specify engine_version along with the Ruby engine" if
engine and not engine_version engine && !engine_version
return true if @installing return true if @installing
@ -800,7 +800,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta
raise Gem::RubyVersionMismatch, message raise Gem::RubyVersionMismatch, message
end end
if engine and engine != Gem.ruby_engine if engine && engine != Gem.ruby_engine
message = "Your Ruby engine is #{Gem.ruby_engine}, " + message = "Your Ruby engine is #{Gem.ruby_engine}, " +
"but your #{gem_deps_file} requires #{engine}" "but your #{gem_deps_file} requires #{engine}"

View file

@ -30,7 +30,7 @@ class Gem::RequestSet::Lockfile::Parser
when "PLATFORMS" then when "PLATFORMS" then
parse_PLATFORMS parse_PLATFORMS
else else
token = get until @tokens.empty? or peek.first == :section token = get until @tokens.empty? || peek.first == :section
end end
else else
raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}" raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}"
@ -44,7 +44,7 @@ class Gem::RequestSet::Lockfile::Parser
def get(expected_types = nil, expected_value = nil) # :nodoc: def get(expected_types = nil, expected_value = nil) # :nodoc:
token = @tokens.shift token = @tokens.shift
if expected_types and not Array(expected_types).include? token.type if expected_types && !Array(expected_types).include?(token.type)
unget token unget token
message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
@ -53,7 +53,7 @@ class Gem::RequestSet::Lockfile::Parser
raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename
end end
if expected_value and expected_value != token.value if expected_value && expected_value != token.value
unget token unget token
message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
@ -67,7 +67,7 @@ class Gem::RequestSet::Lockfile::Parser
end end
def parse_DEPENDENCIES # :nodoc: def parse_DEPENDENCIES # :nodoc:
while not @tokens.empty? and :text == peek.type do while !@tokens.empty? && :text == peek.type do
token = get :text token = get :text
requirements = [] requirements = []
@ -127,7 +127,7 @@ class Gem::RequestSet::Lockfile::Parser
set = Gem::Resolver::LockSet.new sources set = Gem::Resolver::LockSet.new sources
last_specs = nil last_specs = nil
while not @tokens.empty? and :text == peek.type do while !@tokens.empty? && :text == peek.type do
token = get :text token = get :text
name = token.value name = token.value
column = token.column column = token.column
@ -144,7 +144,7 @@ class Gem::RequestSet::Lockfile::Parser
type = token.type type = token.type
data = token.value data = token.value
if type == :text and column == 4 if type == :text && column == 4
version, platform = data.split "-", 2 version, platform = data.split "-", 2
platform = platform =
@ -183,7 +183,7 @@ class Gem::RequestSet::Lockfile::Parser
type = peek.type type = peek.type
value = peek.value value = peek.value
if type == :entry and %w[branch ref tag].include? value if type == :entry && %w[branch ref tag].include?(value)
get get
get :text get :text
@ -199,7 +199,7 @@ class Gem::RequestSet::Lockfile::Parser
last_spec = nil last_spec = nil
while not @tokens.empty? and :text == peek.type do while !@tokens.empty? && :text == peek.type do
token = get :text token = get :text
name = token.value name = token.value
column = token.column column = token.column
@ -214,7 +214,7 @@ class Gem::RequestSet::Lockfile::Parser
type = token.type type = token.type
data = token.value data = token.value
if type == :text and column == 4 if type == :text && column == 4
last_spec = set.add_git_spec name, data, repository, revision, true last_spec = set.add_git_spec name, data, repository, revision, true
else else
dependency = parse_dependency name, data dependency = parse_dependency name, data
@ -246,7 +246,7 @@ class Gem::RequestSet::Lockfile::Parser
set = Gem::Resolver::VendorSet.new set = Gem::Resolver::VendorSet.new
last_spec = nil last_spec = nil
while not @tokens.empty? and :text == peek.first do while !@tokens.empty? && :text == peek.first do
token = get :text token = get :text
name = token.value name = token.value
column = token.column column = token.column
@ -261,7 +261,7 @@ class Gem::RequestSet::Lockfile::Parser
type = token.type type = token.type
data = token.value data = token.value
if type == :text and column == 4 if type == :text && column == 4
last_spec = set.add_vendor_gem name, directory last_spec = set.add_vendor_gem name, directory
else else
dependency = parse_dependency name, data dependency = parse_dependency name, data
@ -281,7 +281,7 @@ class Gem::RequestSet::Lockfile::Parser
end end
def parse_PLATFORMS # :nodoc: def parse_PLATFORMS # :nodoc:
while not @tokens.empty? and :text == peek.first do while !@tokens.empty? && :text == peek.first do
name = get(:text).value name = get(:text).value
@platforms << name @platforms << name

View file

@ -1,4 +1,4 @@
# frozen_string_literal: true #) frozen_string_literal: true
require_relative "parser" require_relative "parser"
class Gem::RequestSet::Lockfile::Tokenizer class Gem::RequestSet::Lockfile::Tokenizer
@ -26,7 +26,7 @@ class Gem::RequestSet::Lockfile::Tokenizer
end end
def skip(type) def skip(type)
@tokens.shift while not @tokens.empty? and peek.type == type @tokens.shift while !@tokens.empty? && peek.type == type
end end
## ##

View file

@ -253,7 +253,7 @@ class Gem::Requirement
def specific? def specific?
return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly
not %w[> >=].include? @requirements.first.first # grab the operator !%w[> >=].include? @requirements.first.first # grab the operator
end end
def to_s # :nodoc: def to_s # :nodoc:

View file

@ -153,10 +153,10 @@ class Gem::Resolver
s.fetch_development_dependencies if @development s.fetch_development_dependencies if @development
s.dependencies.reverse_each do |d| s.dependencies.reverse_each do |d|
next if d.type == :development and not @development next if d.type == :development && !@development
next if d.type == :development and @development_shallow and next if d.type == :development && @development_shallow &&
act.development? act.development?
next if d.type == :development and @development_shallow and next if d.type == :development && @development_shallow &&
act.parent act.parent
reqs << Gem::Resolver::DependencyRequest.new(d, act) reqs << Gem::Resolver::DependencyRequest.new(d, act)
@ -192,7 +192,7 @@ class Gem::Resolver
conflict = e.conflicts.values.first conflict = e.conflicts.values.first
raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement) raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement)
ensure ensure
@output.close if defined?(@output) and !debug? @output.close if defined?(@output) && !debug?
end end
## ##

View file

@ -40,10 +40,10 @@ class Gem::Resolver::APISpecification < Gem::Resolver::Specification
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@set == other.set and @set == other.set &&
@name == other.name and @name == other.name &&
@version == other.version and @version == other.version &&
@platform == other.platform @platform == other.platform
end end

View file

@ -25,7 +25,7 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
end end
def find_all(req) # :nodoc: def find_all(req) # :nodoc:
pick_sets if @remote and @sets.empty? pick_sets if @remote && @sets.empty?
super super
rescue Gem::RemoteFetcher::FetchError => e rescue Gem::RemoteFetcher::FetchError => e
@ -35,7 +35,7 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
end end
def prefetch(reqs) # :nodoc: def prefetch(reqs) # :nodoc:
pick_sets if @remote and @sets.empty? pick_sets if @remote && @sets.empty?
super super
end end
@ -63,7 +63,7 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
uri = uri + "." uri = uri + "."
raise error unless api_set = @sets.find do |set| raise error unless api_set = @sets.find do |set|
Gem::Resolver::APISet === set and set.dep_uri == uri Gem::Resolver::APISet === set && set.dep_uri == uri
end end
index_set = Gem::Resolver::IndexSet.new api_set.source index_set = Gem::Resolver::IndexSet.new api_set.source

View file

@ -27,9 +27,9 @@ class Gem::Resolver::Conflict
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@dependency == other.dependency and @dependency == other.dependency &&
@activated == other.activated and @activated == other.activated &&
@failed_dep == other.failed_dep @failed_dep == other.failed_dep
end end

View file

@ -6,9 +6,9 @@
class Gem::Resolver::GitSpecification < Gem::Resolver::SpecSpecification class Gem::Resolver::GitSpecification < Gem::Resolver::SpecSpecification
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@set == other.set and @set == other.set &&
@spec == other.spec and @spec == other.spec &&
@source == other.source @source == other.source
end end

View file

@ -21,7 +21,8 @@ class Gem::Resolver::IndexSpecification < Gem::Resolver::Specification
@name = name @name = name
@version = version @version = version
@source = source @source = source
@platform = platform.to_s @platform = Gem::Platform.new(platform.to_s)
@original_platform = platform.to_s
@spec = nil @spec = nil
end end
@ -91,7 +92,7 @@ class Gem::Resolver::IndexSpecification < Gem::Resolver::Specification
def spec # :nodoc: def spec # :nodoc:
@spec ||= @spec ||=
begin begin
tuple = Gem::NameTuple.new @name, @version, @platform tuple = Gem::NameTuple.new @name, @version, @original_platform
@source.fetch_spec tuple @source.fetch_spec tuple
end end

View file

@ -5,8 +5,8 @@
class Gem::Resolver::InstalledSpecification < Gem::Resolver::SpecSpecification class Gem::Resolver::InstalledSpecification < Gem::Resolver::SpecSpecification
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@set == other.set and @set == other.set &&
@spec == other.spec @spec == other.spec
end end

View file

@ -61,13 +61,12 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
found = find_all request found = find_all request
found.delete_if do |s| found.delete_if do |s|
s.version.prerelease? and not s.local? s.version.prerelease? && !s.local?
end unless dependency.prerelease? end unless dependency.prerelease?
found = found.select do |s| found = found.select do |s|
Gem::Source::SpecificFile === s.source or Gem::Source::SpecificFile === s.source ||
Gem::Platform::RUBY == s.platform or Gem::Platform.match(s.platform)
Gem::Platform.local === s.platform
end end
found = found.sort_by do |s| found = found.sort_by do |s|
@ -111,14 +110,14 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
# Should local gems should be considered? # Should local gems should be considered?
def consider_local? # :nodoc: def consider_local? # :nodoc:
@domain == :both or @domain == :local @domain == :both || @domain == :local
end end
## ##
# Should remote gems should be considered? # Should remote gems should be considered?
def consider_remote? # :nodoc: def consider_remote? # :nodoc:
@domain == :both or @domain == :remote @domain == :both || @domain == :remote
end end
## ##
@ -137,7 +136,7 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
dep = req.dependency dep = req.dependency
return res if @ignore_dependencies and return res if @ignore_dependencies &&
@always_install.none? {|spec| dep.match? spec } @always_install.none? {|spec| dep.match? spec }
name = dep.name name = dep.name
@ -168,10 +167,6 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
end end
end end
res.delete_if do |spec|
spec.version.prerelease? and not dep.prerelease?
end
res.concat @remote_set.find_all req if consider_remote? res.concat @remote_set.find_all req if consider_remote?
res res

View file

@ -54,7 +54,7 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
dep = Gem::Dependency.new name, version dep = Gem::Dependency.new name, version
found = @specs.find do |spec| found = @specs.find do |spec|
dep.matches_spec? spec and spec.platform == platform dep.matches_spec?(spec) && spec.platform == platform
end end
tuple = Gem::NameTuple.new found.name, found.version, found.platform tuple = Gem::NameTuple.new found.name, found.version, found.platform

View file

@ -71,7 +71,7 @@ class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
def spec def spec
@spec ||= Gem::Specification.find do |spec| @spec ||= Gem::Specification.find do |spec|
spec.name == @name and spec.version == @version spec.name == @name && spec.version == @version
end end
@spec ||= Gem::Specification.new do |s| @spec ||= Gem::Specification.new do |s|

View file

@ -6,9 +6,9 @@
class Gem::Resolver::VendorSpecification < Gem::Resolver::SpecSpecification class Gem::Resolver::VendorSpecification < Gem::Resolver::SpecSpecification
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and self.class === other &&
@set == other.set and @set == other.set &&
@spec == other.spec and @spec == other.spec &&
@source == other.source @source == other.source
end end

View file

@ -618,7 +618,7 @@ module Gem::Security
path = File.expand_path path path = File.expand_path path
File.open path, "wb", permissions do |io| File.open path, "wb", permissions do |io|
if passphrase and cipher if passphrase && cipher
io.write pemmable.to_pem cipher, passphrase io.write pemmable.to_pem cipher, passphrase
else else
io.write pemmable.to_pem io.write pemmable.to_pem

View file

@ -88,16 +88,16 @@ class Gem::Security::Policy
message = "certificate #{signer.subject}" message = "certificate #{signer.subject}"
if not_before = signer.not_before and not_before > time if (not_before = signer.not_before) && not_before > time
raise Gem::Security::Exception, raise Gem::Security::Exception,
"#{message} not valid before #{not_before}" "#{message} not valid before #{not_before}"
end end
if not_after = signer.not_after and not_after < time if (not_after = signer.not_after) && not_after < time
raise Gem::Security::Exception, "#{message} not valid after #{not_after}" raise Gem::Security::Exception, "#{message} not valid after #{not_after}"
end end
if issuer and not signer.verify issuer.public_key if issuer && !signer.verify(issuer.public_key)
raise Gem::Security::Exception, raise Gem::Security::Exception,
"#{message} was not issued by #{issuer.subject}" "#{message} was not issued by #{issuer.subject}"
end end
@ -109,7 +109,7 @@ class Gem::Security::Policy
# Ensures the public key of +key+ matches the public key in +signer+ # Ensures the public key of +key+ matches the public key in +signer+
def check_key(signer, key) def check_key(signer, key)
unless signer and key unless signer && key
return true unless @only_signed return true unless @only_signed
raise Gem::Security::Exception, "missing key or signature" raise Gem::Security::Exception, "missing key or signature"
@ -231,7 +231,7 @@ class Gem::Security::Policy
if @verify_data if @verify_data
raise Gem::Security::Exception, "no digests provided (probable bug)" if raise Gem::Security::Exception, "no digests provided (probable bug)" if
signer_digests.nil? or signer_digests.empty? signer_digests.nil? || signer_digests.empty?
else else
signer_digests = {} signer_digests = {}
end end
@ -248,7 +248,7 @@ class Gem::Security::Policy
if @only_trusted if @only_trusted
check_trust chain, digester, trust_dir check_trust chain, digester, trust_dir
elsif signatures.empty? and digests.empty? elsif signatures.empty? && digests.empty?
# trust is irrelevant if there's no signatures to verify # trust is irrelevant if there's no signatures to verify
else else
alert_warning "#{subject signer} is not trusted for #{full_name}" alert_warning "#{subject signer} is not trusted for #{full_name}"

View file

@ -141,7 +141,7 @@ class Gem::Security::Signer
raise Gem::Security::Exception, "no certs provided" if @cert_chain.empty? raise Gem::Security::Exception, "no certs provided" if @cert_chain.empty?
if @cert_chain.length == 1 and @cert_chain.last.not_after < Time.now if @cert_chain.length == 1 && @cert_chain.last.not_after < Time.now
alert("Your certificate has expired, trying to re-sign it...") alert("Your certificate has expired, trying to re-sign it...")
re_sign_key( re_sign_key(

View file

@ -62,7 +62,7 @@ class Gem::Source
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
self.class === other and @uri == other.uri self.class === other && @uri == other.uri
end end
alias_method :eql?, :== # :nodoc: alias_method :eql?, :== # :nodoc:

View file

@ -76,10 +76,10 @@ class Gem::Source::Git < Gem::Source
end end
def ==(other) # :nodoc: def ==(other) # :nodoc:
super and super &&
@name == other.name and @name == other.name &&
@repository == other.repository and @repository == other.repository &&
@reference == other.reference and @reference == other.reference &&
@need_submodules == other.need_submodules @need_submodules == other.need_submodules
end end

View file

@ -98,7 +98,7 @@ class Gem::SpecFetcher
found[source] = specs.select do |tup| found[source] = specs.select do |tup|
if dependency.match?(tup) if dependency.match?(tup)
if matching_platform and !Gem::Platform.match_gem?(tup.platform, tup.name) if matching_platform && !Gem::Platform.match_gem?(tup.platform, tup.name)
pm = ( pm = (
rejected_specs[dependency] ||= \ rejected_specs[dependency] ||= \
Gem::PlatformMismatch.new(tup.name, tup.version)) Gem::PlatformMismatch.new(tup.name, tup.version))

View file

@ -473,7 +473,7 @@ class Gem::Specification < Gem::BasicSpecification
# spec.platform = Gem::Platform.local # spec.platform = Gem::Platform.local
def platform=(platform) def platform=(platform)
if @original_platform.nil? or if @original_platform.nil? ||
@original_platform == Gem::Platform::RUBY @original_platform == Gem::Platform::RUBY
@original_platform = platform @original_platform = platform
end end
@ -1046,7 +1046,7 @@ class Gem::Specification < Gem::BasicSpecification
def self.find_active_stub_by_path(path) def self.find_active_stub_by_path(path)
stub = @@active_stub_with_requirable_file[path] ||= (stubs.find do |s| stub = @@active_stub_with_requirable_file[path] ||= (stubs.find do |s|
s.activated? and s.contains_requirable_file? path s.activated? && s.contains_requirable_file?(path)
end || NOT_FOUND) end || NOT_FOUND)
stub.this stub.this
end end
@ -1234,7 +1234,7 @@ class Gem::Specification < Gem::BasicSpecification
latest_remote = remotes.sort.last latest_remote = remotes.sort.last
yield [local_spec, latest_remote] if yield [local_spec, latest_remote] if
latest_remote and local_spec.version < latest_remote latest_remote && local_spec.version < latest_remote
end end
nil nil
@ -1557,7 +1557,7 @@ class Gem::Specification < Gem::BasicSpecification
# Singular reader for #authors. Returns the first author in the list # Singular reader for #authors. Returns the first author in the list
def author def author
val = authors and val.first (val = authors) && val.first
end end
## ##
@ -1669,7 +1669,7 @@ class Gem::Specification < Gem::BasicSpecification
conflicts = {} conflicts = {}
self.runtime_dependencies.each do |dep| self.runtime_dependencies.each do |dep|
spec = Gem.loaded_specs[dep.name] spec = Gem.loaded_specs[dep.name]
if spec and not spec.satisfies_requirement? dep if spec && !spec.satisfies_requirement?(dep)
(conflicts[spec] ||= []) << dep (conflicts[spec] ||= []) << dep
end end
end end
@ -1696,7 +1696,7 @@ class Gem::Specification < Gem::BasicSpecification
self.dependencies.any? do |dep| self.dependencies.any? do |dep|
if dep.runtime? if dep.runtime?
spec = Gem.loaded_specs[dep.name] spec = Gem.loaded_specs[dep.name]
spec and not spec.satisfies_requirement? dep spec && !spec.satisfies_requirement?(dep)
else else
false false
end end
@ -1717,7 +1717,7 @@ class Gem::Specification < Gem::BasicSpecification
DateLike = Object.new # :nodoc: DateLike = Object.new # :nodoc:
def DateLike.===(obj) # :nodoc: def DateLike.===(obj) # :nodoc:
defined?(::Date) and Date === obj defined?(::Date) && Date === obj
end end
DateTimeFormat = # :nodoc: DateTimeFormat = # :nodoc:
@ -1757,9 +1757,9 @@ class Gem::Specification < Gem::BasicSpecification
# executable now. See Gem.bin_path. # executable now. See Gem.bin_path.
def default_executable # :nodoc: def default_executable # :nodoc:
if defined?(@default_executable) and @default_executable if defined?(@default_executable) && @default_executable
result = @default_executable result = @default_executable
elsif @executables and @executables.size == 1 elsif @executables && @executables.size == 1
result = Array(@executables).first result = Array(@executables).first
else else
result = nil result = nil
@ -1876,7 +1876,7 @@ class Gem::Specification < Gem::BasicSpecification
# Singular accessor for #executables # Singular accessor for #executables
def executable def executable
val = executables and val.first (val = executables) && val.first
end end
## ##
@ -1988,7 +1988,7 @@ class Gem::Specification < Gem::BasicSpecification
# True if this gem has files in test_files # True if this gem has files in test_files
def has_unit_tests? # :nodoc: def has_unit_tests? # :nodoc:
not test_files.empty? !test_files.empty?
end end
# :stopdoc: # :stopdoc:
@ -2041,7 +2041,7 @@ class Gem::Specification < Gem::BasicSpecification
self.name = name if name self.name = name if name
self.version = version if version self.version = version if version
if platform = Gem.platforms.last and platform != Gem::Platform::RUBY and platform != Gem::Platform.local if (platform = Gem.platforms.last) && platform != Gem::Platform::RUBY && platform != Gem::Platform.local
self.platform = platform self.platform = platform
end end
@ -2156,7 +2156,7 @@ class Gem::Specification < Gem::BasicSpecification
return return
end end
if @specification_version > CURRENT_SPECIFICATION_VERSION and if @specification_version > CURRENT_SPECIFICATION_VERSION &&
sym.to_s.end_with?("=") sym.to_s.end_with?("=")
warn "ignoring #{sym} loading #{full_name}" if $DEBUG warn "ignoring #{sym} loading #{full_name}" if $DEBUG
else else
@ -2183,7 +2183,7 @@ class Gem::Specification < Gem::BasicSpecification
# file list. # file list.
def normalize def normalize
if defined?(@extra_rdoc_files) and @extra_rdoc_files if defined?(@extra_rdoc_files) && @extra_rdoc_files
@extra_rdoc_files.uniq! @extra_rdoc_files.uniq!
@files ||= [] @files ||= []
@files.concat(@extra_rdoc_files) @files.concat(@extra_rdoc_files)
@ -2208,7 +2208,7 @@ class Gem::Specification < Gem::BasicSpecification
# platform. For use with legacy gems. # platform. For use with legacy gems.
def original_name # :nodoc: def original_name # :nodoc:
if platform == Gem::Platform::RUBY or platform.nil? if platform == Gem::Platform::RUBY || platform.nil?
"#{@name}-#{@version}" "#{@name}-#{@version}"
else else
"#{@name}-#{@version}-#{@original_platform}" "#{@name}-#{@version}-#{@original_platform}"
@ -2241,8 +2241,8 @@ class Gem::Specification < Gem::BasicSpecification
attributes.each do |attr_name| attributes.each do |attr_name|
current_value = self.send attr_name current_value = self.send attr_name
current_value = current_value.sort if %i[files test_files].include? attr_name current_value = current_value.sort if %i[files test_files].include? attr_name
if current_value != default_value(attr_name) or if current_value != default_value(attr_name) ||
self.class.required_attribute? attr_name self.class.required_attribute?(attr_name)
q.text "s.#{attr_name} = " q.text "s.#{attr_name} = "
@ -2300,7 +2300,7 @@ class Gem::Specification < Gem::BasicSpecification
# Singular accessor for #require_paths # Singular accessor for #require_paths
def require_path def require_path
val = require_paths and val.first (val = require_paths) && val.first
end end
## ##
@ -2429,7 +2429,7 @@ class Gem::Specification < Gem::BasicSpecification
# Singular accessor for #test_files # Singular accessor for #test_files
def test_file # :nodoc: def test_file # :nodoc:
val = test_files and val.first (val = test_files) && val.first
end end
## ##
@ -2451,7 +2451,7 @@ class Gem::Specification < Gem::BasicSpecification
@test_files = [@test_suite_file].flatten @test_files = [@test_suite_file].flatten
@test_suite_file = nil @test_suite_file = nil
end end
if defined?(@test_files) and @test_files if defined?(@test_files) && @test_files
@test_files @test_files
else else
@test_files = [] @test_files = []
@ -2475,13 +2475,13 @@ class Gem::Specification < Gem::BasicSpecification
result << " s.name = #{ruby_code name}" result << " s.name = #{ruby_code name}"
result << " s.version = #{ruby_code version}" result << " s.version = #{ruby_code version}"
unless platform.nil? or platform == Gem::Platform::RUBY unless platform.nil? || platform == Gem::Platform::RUBY
result << " s.platform = #{ruby_code original_platform}" result << " s.platform = #{ruby_code original_platform}"
end end
result << "" result << ""
result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version=" result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version="
if metadata and !metadata.empty? if metadata && !metadata.empty?
result << " s.metadata = #{ruby_code metadata} if s.respond_to? :metadata=" result << " s.metadata = #{ruby_code metadata} if s.respond_to? :metadata="
end end
result << " s.require_paths = #{ruby_code raw_require_paths}" result << " s.require_paths = #{ruby_code raw_require_paths}"
@ -2665,6 +2665,8 @@ class Gem::Specification < Gem::BasicSpecification
def version=(version) def version=(version)
@version = Gem::Version.create(version) @version = Gem::Version.create(version)
return if @version.nil?
# skip to set required_ruby_version when pre-released rubygems. # skip to set required_ruby_version when pre-released rubygems.
# It caused to raise CircularDependencyError # It caused to raise CircularDependencyError
if @version.prerelease? && (@name.nil? || @name.strip != "rubygems") if @version.prerelease? && (@name.nil? || @name.strip != "rubygems")

View file

@ -188,7 +188,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
prerelease_dep && !@specification.version.prerelease? prerelease_dep && !@specification.version.prerelease?
open_ended = dep.requirement.requirements.all? do |op, version| open_ended = dep.requirement.requirements.all? do |op, version|
not version.prerelease? and (op == ">" or op == ">=") !version.prerelease? && (op == ">" || op == ">=")
end end
if open_ended if open_ended
@ -203,7 +203,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
else else
bugfix = if op == ">" bugfix = if op == ">"
", '> #{dep_version}'" ", '> #{dep_version}'"
elsif op == ">=" and base != segments elsif op == ">=" && base != segments
", '>= #{dep_version}'" ", '>= #{dep_version}'"
end end
@ -338,7 +338,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
String String
end end
unless Array === val and val.all? {|x| x.kind_of?(klass) } unless Array === val && val.all? {|x| x.kind_of?(klass) }
error "#{field} must be an Array of #{klass}" error "#{field} must be an Array of #{klass}"
end end
end end
@ -404,7 +404,7 @@ http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard li
homepage = @specification.homepage homepage = @specification.homepage
# Make sure a homepage is valid HTTP/HTTPS URI # Make sure a homepage is valid HTTP/HTTPS URI
if homepage and not homepage.empty? if homepage && !homepage.empty?
require "uri" require "uri"
begin begin
homepage_uri = URI.parse(homepage) homepage_uri = URI.parse(homepage)

View file

@ -105,8 +105,8 @@ class Gem::Uninstaller
@default_specs_matching_uninstall_params = default_specs @default_specs_matching_uninstall_params = default_specs
list, other_repo_specs = list.partition do |spec| list, other_repo_specs = list.partition do |spec|
@gem_home == spec.base_dir or @gem_home == spec.base_dir ||
(@user_install and spec.base_dir == Gem.user_dir) (@user_install && spec.base_dir == Gem.user_dir)
end end
list.sort! list.sort!
@ -239,8 +239,8 @@ class Gem::Uninstaller
# spec:: the spec of the gem to be uninstalled # spec:: the spec of the gem to be uninstalled
def remove(spec) def remove(spec)
unless path_ok?(@gem_home, spec) or unless path_ok?(@gem_home, spec) ||
(@user_install and path_ok?(Gem.user_dir, spec)) (@user_install && path_ok?(Gem.user_dir, spec))
e = Gem::GemNotInHomeException.new \ e = Gem::GemNotInHomeException.new \
"Gem '#{spec.full_name}' is not installed in directory #{@gem_home}" "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
e.spec = spec e.spec = spec

View file

@ -284,7 +284,7 @@ class Gem::StreamUI
# Ask a question. Returns an answer if connected to a tty, nil otherwise. # Ask a question. Returns an answer if connected to a tty, nil otherwise.
def ask(question) def ask(question)
return nil if not tty? return nil if !tty?
@outs.print(question + " ") @outs.print(question + " ")
@outs.flush @outs.flush
@ -298,7 +298,7 @@ class Gem::StreamUI
# Ask for a password. Does not echo response to terminal. # Ask for a password. Does not echo response to terminal.
def ask_for_password(question) def ask_for_password(question)
return nil if not tty? return nil if !tty?
@outs.print(question, " ") @outs.print(question, " ")
@outs.flush @outs.flush

View file

@ -171,9 +171,7 @@ class Gem::Version
# True if the +version+ string matches RubyGems' requirements. # True if the +version+ string matches RubyGems' requirements.
def self.correct?(version) def self.correct?(version)
unless Gem::Deprecate.skip nil_versions_are_discouraged! if version.nil?
warn "nil versions are discouraged and will be deprecated in Rubygems 4" if version.nil?
end
!!(version.to_s =~ ANCHORED_VERSION_PATTERN) !!(version.to_s =~ ANCHORED_VERSION_PATTERN)
end end
@ -190,6 +188,8 @@ class Gem::Version
if self === input # check yourself before you wreck yourself if self === input # check yourself before you wreck yourself
input input
elsif input.nil? elsif input.nil?
nil_versions_are_discouraged!
nil nil
else else
new input new input
@ -206,6 +206,14 @@ class Gem::Version
@@all[version] ||= super @@all[version] ||= super
end end
def self.nil_versions_are_discouraged!
unless Gem::Deprecate.skip
warn "nil versions are discouraged and will be deprecated in Rubygems 4"
end
end
private_class_method :nil_versions_are_discouraged!
## ##
# Constructs a Version from the +version+ string. A version string is a # Constructs a Version from the +version+ string. A version string is a
# series of digits or ASCII letters separated by dots. # series of digits or ASCII letters separated by dots.
@ -244,7 +252,7 @@ class Gem::Version
# same precision. Version "1.0" is not the same as version "1". # same precision. Version "1.0" is not the same as version "1".
def eql?(other) def eql?(other)
self.class === other and @version == other._version self.class === other && @version == other._version
end end
def hash # :nodoc: def hash # :nodoc:

View file

@ -427,9 +427,8 @@ RSpec.describe "Bundler::RubyVersion and its subclasses" do
end end
describe "#version" do describe "#version" do
it "should return a copy of the value of RUBY_VERSION" do it "should return the value of Gem.ruby_version as a string" do
expect(subject.versions).to eq([RUBY_VERSION]) expect(subject.versions).to eq([Gem.ruby_version.to_s])
expect(subject.versions.first).to_not be(RUBY_VERSION)
end end
end end
@ -446,13 +445,12 @@ RSpec.describe "Bundler::RubyVersion and its subclasses" do
describe "#engine_version" do describe "#engine_version" do
context "engine is ruby" do context "engine is ruby" do
before do before do
stub_const("RUBY_ENGINE_VERSION", "2.2.4") allow(Gem).to receive(:ruby_version).and_return(Gem::Version.new("2.2.4"))
stub_const("RUBY_ENGINE", "ruby") stub_const("RUBY_ENGINE", "ruby")
end end
it "should return a copy of the value of RUBY_ENGINE_VERSION" do it "should return the value of Gem.ruby_version as a string" do
expect(bundler_system_ruby_version.engine_versions).to eq(["2.2.4"]) expect(bundler_system_ruby_version.engine_versions).to eq(["2.2.4"])
expect(bundler_system_ruby_version.engine_versions.first).to_not be(RUBY_ENGINE_VERSION)
end end
end end

View file

@ -522,14 +522,14 @@ RSpec.describe "bundle install with gem sources" do
ruby '~> 1.2' ruby '~> 1.2'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
expect(err).to include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified ~> 1.2") expect(err).to include("Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified ~> 1.2")
end end
end end
context "and using a supported Ruby version" do context "and using a supported Ruby version" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end
@ -555,7 +555,7 @@ RSpec.describe "bundle install with gem sources" do
it "updates Gemfile.lock with updated yet still compatible ruby version" do it "updates Gemfile.lock with updated yet still compatible ruby version" do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION[0..2]}' ruby '~> #{current_ruby_minor}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -913,7 +913,7 @@ RSpec.describe "bundle install with gem sources" do
gemfile <<-G gemfile <<-G
source "https://gem.repo4" source "https://gem.repo4"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "loofah", "~> 2.12.0" gem "loofah", "~> 2.12.0"
G G
@ -1020,6 +1020,30 @@ RSpec.describe "bundle install with gem sources" do
end end
end end
context "with --prefer-local flag" do
before do
build_repo4 do
build_gem "foo", "1.0.1"
build_gem "foo", "1.0.0"
build_gem "bar", "1.0.0"
end
system_gems "foo-1.0.0", :path => default_bundle_path, :gem_repo => gem_repo4
end
it "fetches remote sources only when not available locally" do
install_gemfile <<-G, :"prefer-local" => true, :verbose => true
source "#{file_uri_for(gem_repo4)}"
gem "foo"
gem "bar"
G
expect(out).to include("Using foo 1.0.0").and include("Fetching bar 1.0.0").and include("Installing bar 1.0.0")
expect(last_command).to be_success
end
end
context "with a symlinked configured as bundle path and a gem with symlinks" do context "with a symlinked configured as bundle path and a gem with symlinks" do
before do before do
symlinked_bundled_app = tmp("bundled_app-symlink") symlinked_bundled_app = tmp("bundled_app-symlink")

View file

@ -541,11 +541,9 @@ RSpec.describe "bundle lock" do
end end
it "respects lower bound ruby requirements" do it "respects lower bound ruby requirements" do
skip "this spec does not work with prereleases because their version is actually lower than their reported `RUBY_VERSION`" if RUBY_PATCHLEVEL == -1
build_repo4 do build_repo4 do
build_gem "our_private_gem", "0.1.0" do |s| build_gem "our_private_gem", "0.1.0" do |s|
s.required_ruby_version = ">= #{RUBY_VERSION}" s.required_ruby_version = ">= #{Gem.ruby_version}"
end end
end end

View file

@ -604,6 +604,22 @@ RSpec.describe "bundle outdated" do
expect(out).to end_with(expected_output) expect(out).to end_with(expected_output)
end end
it "only reports gems that have a newer version that matches the specified dependency version requirements, using --strict alias" do
update_repo2 do
build_gem "activesupport", "3.0"
build_gem "weakling", "0.0.5"
end
bundle :outdated, :strict => true, :raise_on_error => false
expected_output = <<~TABLE.strip
Gem Current Latest Requested Groups
weakling 0.0.3 0.0.5 ~> 0.0.1 default
TABLE
expect(out).to end_with(expected_output)
end
it "doesn't crash when some deps unused on the current platform" do it "doesn't crash when some deps unused on the current platform" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo2)}" source "#{file_uri_for(gem_repo2)}"
@ -1098,7 +1114,6 @@ RSpec.describe "bundle outdated" do
end end
context "conservative updates" do context "conservative updates" do
context "without --strict" do
before do before do
build_repo4 do build_repo4 do
build_gem "patch", %w[1.0.0 1.0.1] build_gem "patch", %w[1.0.0 1.0.1]
@ -1114,8 +1129,7 @@ RSpec.describe "bundle outdated" do
gem 'major', '1.0.0' gem 'major', '1.0.0'
G G
# remove 1.4.3 requirement and bar altogether # remove all version requirements
# to setup update specs below
gemfile <<-G gemfile <<-G
source "#{file_uri_for(gem_repo4)}" source "#{file_uri_for(gem_repo4)}"
gem 'patch' gem 'patch'
@ -1164,7 +1178,7 @@ RSpec.describe "bundle outdated" do
end end
end end
context "with --strict" do context "tricky conservative updates" do
before do before do
build_repo4 do build_repo4 do
build_gem "foo", %w[1.4.3 1.4.4] do |s| build_gem "foo", %w[1.4.3 1.4.4] do |s|
@ -1197,8 +1211,8 @@ RSpec.describe "bundle outdated" do
G G
end end
it "shows gems with --strict updating to patch and filtering to patch" do it "shows gems updating to patch and filtering to patch" do
bundle "outdated --patch --strict --filter-patch", :raise_on_error => false bundle "outdated --patch --filter-patch", :raise_on_error => false, :env => { "DEBUG_RESOLVER" => "1" }
expected_output = <<~TABLE.strip expected_output = <<~TABLE.strip
Gem Current Latest Requested Groups Gem Current Latest Requested Groups
@ -1208,6 +1222,17 @@ RSpec.describe "bundle outdated" do
expect(out).to end_with(expected_output) expect(out).to end_with(expected_output)
end end
it "shows gems updating to patch and filtering to patch, in debug mode" do
bundle "outdated --patch --filter-patch", :raise_on_error => false, :env => { "DEBUG" => "1" }
expected_output = <<~TABLE.strip
Gem Current Latest Requested Groups Path
bar 2.0.3 2.0.5
foo 1.4.3 1.4.4 >= 0 default
TABLE
expect(out).to end_with(expected_output)
end end
end end

View file

@ -19,7 +19,7 @@ Your app has gems that work on these platforms:
* #{specific_local_platform} * #{specific_local_platform}
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{RUBY_VERSION} * ruby #{Gem.ruby_version}
Your current platform satisfies the Ruby version requirement. Your current platform satisfies the Ruby version requirement.
G G
@ -42,7 +42,7 @@ Your app has gems that work on these platforms:
* #{specific_local_platform} * #{specific_local_platform}
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} * #{Bundler::RubyVersion.system.single_version_string}
Your current platform satisfies the Ruby version requirement. Your current platform satisfies the Ruby version requirement.
G G
@ -85,7 +85,7 @@ Your app has gems that work on these platforms:
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{not_local_ruby_version} * ruby #{not_local_ruby_version}
Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version} Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified #{not_local_ruby_version}
G G
end end
end end
@ -231,7 +231,7 @@ G
L L
bundle "platform --ruby" bundle "platform --ruby"
expect(out).to eq("ruby 1.0.0p127") expect(out).to eq("ruby 1.0.0")
end end
it "handles when there is a requirement in the gemfile" do it "handles when there is a requirement in the gemfile" do
@ -255,18 +255,18 @@ G
end end
end end
let(:ruby_version_correct) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{local_engine_version}\"" } let(:ruby_version_correct) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{local_engine_version}\"" }
let(:ruby_version_correct_engineless) { "ruby \"#{RUBY_VERSION}\"" } let(:ruby_version_correct_engineless) { "ruby \"#{Gem.ruby_version}\"" }
let(:ruby_version_correct_patchlevel) { "#{ruby_version_correct}, :patchlevel => '#{RUBY_PATCHLEVEL}'" } let(:ruby_version_correct_patchlevel) { "#{ruby_version_correct}, :patchlevel => '#{RUBY_PATCHLEVEL}'" }
let(:ruby_version_incorrect) { "ruby \"#{not_local_ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_ruby_version}\"" } let(:ruby_version_incorrect) { "ruby \"#{not_local_ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_ruby_version}\"" }
let(:engine_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{not_local_tag}\", :engine_version => \"#{RUBY_VERSION}\"" } let(:engine_incorrect) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{not_local_tag}\", :engine_version => \"#{Gem.ruby_version}\"" }
let(:engine_version_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_engine_version}\"" } let(:engine_version_incorrect) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_engine_version}\"" }
let(:patchlevel_incorrect) { "#{ruby_version_correct}, :patchlevel => '#{not_local_patchlevel}'" } let(:patchlevel_incorrect) { "#{ruby_version_correct}, :patchlevel => '#{not_local_patchlevel}'" }
let(:patchlevel_fixnum) { "#{ruby_version_correct}, :patchlevel => #{RUBY_PATCHLEVEL}1" } let(:patchlevel_fixnum) { "#{ruby_version_correct}, :patchlevel => #{RUBY_PATCHLEVEL}1" }
def should_be_ruby_version_incorrect def should_be_ruby_version_incorrect
expect(exitstatus).to eq(18) expect(exitstatus).to eq(18)
expect(err).to be_include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version}") expect(err).to be_include("Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified #{not_local_ruby_version}")
end end
def should_be_engine_incorrect def should_be_engine_incorrect

View file

@ -983,7 +983,7 @@ RSpec.describe "bundle update --ruby" do
context "when the Gemfile removes the ruby" do context "when the Gemfile removes the ruby" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -1013,12 +1013,12 @@ RSpec.describe "bundle update --ruby" do
context "when the Gemfile specified an updated Ruby version" do context "when the Gemfile specified an updated Ruby version" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
gemfile <<-G gemfile <<-G
ruby '~> #{RUBY_VERSION[0..2]}' ruby '~> #{current_ruby_minor}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end
@ -1047,7 +1047,7 @@ RSpec.describe "bundle update --ruby" do
context "when a different Ruby is being used than has been versioned" do context "when a different Ruby is being used than has been versioned" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -1083,7 +1083,7 @@ RSpec.describe "bundle update --ruby" do
L L
gemfile <<-G gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end

View file

@ -11,13 +11,13 @@ RSpec.describe "ruby requirement" do
it "allows adding gems" do it "allows adding gems" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "rack" gem "rack"
G G
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "rack" gem "rack"
gem "rack-obama" gem "rack-obama"
G G
@ -28,7 +28,7 @@ RSpec.describe "ruby requirement" do
it "allows removing the ruby version requirement" do it "allows removing the ruby version requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "~> #{RUBY_VERSION}" ruby "~> #{Gem.ruby_version}"
gem "rack" gem "rack"
G G
@ -46,7 +46,7 @@ RSpec.describe "ruby requirement" do
it "allows changing the ruby version requirement to something compatible" do it "allows changing the ruby version requirement to something compatible" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION[0..2]}.0" ruby ">= #{current_ruby_minor}"
gem "rack" gem "rack"
G G
@ -55,7 +55,7 @@ RSpec.describe "ruby requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION}" ruby ">= #{Gem.ruby_version}"
gem "rack" gem "rack"
G G
@ -93,7 +93,7 @@ RSpec.describe "ruby requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION[0..2]}.0" ruby ">= #{current_ruby_minor}"
gem "rack" gem "rack"
G G
@ -104,7 +104,7 @@ RSpec.describe "ruby requirement" do
it "allows requirements with trailing whitespace" do it "allows requirements with trailing whitespace" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}\\n \t\\n" ruby "#{Gem.ruby_version}\\n \t\\n"
gem "rack" gem "rack"
G G

Some files were not shown because too many files have changed in this diff Show more