diff options
author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2022-08-22 11:49:20 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2022-09-03 15:54:07 +0900 |
commit | 091878334780a9d6618ff83371fde39d85b635b5 (patch) | |
tree | 32a9f0dcc8ed45bbd17510da5ad73b4a3e62986d /lib | |
parent | 7ef68dd74af151a340a592869c28a0f78d2f11fb (diff) |
Merge RubyGems-3.3.18 and Bundler-2.3.18
Diffstat (limited to 'lib')
46 files changed, 252 insertions, 143 deletions
diff --git a/lib/bundler/compact_index_client/updater.rb b/lib/bundler/compact_index_client/updater.rb index d9b9cec0d4..5b430dfbe2 100644 --- a/lib/bundler/compact_index_client/updater.rb +++ b/lib/bundler/compact_index_client/updater.rb @@ -31,9 +31,8 @@ module Bundler # first try to fetch any new bytes on the existing file if retrying.nil? && local_path.file? - SharedHelpers.filesystem_access(local_temp_path) do - FileUtils.cp local_path, local_temp_path - end + copy_file local_path, local_temp_path + headers["If-None-Match"] = etag_for(local_temp_path) headers["Range"] = if local_temp_path.size.nonzero? @@ -98,6 +97,20 @@ module Bundler SharedHelpers.digest(:MD5).hexdigest(File.read(path)) end end + + private + + def copy_file(source, dest) + SharedHelpers.filesystem_access(source, :read) do + File.open(source, "r") do |s| + SharedHelpers.filesystem_access(dest, :write) do + File.open(dest, "wb", s.stat.mode) do |f| + IO.copy_stream(s, f) + end + end + end + end + end end end end diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 2e0f23a402..0580860845 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -235,6 +235,14 @@ module Bundler @locked_deps.values end + def new_deps + @new_deps ||= @dependencies - locked_dependencies + end + + def deleted_deps + @deleted_deps ||= locked_dependencies - @dependencies + end + def specs_for(groups) return specs if groups.empty? deps = dependencies_for(groups) @@ -259,8 +267,17 @@ module Bundler Bundler.ui.debug "Frozen, using resolution from the lockfile" @locked_specs elsif !unlocking? && nothing_changed? - Bundler.ui.debug("Found no changes, using resolution from the lockfile") - SpecSet.new(filter_specs(@locked_specs, @dependencies.select {|dep| @locked_specs[dep].any? })) + if deleted_deps.any? + Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile") + SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps)) + else + Bundler.ui.debug("Found no changes, using resolution from the lockfile") + if @locked_gems.may_include_redundant_platform_specific_gems? + SpecSet.new(filter_specs(@locked_specs, @dependencies)) + else + @locked_specs + end + end else last_resolve = converge_locked_specs # Run a resolve against the locally available gems @@ -359,9 +376,6 @@ module Bundler added.concat new_platforms.map {|p| "* platform: #{p}" } deleted.concat deleted_platforms.map {|p| "* platform: #{p}" } - new_deps = @dependencies - locked_dependencies - deleted_deps = locked_dependencies - @dependencies - added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any? deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any? @@ -806,7 +820,7 @@ module Bundler return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources) converge_specs(@originally_locked_specs).map do |locked_spec| name = locked_spec.name - dep = Gem::Dependency.new(name, ">= #{locked_spec.version}") + dep = Dependency.new(name, ">= #{locked_spec.version}") DepProxy.get_proxy(dep, locked_spec.platform) end end diff --git a/lib/bundler/dependency.rb b/lib/bundler/dependency.rb index 472363c72c..7f94079e09 100644 --- a/lib/bundler/dependency.rb +++ b/lib/bundler/dependency.rb @@ -7,7 +7,7 @@ require_relative "rubygems_ext" module Bundler class Dependency < Gem::Dependency attr_reader :autorequire - attr_reader :groups, :platforms, :gemfile, :git, :github, :branch, :ref + attr_reader :groups, :platforms, :gemfile, :git, :github, :branch, :ref, :force_ruby_platform # rubocop:disable Naming/VariableNumber PLATFORM_MAP = { @@ -109,6 +109,7 @@ module Bundler @env = options["env"] @should_include = options.fetch("should_include", true) @gemfile = options["gemfile"] + @force_ruby_platform = options["force_ruby_platform"] @autorequire = Array(options["require"] || []) if options.key?("require") end diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index bfa078046c..8b2d0ac97c 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -16,7 +16,7 @@ module Bundler VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules - platform platforms type source install_if gemfile].freeze + platform platforms type source install_if gemfile force_ruby_platform].freeze GITHUB_PULL_REQUEST_URL = %r{\Ahttps://github\.com/([A-Za-z0-9_\-\.]+/[A-Za-z0-9_\-\.]+)/pull/(\d+)\z}.freeze diff --git a/lib/bundler/gem_helpers.rb b/lib/bundler/gem_helpers.rb index d85d23f0db..6bc4fb4991 100644 --- a/lib/bundler/gem_helpers.rb +++ b/lib/bundler/gem_helpers.rb @@ -5,6 +5,7 @@ module Bundler GENERIC_CACHE = { Gem::Platform::RUBY => Gem::Platform::RUBY } # rubocop:disable Style/MutableConstant GENERICS = [ [Gem::Platform.new("java"), Gem::Platform.new("java")], + [Gem::Platform.new("universal-java"), Gem::Platform.new("java")], [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")], [Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")], [Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")], diff --git a/lib/bundler/lazy_specification.rb b/lib/bundler/lazy_specification.rb index 8430b86988..ddfa100411 100644 --- a/lib/bundler/lazy_specification.rb +++ b/lib/bundler/lazy_specification.rb @@ -7,7 +7,7 @@ module Bundler include MatchPlatform attr_reader :name, :version, :dependencies, :platform - attr_accessor :source, :remote + attr_accessor :source, :remote, :force_ruby_platform def initialize(name, version, platform, source = nil) @name = name @@ -152,7 +152,7 @@ module Bundler # explicitly add a more specific platform. # def ruby_platform_materializes_to_ruby_platform? - !Bundler.most_specific_locked_platform?(generic_local_platform) || Bundler.settings[:force_ruby_platform] + !Bundler.most_specific_locked_platform?(generic_local_platform) || force_ruby_platform || Bundler.settings[:force_ruby_platform] end end end diff --git a/lib/bundler/lockfile_parser.rb b/lib/bundler/lockfile_parser.rb index e074cbfc33..64fff4713d 100644 --- a/lib/bundler/lockfile_parser.rb +++ b/lib/bundler/lockfile_parser.rb @@ -93,6 +93,10 @@ module Bundler "and then `bundle install` to generate a new lockfile." end + def may_include_redundant_platform_specific_gems? + bundler_version.nil? || bundler_version < Gem::Version.new("1.16.2") + end + private TYPES = { diff --git a/lib/bundler/man/bundle-add.1 b/lib/bundler/man/bundle-add.1 index 821c253ff2..1a77124861 100644 --- a/lib/bundler/man/bundle-add.1 +++ b/lib/bundler/man/bundle-add.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-ADD" "1" "May 2022" "" "" +.TH "BUNDLE\-ADD" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install diff --git a/lib/bundler/man/bundle-binstubs.1 b/lib/bundler/man/bundle-binstubs.1 index 7800b1ca3d..d8312c391d 100644 --- a/lib/bundler/man/bundle-binstubs.1 +++ b/lib/bundler/man/bundle-binstubs.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-BINSTUBS" "1" "May 2022" "" "" +.TH "BUNDLE\-BINSTUBS" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems diff --git a/lib/bundler/man/bundle-cache.1 b/lib/bundler/man/bundle-cache.1 index 47f53c62fb..935477a3de 100644 --- a/lib/bundler/man/bundle-cache.1 +++ b/lib/bundler/man/bundle-cache.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CACHE" "1" "May 2022" "" "" +.TH "BUNDLE\-CACHE" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application diff --git a/lib/bundler/man/bundle-check.1 b/lib/bundler/man/bundle-check.1 index 92a6d52d30..0f38d17bd3 100644 --- a/lib/bundler/man/bundle-check.1 +++ b/lib/bundler/man/bundle-check.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CHECK" "1" "May 2022" "" "" +.TH "BUNDLE\-CHECK" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems diff --git a/lib/bundler/man/bundle-clean.1 b/lib/bundler/man/bundle-clean.1 index 56e8cef3ac..e0b2aac549 100644 --- a/lib/bundler/man/bundle-clean.1 +++ b/lib/bundler/man/bundle-clean.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CLEAN" "1" "May 2022" "" "" +.TH "BUNDLE\-CLEAN" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory diff --git a/lib/bundler/man/bundle-config.1 b/lib/bundler/man/bundle-config.1 index 22c2b76f39..4156d0c039 100644 --- a/lib/bundler/man/bundle-config.1 +++ b/lib/bundler/man/bundle-config.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CONFIG" "1" "May 2022" "" "" +.TH "BUNDLE\-CONFIG" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-config\fR \- Set bundler configuration options diff --git a/lib/bundler/man/bundle-doctor.1 b/lib/bundler/man/bundle-doctor.1 index 5b5f785c46..5e76db89c2 100644 --- a/lib/bundler/man/bundle-doctor.1 +++ b/lib/bundler/man/bundle-doctor.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-DOCTOR" "1" "May 2022" "" "" +.TH "BUNDLE\-DOCTOR" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-doctor\fR \- Checks the bundle for common problems diff --git a/lib/bundler/man/bundle-exec.1 b/lib/bundler/man/bundle-exec.1 index d71cb473e1..16ad1c2a74 100644 --- a/lib/bundler/man/bundle-exec.1 +++ b/lib/bundler/man/bundle-exec.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-EXEC" "1" "May 2022" "" "" +.TH "BUNDLE\-EXEC" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-exec\fR \- Execute a command in the context of the bundle diff --git a/lib/bundler/man/bundle-gem.1 b/lib/bundler/man/bundle-gem.1 index 6927702af3..eb66e2d41d 100644 --- a/lib/bundler/man/bundle-gem.1 +++ b/lib/bundler/man/bundle-gem.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-GEM" "1" "May 2022" "" "" +.TH "BUNDLE\-GEM" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem diff --git a/lib/bundler/man/bundle-info.1 b/lib/bundler/man/bundle-info.1 index ad1a1293aa..be1a9e1dcd 100644 --- a/lib/bundler/man/bundle-info.1 +++ b/lib/bundler/man/bundle-info.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INFO" "1" "May 2022" "" "" +.TH "BUNDLE\-INFO" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-info\fR \- Show information for the given gem in your bundle diff --git a/lib/bundler/man/bundle-init.1 b/lib/bundler/man/bundle-init.1 index 03a20be6b5..24f1f7543b 100644 --- a/lib/bundler/man/bundle-init.1 +++ b/lib/bundler/man/bundle-init.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INIT" "1" "May 2022" "" "" +.TH "BUNDLE\-INIT" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-init\fR \- Generates a Gemfile into the current working directory diff --git a/lib/bundler/man/bundle-inject.1 b/lib/bundler/man/bundle-inject.1 index d3868e3f8c..2dbcd6e376 100644 --- a/lib/bundler/man/bundle-inject.1 +++ b/lib/bundler/man/bundle-inject.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INJECT" "1" "May 2022" "" "" +.TH "BUNDLE\-INJECT" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile diff --git a/lib/bundler/man/bundle-install.1 b/lib/bundler/man/bundle-install.1 index 60e832bfb1..e8184fd510 100644 --- a/lib/bundler/man/bundle-install.1 +++ b/lib/bundler/man/bundle-install.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INSTALL" "1" "May 2022" "" "" +.TH "BUNDLE\-INSTALL" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile diff --git a/lib/bundler/man/bundle-list.1 b/lib/bundler/man/bundle-list.1 index 924b6f56b1..5bc3f43943 100644 --- a/lib/bundler/man/bundle-list.1 +++ b/lib/bundler/man/bundle-list.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-LIST" "1" "May 2022" "" "" +.TH "BUNDLE\-LIST" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-list\fR \- List all the gems in the bundle diff --git a/lib/bundler/man/bundle-lock.1 b/lib/bundler/man/bundle-lock.1 index 42299230b7..2934b44171 100644 --- a/lib/bundler/man/bundle-lock.1 +++ b/lib/bundler/man/bundle-lock.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-LOCK" "1" "May 2022" "" "" +.TH "BUNDLE\-LOCK" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing diff --git a/lib/bundler/man/bundle-open.1 b/lib/bundler/man/bundle-open.1 index 339606276c..c4e58fb854 100644 --- a/lib/bundler/man/bundle-open.1 +++ b/lib/bundler/man/bundle-open.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-OPEN" "1" "May 2022" "" "" +.TH "BUNDLE\-OPEN" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle diff --git a/lib/bundler/man/bundle-outdated.1 b/lib/bundler/man/bundle-outdated.1 index 9e17daaee4..ee865b3e97 100644 --- a/lib/bundler/man/bundle-outdated.1 +++ b/lib/bundler/man/bundle-outdated.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-OUTDATED" "1" "May 2022" "" "" +.TH "BUNDLE\-OUTDATED" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-outdated\fR \- List installed gems with newer versions available diff --git a/lib/bundler/man/bundle-platform.1 b/lib/bundler/man/bundle-platform.1 index e4310bc567..aab17a429a 100644 --- a/lib/bundler/man/bundle-platform.1 +++ b/lib/bundler/man/bundle-platform.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-PLATFORM" "1" "May 2022" "" "" +.TH "BUNDLE\-PLATFORM" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-platform\fR \- Displays platform compatibility information diff --git a/lib/bundler/man/bundle-pristine.1 b/lib/bundler/man/bundle-pristine.1 index 5a30f7c61c..a0a5ac1a9b 100644 --- a/lib/bundler/man/bundle-pristine.1 +++ b/lib/bundler/man/bundle-pristine.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-PRISTINE" "1" "May 2022" "" "" +.TH "BUNDLE\-PRISTINE" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition diff --git a/lib/bundler/man/bundle-remove.1 b/lib/bundler/man/bundle-remove.1 index 2ac47fd256..f6055716c7 100644 --- a/lib/bundler/man/bundle-remove.1 +++ b/lib/bundler/man/bundle-remove.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-REMOVE" "1" "May 2022" "" "" +.TH "BUNDLE\-REMOVE" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-remove\fR \- Removes gems from the Gemfile diff --git a/lib/bundler/man/bundle-show.1 b/lib/bundler/man/bundle-show.1 index 5e2cdeae54..14db8075f6 100644 --- a/lib/bundler/man/bundle-show.1 +++ b/lib/bundler/man/bundle-show.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-SHOW" "1" "May 2022" "" "" +.TH "BUNDLE\-SHOW" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem diff --git a/lib/bundler/man/bundle-update.1 b/lib/bundler/man/bundle-update.1 index 4172b8dce5..b7e2b78812 100644 --- a/lib/bundler/man/bundle-update.1 +++ b/lib/bundler/man/bundle-update.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-UPDATE" "1" "May 2022" "" "" +.TH "BUNDLE\-UPDATE" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-update\fR \- Update your gems to the latest available versions diff --git a/lib/bundler/man/bundle-viz.1 b/lib/bundler/man/bundle-viz.1 index 13374f31d5..68ea9e7e42 100644 --- a/lib/bundler/man/bundle-viz.1 +++ b/lib/bundler/man/bundle-viz.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-VIZ" "1" "May 2022" "" "" +.TH "BUNDLE\-VIZ" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile diff --git a/lib/bundler/man/bundle.1 b/lib/bundler/man/bundle.1 index b5af10f469..31d1c12962 100644 --- a/lib/bundler/man/bundle.1 +++ b/lib/bundler/man/bundle.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE" "1" "May 2022" "" "" +.TH "BUNDLE" "1" "June 2022" "" "" . .SH "NAME" \fBbundle\fR \- Ruby Dependency Management diff --git a/lib/bundler/man/gemfile.5 b/lib/bundler/man/gemfile.5 index 4987fb58ea..bf1b8b1c74 100644 --- a/lib/bundler/man/gemfile.5 +++ b/lib/bundler/man/gemfile.5 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "GEMFILE" "5" "May 2022" "" "" +.TH "GEMFILE" "5" "June 2022" "" "" . .SH "NAME" \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs @@ -100,7 +100,7 @@ Each application \fImay\fR specify a Ruby engine version\. If an engine version . .nf -ruby "1\.8\.7", :engine => "jruby", :engine_version => "1\.6\.7" +ruby "1\.8\.7", engine: "jruby", engine_version: "1\.6\.7" . .fi . @@ -113,7 +113,7 @@ Each application \fImay\fR specify a Ruby patchlevel\. . .nf -ruby "2\.0\.0", :patchlevel => "247" +ruby "2\.0\.0", patchlevel: "247" . .fi . @@ -156,9 +156,9 @@ Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring vi . .nf -gem "redis", :require => ["redis/connection/hiredis", "redis"] -gem "webmock", :require => false -gem "byebug", :require => true +gem "redis", require: ["redis/connection/hiredis", "redis"] +gem "webmock", require: false +gem "byebug", require: true . .fi . @@ -172,8 +172,8 @@ The argument defaults to the name of the gem\. For example, these are identical: .nf gem "nokogiri" -gem "nokogiri", :require => "nokogiri" -gem "nokogiri", :require => true +gem "nokogiri", require: "nokogiri" +gem "nokogiri", require: true . .fi . @@ -186,8 +186,8 @@ Each \fIgem\fR \fBMAY\fR specify membership in one or more groups\. Any \fIgem\f . .nf -gem "rspec", :group => :test -gem "wirble", :groups => [:development, :test] +gem "rspec", group: :test +gem "wirble", groups: [:development, :test] . .fi . @@ -320,9 +320,9 @@ As with groups, you can specify one or more platforms: . .nf -gem "weakling", :platforms => :jruby -gem "ruby\-debug", :platforms => :mri_18 -gem "nokogiri", :platforms => [:mri_18, :jruby] +gem "weakling", platforms: :jruby +gem "ruby\-debug", platforms: :mri_18 +gem "nokogiri", platforms: [:mri_18, :jruby] . .fi . @@ -331,6 +331,30 @@ gem "nokogiri", :platforms => [:mri_18, :jruby] .P All operations involving groups (\fBbundle install\fR \fIbundle\-install\.1\.html\fR, \fBBundler\.setup\fR, \fBBundler\.require\fR) behave exactly the same as if any groups not matching the current platform were explicitly excluded\. . +.SS "FORCE_RUBY_PLATFORM" +If you always want the pure ruby variant of a gem to be chosen over platform specific variants, you can use the \fBforce_ruby_platform\fR option: +. +.IP "" 4 +. +.nf + +gem "ffi", force_ruby_platform: true +. +.fi +. +.IP "" 0 +. +.P +This can be handy (assuming the pure ruby variant works fine) when: +. +.IP "\(bu" 4 +You\'re having issues with the platform specific variant\. +. +.IP "\(bu" 4 +The platform specific variant does not yet support a newer ruby (and thus has a \fBrequired_ruby_version\fR upper bound), but you still want your Gemfile{\.lock} files to resolve under that ruby\. +. +.IP "" 0 +. .SS "SOURCE" You can select an alternate Rubygems repository for a gem using the \':source\' option\. . @@ -338,7 +362,7 @@ You can select an alternate Rubygems repository for a gem using the \':source\' . .nf -gem "some_internal_gem", :source => "https://gems\.example\.com" +gem "some_internal_gem", source: "https://gems\.example\.com" . .fi . @@ -361,15 +385,15 @@ If necessary, you can specify that a gem is located at a particular git reposito . .TP \fBHTTP(S)\fR -gem "rails", :git => "https://github\.com/rails/rails\.git" +gem "rails", git: "https://github\.com/rails/rails\.git" . .TP \fBSSH\fR -gem "rails", :git => "git@github\.com:rails/rails\.git" +gem "rails", git: "git@github\.com:rails/rails\.git" . .TP \fBgit\fR -gem "rails", :git => "git://github\.com/rails/rails\.git" +gem "rails", git: "git://github\.com/rails/rails\.git" . .P If using SSH, the user that you use to run \fBbundle install\fR \fBMUST\fR have the appropriate keys available in their \fB$HOME/\.ssh\fR\. @@ -393,7 +417,7 @@ If a git repository does have a \fB\.gemspec\fR for the gem you attached it to, . .nf -gem "rails", "2\.3\.8", :git => "https://github\.com/rails/rails\.git" +gem "rails", "2\.3\.8", git: "https://github\.com/rails/rails\.git" # bundle install will fail, because the \.gemspec in the rails # repository\'s master branch specifies version 3\.0\.0 . @@ -409,20 +433,20 @@ Git repositories support a number of additional options\. . .TP \fBbranch\fR, \fBtag\fR, and \fBref\fR -You \fBMUST\fR only specify at most one of these options\. The default is \fB:branch => "master"\fR\. For example: +You \fBMUST\fR only specify at most one of these options\. The default is \fBbranch: "master"\fR\. For example: . .IP -gem "rails", :git => "https://github\.com/rails/rails\.git", :branch => "5\-0\-stable" +gem "rails", git: "https://github\.com/rails/rails\.git", branch: "5\-0\-stable" . .IP -gem "rails", :git => "https://github\.com/rails/rails\.git", :tag => "v5\.0\.0" +gem "rails", git: "https://github\.com/rails/rails\.git", tag: "v5\.0\.0" . .IP -gem "rails", :git => "https://github\.com/rails/rails\.git", :ref => "4aded" +gem "rails", git: "https://github\.com/rails/rails\.git", ref: "4aded" . .TP \fBsubmodules\fR -For reference, a git submodule \fIhttps://git\-scm\.com/book/en/v2/Git\-Tools\-Submodules\fR lets you have another git repository within a subfolder of your repository\. Specify \fB:submodules => true\fR to cause bundler to expand any submodules included in the git repository +For reference, a git submodule \fIhttps://git\-scm\.com/book/en/v2/Git\-Tools\-Submodules\fR lets you have another git repository within a subfolder of your repository\. Specify \fBsubmodules: true\fR to cause bundler to expand any submodules included in the git repository . .P If a git repository contains multiple \fB\.gemspecs\fR, each \fB\.gemspec\fR represents a gem located at the same place in the file system as the \fB\.gemspec\fR\. @@ -454,7 +478,7 @@ A custom git source can be defined via the \fBgit_source\fR method\. Provide the .nf git_source(:stash){ |repo_name| "https://stash\.corp\.acme\.pl/#{repo_name}\.git" } -gem \'rails\', :stash => \'forks/rails\' +gem \'rails\', stash: \'forks/rails\' . .fi . @@ -467,7 +491,7 @@ In addition, if you wish to choose a specific branch: . .nf -gem "rails", :stash => "forks/rails", :branch => "branch_name" +gem "rails", stash: "forks/rails", branch: "branch_name" . .fi . @@ -483,8 +507,8 @@ If the git repository you want to use is hosted on GitHub and is public, you can . .nf -gem "rails", :github => "rails/rails" -gem "rails", :github => "rails" +gem "rails", github: "rails/rails" +gem "rails", github: "rails" . .fi . @@ -497,7 +521,7 @@ Are both equivalent to . .nf -gem "rails", :git => "git://github\.com/rails/rails\.git" +gem "rails", git: "git://github\.com/rails/rails\.git" . .fi . @@ -513,7 +537,7 @@ You can also directly pass a pull request URL: . .nf -gem "rails", :github => "https://github\.com/rails/rails/pull/43753" +gem "rails", github: "https://github\.com/rails/rails/pull/43753" . .fi . @@ -526,7 +550,7 @@ Which is equivalent to: . .nf -gem "rails", :github => "rails/rails", branch: "refs/pull/43753/head" +gem "rails", github: "rails/rails", branch: "refs/pull/43753/head" . .fi . @@ -539,7 +563,7 @@ If the git repository you want to use is hosted as a GitHub Gist and is public, . .nf -gem "the_hatch", :gist => "4815162342" +gem "the_hatch", gist: "4815162342" . .fi . @@ -552,7 +576,7 @@ Is equivalent to: . .nf -gem "the_hatch", :git => "https://gist\.github\.com/4815162342\.git" +gem "the_hatch", git: "https://gist\.github\.com/4815162342\.git" . .fi . @@ -568,8 +592,8 @@ If the git repository you want to use is hosted on Bitbucket and is public, you . .nf -gem "rails", :bitbucket => "rails/rails" -gem "rails", :bitbucket => "rails" +gem "rails", bitbucket: "rails/rails" +gem "rails", bitbucket: "rails" . .fi . @@ -582,7 +606,7 @@ Are both equivalent to . .nf -gem "rails", :git => "https://rails@bitbucket\.org/rails/rails\.git" +gem "rails", git: "https://rails@bitbucket\.org/rails/rails\.git" . .fi . @@ -604,7 +628,7 @@ Unlike \fB:git\fR, bundler does not compile C extensions for gems specified as p . .nf -gem "rails", :path => "vendor/rails" +gem "rails", path: "vendor/rails" . .fi . @@ -648,7 +672,7 @@ platforms :ruby do gem "sqlite3" end -group :development, :optional => true do +group :development, optional: true do gem "wirble" gem "faker" end @@ -688,7 +712,7 @@ The \fB\.gemspec\fR \fIhttp://guides\.rubygems\.org/specification\-reference/\fR If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\. . .P -The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fB:path => \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths\. +The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fBpath: \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths\. . .P The \fBgemspec\fR method supports optional \fB:path\fR, \fB:glob\fR, \fB:name\fR, and \fB:development_group\fR options, which control where bundler looks for the \fB\.gemspec\fR, the glob it uses to look for the gemspec (defaults to: "{,\fI,\fR/*}\.gemspec"), what named \fB\.gemspec\fR it uses (if more than one is present), and which group development dependencies are included in\. diff --git a/lib/bundler/man/gemfile.5.ronn b/lib/bundler/man/gemfile.5.ronn index 0feaf58246..e23e1d49df 100644 --- a/lib/bundler/man/gemfile.5.ronn +++ b/lib/bundler/man/gemfile.5.ronn @@ -91,13 +91,13 @@ Each application _may_ specify a Ruby engine version. If an engine version is specified, an engine _must_ also be specified. If the engine is "ruby" the engine version specified _must_ match the Ruby version. - ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7" + ruby "1.8.7", engine: "jruby", engine_version: "1.6.7" ### PATCHLEVEL Each application _may_ specify a Ruby patchlevel. - ruby "2.0.0", :patchlevel => "247" + ruby "2.0.0", patchlevel: "247" ## GEMS @@ -124,23 +124,23 @@ Each _gem_ `MAY` specify files that should be used when autorequiring via you want `required` has the same name as _gem_ or `false` to prevent any file from being autorequired. - gem "redis", :require => ["redis/connection/hiredis", "redis"] - gem "webmock", :require => false - gem "byebug", :require => true + gem "redis", require: ["redis/connection/hiredis", "redis"] + gem "webmock", require: false + gem "byebug", require: true The argument defaults to the name of the gem. For example, these are identical: gem "nokogiri" - gem "nokogiri", :require => "nokogiri" - gem "nokogiri", :require => true + gem "nokogiri", require: "nokogiri" + gem "nokogiri", require: true ### GROUPS Each _gem_ `MAY` specify membership in one or more groups. Any _gem_ that does not specify membership in any group is placed in the `default` group. - gem "rspec", :group => :test - gem "wirble", :groups => [:development, :test] + gem "rspec", group: :test + gem "wirble", groups: [:development, :test] The Bundler runtime allows its two main methods, `Bundler.setup` and `Bundler.require`, to limit their impact to particular groups. @@ -223,20 +223,34 @@ The full list of platforms and supported versions includes: As with groups, you can specify one or more platforms: - gem "weakling", :platforms => :jruby - gem "ruby-debug", :platforms => :mri_18 - gem "nokogiri", :platforms => [:mri_18, :jruby] + gem "weakling", platforms: :jruby + gem "ruby-debug", platforms: :mri_18 + gem "nokogiri", platforms: [:mri_18, :jruby] All operations involving groups ([`bundle install`](bundle-install.1.html), `Bundler.setup`, `Bundler.require`) behave exactly the same as if any groups not matching the current platform were explicitly excluded. +### FORCE_RUBY_PLATFORM + +If you always want the pure ruby variant of a gem to be chosen over platform +specific variants, you can use the `force_ruby_platform` option: + + gem "ffi", force_ruby_platform: true + +This can be handy (assuming the pure ruby variant works fine) when: + +* You're having issues with the platform specific variant. +* The platform specific variant does not yet support a newer ruby (and thus has + a `required_ruby_version` upper bound), but you still want your Gemfile{.lock} + files to resolve under that ruby. + ### SOURCE You can select an alternate Rubygems repository for a gem using the ':source' option. - gem "some_internal_gem", :source => "https://gems.example.com" + gem "some_internal_gem", source: "https://gems.example.com" This forces the gem to be loaded from this source and ignores any global sources declared at the top level of the file. If the gem does not exist in this source, @@ -263,11 +277,11 @@ git repository using the `:git` parameter. The repository can be accessed via several protocols: * `HTTP(S)`: - gem "rails", :git => "https://github.com/rails/rails.git" + gem "rails", git: "https://github.com/rails/rails.git" * `SSH`: - gem "rails", :git => "git@github.com:rails/rails.git" + gem "rails", git: "git@github.com:rails/rails.git" * `git`: - gem "rails", :git => "git://github.com/rails/rails.git" + gem "rails", git: "git://github.com/rails/rails.git" If using SSH, the user that you use to run `bundle install` `MUST` have the appropriate keys available in their `$HOME/.ssh`. @@ -295,7 +309,7 @@ to, a version specifier, if provided, means that the git repository is only valid if the `.gemspec` specifies a version matching the version specifier. If not, bundler will print a warning. - gem "rails", "2.3.8", :git => "https://github.com/rails/rails.git" + gem "rails", "2.3.8", git: "https://github.com/rails/rails.git" # bundle install will fail, because the .gemspec in the rails # repository's master branch specifies version 3.0.0 @@ -307,18 +321,18 @@ Git repositories support a number of additional options. * `branch`, `tag`, and `ref`: You `MUST` only specify at most one of these options. The default - is `:branch => "master"`. For example: + is `branch: "master"`. For example: - gem "rails", :git => "https://github.com/rails/rails.git", :branch => "5-0-stable" + gem "rails", git: "https://github.com/rails/rails.git", branch: "5-0-stable" - gem "rails", :git => "https://github.com/rails/rails.git", :tag => "v5.0.0" + gem "rails", git: "https://github.com/rails/rails.git", tag: "v5.0.0" - gem "rails", :git => "https://github.com/rails/rails.git", :ref => "4aded" + gem "rails", git: "https://github.com/rails/rails.git", ref: "4aded" * `submodules`: For reference, a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) lets you have another git repository within a subfolder of your repository. - Specify `:submodules => true` to cause bundler to expand any + Specify `submodules: true` to cause bundler to expand any submodules included in the git repository If a git repository contains multiple `.gemspecs`, each `.gemspec` @@ -346,11 +360,11 @@ as an argument, and a block which receives a single argument and interpolates it string to return the full repo address: git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" } - gem 'rails', :stash => 'forks/rails' + gem 'rails', stash: 'forks/rails' In addition, if you wish to choose a specific branch: - gem "rails", :stash => "forks/rails", :branch => "branch_name" + gem "rails", stash: "forks/rails", branch: "branch_name" ### GITHUB @@ -363,33 +377,33 @@ If the git repository you want to use is hosted on GitHub and is public, you can trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. - gem "rails", :github => "rails/rails" - gem "rails", :github => "rails" + gem "rails", github: "rails/rails" + gem "rails", github: "rails" Are both equivalent to - gem "rails", :git => "git://github.com/rails/rails.git" + gem "rails", git: "git://github.com/rails/rails.git" Since the `github` method is a specialization of `git_source`, it accepts a `:branch` named argument. You can also directly pass a pull request URL: - gem "rails", :github => "https://github.com/rails/rails/pull/43753" + gem "rails", github: "https://github.com/rails/rails/pull/43753" Which is equivalent to: - gem "rails", :github => "rails/rails", branch: "refs/pull/43753/head" + gem "rails", github: "rails/rails", branch: "refs/pull/43753/head" ### GIST If the git repository you want to use is hosted as a GitHub Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing ".git"). - gem "the_hatch", :gist => "4815162342" + gem "the_hatch", gist: "4815162342" Is equivalent to: - gem "the_hatch", :git => "https://gist.github.com/4815162342.git" + gem "the_hatch", git: "https://gist.github.com/4815162342.git" Since the `gist` method is a specialization of `git_source`, it accepts a `:branch` named argument. @@ -400,12 +414,12 @@ If the git repository you want to use is hosted on Bitbucket and is public, you trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. - gem "rails", :bitbucket => "rails/rails" - gem "rails", :bitbucket => "rails" + gem "rails", bitbucket: "rails/rails" + gem "rails", bitbucket: "rails" Are both equivalent to - gem "rails", :git => "https://rails@bitbucket.org/rails/rails.git" + gem "rails", git: "https://rails@bitbucket.org/rails/rails.git" Since the `bitbucket` method is a specialization of `git_source`, it accepts a `:branch` named argument. @@ -423,7 +437,7 @@ version that bundler should use. Unlike `:git`, bundler does not compile C extensions for gems specified as paths. - gem "rails", :path => "vendor/rails" + gem "rails", path: "vendor/rails" If you would like to use multiple local gems directly from the filesystem, you can set a global `path` option to the path containing the gem's files. This will automatically load gemspec files from subdirectories. @@ -452,7 +466,7 @@ applied to a group of gems by using block form. gem "sqlite3" end - group :development, :optional => true do + group :development, optional: true do gem "wirble" gem "faker" end @@ -495,8 +509,8 @@ the `.gemspec` file. The `gemspec` method adds any runtime dependencies as gem requirements in the default group. It also adds development dependencies as gem requirements in the -`development` group. Finally, it adds a gem requirement on your project (`:path -=> '.'`). In conjunction with `Bundler.setup`, this allows you to require project +`development` group. Finally, it adds a gem requirement on your project (`path: +'.'`). In conjunction with `Bundler.setup`, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths. diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index fc4d7cb15d..972a4c254d 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -143,9 +143,12 @@ module Bundler end spec_group_ruby = SpecGroup.create_for(specs_by_platform, [Gem::Platform::RUBY], Gem::Platform::RUBY) - groups << spec_group_ruby if spec_group_ruby + if spec_group_ruby + spec_group_ruby.force_ruby_platform = dependency.force_ruby_platform + groups << spec_group_ruby + end - next groups if @resolving_only_for_ruby + next groups if @resolving_only_for_ruby || dependency.force_ruby_platform spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform) groups << spec_group diff --git a/lib/bundler/resolver/spec_group.rb b/lib/bundler/resolver/spec_group.rb index 18ab5a52a3..4de5b91aa6 100644 --- a/lib/bundler/resolver/spec_group.rb +++ b/lib/bundler/resolver/spec_group.rb @@ -4,7 +4,7 @@ module Bundler class Resolver class SpecGroup attr_accessor :name, :version, :source - attr_accessor :activated_platforms + attr_accessor :activated_platforms, :force_ruby_platform def self.create_for(specs, all_platforms, specific_platform) specific_platform_specs = specs[specific_platform] @@ -35,6 +35,7 @@ module Bundler specs.map do |s| lazy_spec = LazySpecification.new(name, version, s.platform, source) + lazy_spec.force_ruby_platform = force_ruby_platform lazy_spec.dependencies.replace s.dependencies lazy_spec end @@ -88,7 +89,7 @@ module Bundler dependencies = [] @specs[platform].first.dependencies.each do |dep| next if dep.type == :development - dependencies << DepProxy.get_proxy(dep, platform) + dependencies << DepProxy.get_proxy(Dependency.new(dep.name, dep.requirement), platform) end dependencies end @@ -98,10 +99,10 @@ module Bundler return [] if spec.is_a?(LazySpecification) dependencies = [] unless spec.required_ruby_version.none? - dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform) + dependencies << DepProxy.get_proxy(Dependency.new("Ruby\0", spec.required_ruby_version), platform) end unless spec.required_rubygems_version.none? - dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform) + dependencies << DepProxy.get_proxy(Dependency.new("RubyGems\0", spec.required_rubygems_version), platform) end dependencies end diff --git a/lib/bundler/runtime.rb b/lib/bundler/runtime.rb index c7276b0e25..fc644cca78 100644 --- a/lib/bundler/runtime.rb +++ b/lib/bundler/runtime.rb @@ -125,7 +125,6 @@ module Bundler specs_to_cache.each do |spec| next if spec.name == "bundler" next if spec.source.is_a?(Source::Gemspec) - spec.source.send(:fetch_gem, spec) if Bundler.settings[:cache_all_platforms] && spec.source.respond_to?(:fetch_gem, true) spec.source.cache(spec, custom_path) if spec.source.respond_to?(:cache) end diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb index 04ba4a654c..a50934b315 100644 --- a/lib/bundler/source/rubygems.rb +++ b/lib/bundler/source/rubygems.rb @@ -153,13 +153,11 @@ module Bundler # Check for this spec from other sources uris = [spec.remote, *remotes_for_spec(spec)].map(&:anonymized_uri).uniq Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1 - - path = fetch_gem(spec, options[:previous_spec]) - else - path = cached_gem(spec) - raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path end + path = fetch_gem_if_possible(spec, options[:previous_spec]) + raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path + return if Bundler.settings[:no_install] if requires_sudo? @@ -242,7 +240,7 @@ module Bundler end def cache(spec, custom_path = nil) - cached_path = cached_gem(spec) + cached_path = Bundler.settings[:cache_all_platforms] ? fetch_gem_if_possible(spec) : cached_gem(spec) raise GemNotFound, "Missing gem file '#{spec.file_name}'." unless cached_path return if File.dirname(cached_path) == Bundler.app_cache.to_s Bundler.ui.info " * #{File.basename(cached_path)}" @@ -462,6 +460,14 @@ module Bundler end end + def fetch_gem_if_possible(spec, previous_spec = nil) + if spec.remote + fetch_gem(spec, previous_spec) + else + cached_gem(spec) + end + end + def fetch_gem(spec, previous_spec = nil) spec.fetch_platform diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 2df14fbb09..3ff7342981 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -30,7 +30,7 @@ module Bundler specs_for_dep.first.dependencies.each do |d| next if d.type == :development - d = DepProxy.get_proxy(d, dep.__platform) unless match_current_platform + d = DepProxy.get_proxy(Dependency.new(d.name, d.requirement), dep.__platform) unless match_current_platform deps << d end elsif check @@ -178,7 +178,7 @@ module Bundler if match_current_platform GemHelpers.select_best_platform_match(specs_for_name.select {|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform) else - specs_for_name_and_platform = GemHelpers.select_best_platform_match(specs_for_name, dep.__platform) + specs_for_name_and_platform = GemHelpers.select_best_platform_match(specs_for_name, dep.force_ruby_platform ? Gem::Platform::RUBY : dep.__platform) specs_for_name_and_platform.any? ? specs_for_name_and_platform : specs_for_name end end diff --git a/lib/bundler/version.rb b/lib/bundler/version.rb index efb0162ea3..700187452d 100644 --- a/lib/bundler/version.rb +++ b/lib/bundler/version.rb @@ -1,7 +1,7 @@ # frozen_string_literal: false module Bundler - VERSION = "2.3.17".freeze + VERSION = "2.3.18".freeze def self.bundler_major_version @bundler_major_version ||= VERSION.split(".").first.to_i diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 00169ba587..4fdc061e83 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -8,7 +8,7 @@ require 'rbconfig' module Gem - VERSION = "3.3.17".freeze + VERSION = "3.3.18".freeze end # Must be first since it unloads the prelude from 1.9.2 diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index 84e9210cfb..35b500936d 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -365,10 +365,11 @@ By default, this RubyGems will install gem as: bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") } - # Remove bundler-*.gemspec in default specification directory. - Dir.entries(specs_dir). - select {|gs| gs.start_with?("bundler-") }. - each {|gs| File.delete(File.join(specs_dir, gs)) } + current_default_spec = Gem::Specification.default_stubs.find {|s| s.name == "bundler" } + if current_default_spec + File.delete(current_default_spec.loaded_from) + Gem::Specification.remove_spec current_default_spec + end default_spec_path = File.join(specs_dir, "#{bundler_spec.full_name}.gemspec") Gem.write_binary(default_spec_path, bundler_spec.to_ruby) diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb index 54b1251010..4080bf5feb 100644 --- a/lib/rubygems/commands/update_command.rb +++ b/lib/rubygems/commands/update_command.rb @@ -118,15 +118,19 @@ command to remove old versions. updated = update_gems gems_to_update + installed_names = highest_installed_gems.keys updated_names = updated.map {|spec| spec.name } not_updated_names = options[:args].uniq - updated_names + not_installed_names = not_updated_names - installed_names + up_to_date_names = not_updated_names - not_installed_names if updated.empty? say "Nothing to update" else say "Gems updated: #{updated_names.join(' ')}" - say "Gems already up-to-date: #{not_updated_names.join(' ')}" unless not_updated_names.empty? end + say "Gems already up-to-date: #{up_to_date_names.join(' ')}" unless up_to_date_names.empty? + say "Gems not currently installed: #{not_installed_names.join(' ')}" unless not_installed_names.empty? end def fetch_remote_gems(spec) # :nodoc: diff --git a/lib/rubygems/gem_runner.rb b/lib/rubygems/gem_runner.rb index 89b23b26aa..b3f925773b 100644 --- a/lib/rubygems/gem_runner.rb +++ b/lib/rubygems/gem_runner.rb @@ -10,11 +10,6 @@ require_relative 'command_manager' require_relative 'deprecate' ## -# Load additional plugins from $LOAD_PATH - -Gem.load_env_plugins rescue nil - -## # Run an instance of the gem program. # # Gem::GemRunner is only intended for internal use by RubyGems itself. It @@ -37,6 +32,9 @@ class Gem::GemRunner do_configuration args + Gem.load_env_plugins rescue nil + Gem.load_plugins + cmd = @command_manager_class.instance cmd.command_names.each do |command_name| @@ -75,5 +73,3 @@ class Gem::GemRunner Gem::Command.extra_args = Gem.configuration[:gem] end end - -Gem.load_plugins diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index 0613399890..7484145467 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -340,7 +340,7 @@ class Gem::Installer say spec.post_install_message if options[:post_install_message] && !spec.post_install_message.nil? - Gem::Specification.reset + Gem::Specification.add_spec(spec) run_post_install_hooks diff --git a/lib/rubygems/platform.rb b/lib/rubygems/platform.rb index f48f4bdc76..8fcabf164d 100644 --- a/lib/rubygems/platform.rb +++ b/lib/rubygems/platform.rb @@ -159,6 +159,10 @@ class Gem::Platform def ===(other) return nil unless Gem::Platform === other + # universal-mingw32 matches x64-mingw-ucrt + return true if (@cpu == 'universal' or other.cpu == 'universal') and + @os.start_with?('mingw') and other.os.start_with?('mingw') + # cpu ([nil,'universal'].include?(@cpu) or [nil, 'universal'].include?(other.cpu) or @cpu == other.cpu or (@cpu == 'arm' and other.cpu.start_with?("arm"))) and diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 01aa8fd942..0ced1d9020 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -884,6 +884,30 @@ class Gem::Specification < Gem::BasicSpecification end ## + # Adds +spec+ to the known specifications, keeping the collection + # properly sorted. + + def self.add_spec(spec) + return if _all.include? spec + + _all << spec + stubs << spec + (@@stubs_by_name[spec.name] ||= []) << spec + + _resort!(@@stubs_by_name[spec.name]) + _resort!(stubs) + end + + ## + # Removes +spec+ from the known specs. + + def self.remove_spec(spec) + _all.delete spec.to_spec + stubs.delete spec + (@@stubs_by_name[spec.name] || []).delete spec + end + + ## # Returns all specifications. This method is discouraged from use. # You probably want to use one of the Enumerable methods instead. |