From e1c93f70acda94ce5d3d7bfabe39b7163e63bf3a Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Wed, 18 Mar 2026 14:27:22 +0100 Subject: [PATCH 01/21] Merge pull request #9366 from Shopify/ec-bundler-checksum Lock the checksum of Bundler itself in the lockfile (cherry picked from commit 44f4b152f1db38893d302a9bab131546b495cdac) --- bundler/lib/bundler/definition.rb | 2 ++ bundler/lib/bundler/lockfile_generator.rb | 15 ++++++++++++++- bundler/lib/bundler/lockfile_parser.rb | 9 ++++++++- bundler/lib/bundler/source/metadata.rb | 4 ++++ bundler/spec/commands/update_spec.rb | 3 +++ bundler/spec/support/checksums.rb | 4 ++-- 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/bundler/lib/bundler/definition.rb b/bundler/lib/bundler/definition.rb index d9abc85d228f..69842b4813fa 100644 --- a/bundler/lib/bundler/definition.rb +++ b/bundler/lib/bundler/definition.rb @@ -988,6 +988,8 @@ def converge_sources end end + sources.metadata_source.checksum_store.merge!(@locked_gems.metadata_source.checksum_store) if @locked_gems + changes end diff --git a/bundler/lib/bundler/lockfile_generator.rb b/bundler/lib/bundler/lockfile_generator.rb index 6b6cf9d9eaee..e23263048c76 100644 --- a/bundler/lib/bundler/lockfile_generator.rb +++ b/bundler/lib/bundler/lockfile_generator.rb @@ -71,7 +71,8 @@ def add_checksums checksums = definition.resolve.map do |spec| spec.source.checksum_store.to_lock(spec) end - add_section("CHECKSUMS", checksums) + + add_section("CHECKSUMS", checksums + bundler_checksum) end def add_locked_ruby_version @@ -100,5 +101,17 @@ def add_section(name, value) raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile" end end + + def bundler_checksum + return [] if Bundler.gem_version.to_s.end_with?(".dev") + + require "rubygems/package" + + bundler_spec = definition.sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last + package = Gem::Package.new(bundler_spec.cache_file) + definition.sources.metadata_source.checksum_store.register(bundler_spec, Checksum.from_gem_package(package)) + + [definition.sources.metadata_source.checksum_store.to_lock(bundler_spec)] + end end end diff --git a/bundler/lib/bundler/lockfile_parser.rb b/bundler/lib/bundler/lockfile_parser.rb index ac0ce1ef3d0a..a837f994cd90 100644 --- a/bundler/lib/bundler/lockfile_parser.rb +++ b/bundler/lib/bundler/lockfile_parser.rb @@ -28,6 +28,7 @@ def to_s attr_reader( :sources, + :metadata_source, :dependencies, :specs, :platforms, @@ -97,6 +98,7 @@ def self.bundled_with def initialize(lockfile, strict: false) @platforms = [] @sources = [] + @metadata_source = Source::Metadata.new @dependencies = {} @parse_method = nil @specs = {} @@ -252,7 +254,12 @@ def parse_checksum(line) version = Gem::Version.new(version) platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY full_name = Gem::NameTuple.new(name, version, platform).full_name - return unless spec = @specs[full_name] + spec = @specs[full_name] + + if name == "bundler" + spec ||= LazySpecification.new(name, version, platform, @metadata_source) + end + return unless spec if checksums checksums.split(",") do |lock_checksum| diff --git a/bundler/lib/bundler/source/metadata.rb b/bundler/lib/bundler/source/metadata.rb index fd959cd64ee2..ecf889518715 100644 --- a/bundler/lib/bundler/source/metadata.rb +++ b/bundler/lib/bundler/source/metadata.rb @@ -58,6 +58,10 @@ def hash def version_message(spec) "#{spec.name} #{spec.version}" end + + def checksum_store + @checksum_store ||= Checksum::Store.new + end end end end diff --git a/bundler/spec/commands/update_spec.rb b/bundler/spec/commands/update_spec.rb index cdaeb75c4a33..3fc6bd38e41a 100644 --- a/bundler/spec/commands/update_spec.rb +++ b/bundler/spec/commands/update_spec.rb @@ -1537,6 +1537,7 @@ checksums = checksums_section do |c| c.checksum(gem_repo4, "myrack", "1.0") + c.checksum(gem_repo4, "bundler", "999.0.0") end install_gemfile <<-G @@ -1621,6 +1622,7 @@ checksums = checksums_section do |c| c.checksum(gem_repo4, "myrack", "1.0") + c.checksum(gem_repo4, "bundler", "9.9.9") end install_gemfile <<-G @@ -1745,6 +1747,7 @@ # Only updates properly on modern RubyGems. checksums = checksums_section_when_enabled do |c| c.checksum(gem_repo4, "myrack", "1.0") + c.checksum(local_gem_path, "bundler", "9.0.0", Gem::Platform::RUBY, "cache") end expect(lockfile).to eq <<~L diff --git a/bundler/spec/support/checksums.rb b/bundler/spec/support/checksums.rb index cf8ea417d67a..03147bf6f463 100644 --- a/bundler/spec/support/checksums.rb +++ b/bundler/spec/support/checksums.rb @@ -14,9 +14,9 @@ def initialize_copy(original) @checksums = @checksums.dup end - def checksum(repo, name, version, platform = Gem::Platform::RUBY) + def checksum(repo, name, version, platform = Gem::Platform::RUBY, folder = "gems") name_tuple = Gem::NameTuple.new(name, version, platform) - gem_file = File.join(repo, "gems", "#{name_tuple.full_name}.gem") + gem_file = File.join(repo, folder, "#{name_tuple.full_name}.gem") File.open(gem_file, "rb") do |f| register(name_tuple, Bundler::Checksum.from_gem(f, "#{gem_file} (via ChecksumsBuilder#checksum)")) end From 25e5f41302fa23928fcea7d5efeeaa51f9b0cc4c Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Tue, 31 Mar 2026 15:03:35 +0200 Subject: [PATCH 02/21] Merge pull request #9436 from Shopify/ec-try-checksum-on-dev Ensure the release CI doesn't break due to the Bundler checksum feature (cherry picked from commit 9baf3e0d39d3e38225de5457deb95dae7a77e26f) --- Rakefile | 2 +- bundler/lib/bundler/lockfile_generator.rb | 4 +++- bundler/spec/commands/lock_spec.rb | 9 +++++---- bundler/spec/commands/update_spec.rb | 5 ++--- bundler/spec/runtime/setup_spec.rb | 2 +- bundler/spec/support/checksums.rb | 15 ++++++++++++--- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Rakefile b/Rakefile index d65d1fd50d67..0a839ef16d36 100644 --- a/Rakefile +++ b/Rakefile @@ -34,7 +34,7 @@ namespace :version do version = stdout.split(" ").last Dir.glob("{tool/bundler/*_gems.rb,bundler/spec/realworld/fixtures/*/Gemfile}").each do |file| - Spec::Rubygems.dev_bundle("update", "--bundler", version, gemfile: file) + Spec::Rubygems.dev_bundle("lock", "--bundler", version, gemfile: file) end end diff --git a/bundler/lib/bundler/lockfile_generator.rb b/bundler/lib/bundler/lockfile_generator.rb index e23263048c76..b56ae2e2b104 100644 --- a/bundler/lib/bundler/lockfile_generator.rb +++ b/bundler/lib/bundler/lockfile_generator.rb @@ -105,9 +105,11 @@ def add_section(name, value) def bundler_checksum return [] if Bundler.gem_version.to_s.end_with?(".dev") + bundler_spec = definition.sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last + return [] unless File.exist?(bundler_spec.cache_file) + require "rubygems/package" - bundler_spec = definition.sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last package = Gem::Package.new(bundler_spec.cache_file) definition.sources.metadata_source.checksum_store.register(bundler_spec, Checksum.from_gem_package(package)) diff --git a/bundler/spec/commands/lock_spec.rb b/bundler/spec/commands/lock_spec.rb index c8af9c8dd404..f7705740f00d 100644 --- a/bundler/spec/commands/lock_spec.rb +++ b/bundler/spec/commands/lock_spec.rb @@ -2295,6 +2295,10 @@ bundle("lock --add-checksums", artifice: "endpoint") + checksums = checksums_section_when_enabled do |c| + c.no_checksum "warning", "18.0.0" + end + expect(lockfile).to eq <<~L GEM remote: https://gem.repo4/ @@ -2306,10 +2310,7 @@ DEPENDENCIES warning - - CHECKSUMS - warning (18.0.0) - + #{checksums} BUNDLED WITH #{Bundler::VERSION} L diff --git a/bundler/spec/commands/update_spec.rb b/bundler/spec/commands/update_spec.rb index 3fc6bd38e41a..d30eef4c61f9 100644 --- a/bundler/spec/commands/update_spec.rb +++ b/bundler/spec/commands/update_spec.rb @@ -1419,9 +1419,7 @@ #{lockfile_platforms} DEPENDENCIES - - CHECKSUMS - + #{checksums_section_when_enabled} RUBY VERSION #{Bundler::RubyVersion.system} @@ -1708,6 +1706,7 @@ checksums = checksums_section_when_enabled do |c| c.checksum(gem_repo4, "myrack", "1.0") end + checksums.delete("bundler") expect(lockfile).to eq <<~L GEM diff --git a/bundler/spec/runtime/setup_spec.rb b/bundler/spec/runtime/setup_spec.rb index 1ffaffef0ed2..694ef7f5183f 100644 --- a/bundler/spec/runtime/setup_spec.rb +++ b/bundler/spec/runtime/setup_spec.rb @@ -1329,7 +1329,7 @@ def lock_with(ruby_version = nil) gem "bar", :git => "#{lib_path("bar-1.0")}" G - bundle :install + bundle :install, env: { "BUNDLE_LOCKFILE_CHECKSUMS" => "false" } ruby <<-RUBY, artifice: nil require 'bundler/setup' diff --git a/bundler/spec/support/checksums.rb b/bundler/spec/support/checksums.rb index 03147bf6f463..7b69bba6680b 100644 --- a/bundler/spec/support/checksums.rb +++ b/bundler/spec/support/checksums.rb @@ -3,6 +3,8 @@ module Spec module Checksums class ChecksumsBuilder + attr_reader :bundler_registered + def initialize(enabled = true, &block) @enabled = enabled @checksums = {} @@ -15,6 +17,8 @@ def initialize_copy(original) end def checksum(repo, name, version, platform = Gem::Platform::RUBY, folder = "gems") + @bundler_registered = true if name == "bundler" + name_tuple = Gem::NameTuple.new(name, version, platform) gem_file = File.join(repo, folder, "#{name_tuple.full_name}.gem") File.open(gem_file, "rb") do |f| @@ -50,8 +54,13 @@ def register(name_tuple, checksum) end end - def checksums_section(enabled = true, &block) - ChecksumsBuilder.new(enabled, &block) + def checksums_section(enabled = true, bundler_checksum: true, &block) + ChecksumsBuilder.new(enabled, &block).tap do |builder| + next if builder.bundler_registered || !bundler_checksum + + next if Bundler::VERSION.to_s.end_with?(".dev") + builder.checksum(system_gem_path, "bundler", Bundler::VERSION, Gem::Platform::RUBY, "cache") + end end def checksums_section_when_enabled(target_lockfile = nil, &block) @@ -64,7 +73,7 @@ def checksums_section_when_enabled(target_lockfile = nil, &block) end def checksum_to_lock(*args) - checksums_section do |c| + checksums_section(true, bundler_checksum: false) do |c| c.checksum(*args) end.to_s.sub(/^CHECKSUMS\n/, "").strip end From a59338cd5c061da54657c41126e7f5f2d3d6c13e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 02:53:05 +0000 Subject: [PATCH 03/21] Fix inconsistent indentation at line 481 in git_spec.rb Agent-Logs-Url: https://github.com/ruby/rubygems/sessions/a9efe3b4-99c9-4af2-9954-a65a2859edfc Co-authored-by: hsbt <12301+hsbt@users.noreply.github.com> (cherry picked from commit 3d4e90a35598444d45ae3358a129e4901eef6dd8) --- bundler/spec/install/gemfile/git_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundler/spec/install/gemfile/git_spec.rb b/bundler/spec/install/gemfile/git_spec.rb index d31e3f4ba311..82b991d70eed 100644 --- a/bundler/spec/install/gemfile/git_spec.rb +++ b/bundler/spec/install/gemfile/git_spec.rb @@ -478,7 +478,7 @@ update_git("foo", path: repo, tag: tag) install_gemfile <<-G - source "https://gem.repo1" + source "https://gem.repo1" git "#{repo}", :tag => #{tag.dump} do gem "foo" end From 332823999b9cb0ea7a2936bb231e406ce3cf7e4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 03:53:29 +0000 Subject: [PATCH 04/21] Fix lockfile DEPENDENCIES section to use 'rubocop' instead of 'parallel_tests' Agent-Logs-Url: https://github.com/ruby/rubygems/sessions/dd120552-e56f-4a0e-9143-ec483aa07bfc Co-authored-by: hsbt <12301+hsbt@users.noreply.github.com> (cherry picked from commit 56a98274c3f262044fc43beaf2d52b4b50702fb0) --- bundler/spec/install/gems/resolving_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundler/spec/install/gems/resolving_spec.rb b/bundler/spec/install/gems/resolving_spec.rb index e6a395a66963..111d361aab9c 100644 --- a/bundler/spec/install/gems/resolving_spec.rb +++ b/bundler/spec/install/gems/resolving_spec.rb @@ -358,7 +358,7 @@ #{lockfile_platforms} DEPENDENCIES - parallel_tests + rubocop #{checksums} BUNDLED WITH #{Bundler::VERSION} From 85b32fa879afe44950efd02355801eb87a69363a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 03:54:18 +0000 Subject: [PATCH 05/21] Fix test_execute_allowed_push_host response message to match freebird gem Agent-Logs-Url: https://github.com/ruby/rubygems/sessions/61efd9ab-67d3-4ce2-b81d-4b6e8ef07f99 Co-authored-by: hsbt <12301+hsbt@users.noreply.github.com> (cherry picked from commit bf73b51866015c73321fefb54256e3cf01cc80e2) --- test/rubygems/test_gem_commands_push_command.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rubygems/test_gem_commands_push_command.rb b/test/rubygems/test_gem_commands_push_command.rb index 978ed3ada88e..b862d0d96d0d 100644 --- a/test/rubygems/test_gem_commands_push_command.rb +++ b/test/rubygems/test_gem_commands_push_command.rb @@ -148,7 +148,7 @@ def test_execute_allowed_push_host spec.metadata["allowed_push_host"] = "https://privategemserver.example" end - @response = "Successfully registered gem: freewill (1.0.0)" + @response = "Successfully registered gem: freebird (1.0.1)" @fetcher.data["#{@spec.metadata["allowed_push_host"]}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK") @fetcher.data["#{Gem.host}/api/v1/gems"] = ["fail", 500, "Internal Server Error"] From b260d2e40bdee17303662fc361d34d572d79bff1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 03:54:56 +0000 Subject: [PATCH 06/21] Fix typo in test description: 'to' -> 'do' Agent-Logs-Url: https://github.com/ruby/rubygems/sessions/9cf2fa2e-02a9-4dde-a833-8ad11974e1eb Co-authored-by: hsbt <12301+hsbt@users.noreply.github.com> (cherry picked from commit 5ac4c8400bfb9a8b643878740369a18bc4e6e302) --- bundler/spec/install/gemfile/git_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundler/spec/install/gemfile/git_spec.rb b/bundler/spec/install/gemfile/git_spec.rb index 82b991d70eed..89172fdf10a6 100644 --- a/bundler/spec/install/gemfile/git_spec.rb +++ b/bundler/spec/install/gemfile/git_spec.rb @@ -1078,7 +1078,7 @@ expect(out).to eq("WIN") end - it "does not to a remote fetch if the revision is cached locally" do + it "does not do a remote fetch if the revision is cached locally" do build_git "foo" install_gemfile <<-G From c381a1605d67ab24e596c21bcb18b9b1de0ec39a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 04:36:18 +0000 Subject: [PATCH 07/21] Use distinct gemspec filenames in stub_with_version and stub_without_version helpers Agent-Logs-Url: https://github.com/ruby/rubygems/sessions/4028db0e-e050-48af-9704-4219653a4753 Co-authored-by: hsbt <12301+hsbt@users.noreply.github.com> (cherry picked from commit 951ef62f764d87576cf45fa3cd297ea6162ca5a1) --- test/rubygems/test_gem_stub_specification.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/rubygems/test_gem_stub_specification.rb b/test/rubygems/test_gem_stub_specification.rb index f04b36dbf86c..6c07480c7fd4 100644 --- a/test/rubygems/test_gem_stub_specification.rb +++ b/test/rubygems/test_gem_stub_specification.rb @@ -221,7 +221,7 @@ def test_to_spec_with_other_specs_loaded_does_not_warn end def stub_with_version - spec = File.join @gemhome, "specifications", "stub_e-2.gemspec" + spec = File.join @gemhome, "specifications", "stub_v-with-version.gemspec" File.open spec, "w" do |io| io.write <<~STUB # -*- encoding: utf-8 -*- @@ -244,7 +244,7 @@ def stub_with_version end def stub_without_version - spec = File.join @gemhome, "specifications", "stub-2.gemspec" + spec = File.join @gemhome, "specifications", "stub_v-without-version.gemspec" File.open spec, "w" do |io| io.write <<~STUB # -*- encoding: utf-8 -*- From 0237aec84e321441cf7f0d3c63069c45995f0ab4 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 8 Apr 2026 14:16:09 +0900 Subject: [PATCH 08/21] Fix grammar in gem installer cache comment Change "and lock the mutex" to "and to lock the mutex" for correct parallel infinitive structure. Co-Authored-By: Claude Opus 4.6 (1M context) (cherry picked from commit 94f9267b7264cb16f4bafa7c785f64e7d082f539) --- bundler/lib/bundler/source/rubygems.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundler/lib/bundler/source/rubygems.rb b/bundler/lib/bundler/source/rubygems.rb index 5a77d6448eb0..4fb35c18bf4f 100644 --- a/bundler/lib/bundler/source/rubygems.rb +++ b/bundler/lib/bundler/source/rubygems.rb @@ -508,7 +508,7 @@ def extension_cache_slug(spec) # We are using a mutex to reaed and write from/to the hash. # The reason this double synchronization was added is for performance - # and lock the mutex for the shortest possible amount of time. Otherwise, + # and to lock the mutex for the shortest possible amount of time. Otherwise, # all threads are fighting over this mutex and when it gets acquired it gets locked # until a threads finishes downloading a gem, leaving the other threads waiting # doing nothing. From 4f0c707c096fbb239b498f010deed41145356f7a Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Wed, 8 Apr 2026 23:15:05 +0200 Subject: [PATCH 09/21] Merge pull request #9463 from Shopify/ec-lock Fix the bundler version not being updated in dev/test lockfile (cherry picked from commit 4758fb59f8f83695aac41e7dd1034c9042424a66) --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 0a839ef16d36..d1e0f2e17dfa 100644 --- a/Rakefile +++ b/Rakefile @@ -29,12 +29,12 @@ end namespace :version do desc "Update the locked bundler version in dev environment" - task update_locked_bundler: [:"bundler:install"] do |_, _args| + task :update_locked_bundler do |_, _args| stdout = Spec::Rubygems.dev_bundle "--version" version = stdout.split(" ").last Dir.glob("{tool/bundler/*_gems.rb,bundler/spec/realworld/fixtures/*/Gemfile}").each do |file| - Spec::Rubygems.dev_bundle("lock", "--bundler", version, gemfile: file) + Spec::Rubygems.dev_bundle("lock", "--update", "--bundler", version, gemfile: file) end end From 8b62470475f16bd952d00351d40d7194a81c5be2 Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Fri, 10 Apr 2026 17:41:41 +0200 Subject: [PATCH 10/21] Merge pull request #9474 from toy/patch-1 fix formatting for BUNDLE_PREFER_PATCH variable in man page (cherry picked from commit a3d2d2c29f5f46c9f679d47d4556c8fd6e998713) --- bundler/lib/bundler/man/bundle-add.1 | 2 +- bundler/lib/bundler/man/bundle-binstubs.1 | 2 +- bundler/lib/bundler/man/bundle-cache.1 | 2 +- bundler/lib/bundler/man/bundle-check.1 | 2 +- bundler/lib/bundler/man/bundle-clean.1 | 2 +- bundler/lib/bundler/man/bundle-config.1 | 4 ++-- bundler/lib/bundler/man/bundle-config.1.ronn | 2 +- bundler/lib/bundler/man/bundle-console.1 | 2 +- bundler/lib/bundler/man/bundle-doctor.1 | 2 +- bundler/lib/bundler/man/bundle-env.1 | 2 +- bundler/lib/bundler/man/bundle-exec.1 | 2 +- bundler/lib/bundler/man/bundle-fund.1 | 2 +- bundler/lib/bundler/man/bundle-gem.1 | 2 +- bundler/lib/bundler/man/bundle-help.1 | 2 +- bundler/lib/bundler/man/bundle-info.1 | 2 +- bundler/lib/bundler/man/bundle-init.1 | 2 +- bundler/lib/bundler/man/bundle-install.1 | 2 +- bundler/lib/bundler/man/bundle-issue.1 | 2 +- bundler/lib/bundler/man/bundle-licenses.1 | 2 +- bundler/lib/bundler/man/bundle-list.1 | 2 +- bundler/lib/bundler/man/bundle-lock.1 | 2 +- bundler/lib/bundler/man/bundle-open.1 | 2 +- bundler/lib/bundler/man/bundle-outdated.1 | 2 +- bundler/lib/bundler/man/bundle-platform.1 | 2 +- bundler/lib/bundler/man/bundle-plugin.1 | 2 +- bundler/lib/bundler/man/bundle-pristine.1 | 2 +- bundler/lib/bundler/man/bundle-remove.1 | 2 +- bundler/lib/bundler/man/bundle-show.1 | 2 +- bundler/lib/bundler/man/bundle-update.1 | 2 +- bundler/lib/bundler/man/bundle-version.1 | 2 +- bundler/lib/bundler/man/bundle.1 | 2 +- bundler/lib/bundler/man/gemfile.5 | 2 +- 32 files changed, 33 insertions(+), 33 deletions(-) diff --git a/bundler/lib/bundler/man/bundle-add.1 b/bundler/lib/bundler/man/bundle-add.1 index 89771d343340..f49d8e568c9b 100644 --- a/bundler/lib/bundler/man/bundle-add.1 +++ b/bundler/lib/bundler/man/bundle-add.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-ADD" "1" "March 2026" "" +.TH "BUNDLE\-ADD" "1" "April 2026" "" .SH "NAME" \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-binstubs.1 b/bundler/lib/bundler/man/bundle-binstubs.1 index 2a78f530ccef..9dbd4f1d3a1f 100644 --- a/bundler/lib/bundler/man/bundle-binstubs.1 +++ b/bundler/lib/bundler/man/bundle-binstubs.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-BINSTUBS" "1" "March 2026" "" +.TH "BUNDLE\-BINSTUBS" "1" "April 2026" "" .SH "NAME" \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-cache.1 b/bundler/lib/bundler/man/bundle-cache.1 index a2b0fc6dff19..e2052ab0ac16 100644 --- a/bundler/lib/bundler/man/bundle-cache.1 +++ b/bundler/lib/bundler/man/bundle-cache.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-CACHE" "1" "March 2026" "" +.TH "BUNDLE\-CACHE" "1" "April 2026" "" .SH "NAME" \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-check.1 b/bundler/lib/bundler/man/bundle-check.1 index d03b4dc6bdd2..825a2889d57a 100644 --- a/bundler/lib/bundler/man/bundle-check.1 +++ b/bundler/lib/bundler/man/bundle-check.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-CHECK" "1" "March 2026" "" +.TH "BUNDLE\-CHECK" "1" "April 2026" "" .SH "NAME" \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-clean.1 b/bundler/lib/bundler/man/bundle-clean.1 index 13bd586f4865..0eae33d08d19 100644 --- a/bundler/lib/bundler/man/bundle-clean.1 +++ b/bundler/lib/bundler/man/bundle-clean.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-CLEAN" "1" "March 2026" "" +.TH "BUNDLE\-CLEAN" "1" "April 2026" "" .SH "NAME" \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-config.1 b/bundler/lib/bundler/man/bundle-config.1 index ed66ba9a4817..b6df2ce77be0 100644 --- a/bundler/lib/bundler/man/bundle-config.1 +++ b/bundler/lib/bundler/man/bundle-config.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-CONFIG" "1" "March 2026" "" +.TH "BUNDLE\-CONFIG" "1" "April 2026" "" .SH "NAME" \fBbundle\-config\fR \- Set bundler configuration options .SH "SYNOPSIS" @@ -172,7 +172,7 @@ Whether Bundler will install gems into the default system path (\fBGem\.dir\fR)\ \fBplugins\fR (\fBBUNDLE_PLUGINS\fR) Enable Bundler's experimental plugin system\. .TP -\fBprefer_patch\fR (BUNDLE_PREFER_PATCH) +\fBprefer_patch\fR (\fBBUNDLE_PREFER_PATCH\fR) Prefer updating only to next patch version during updates\. Makes \fBbundle update\fR calls equivalent to \fBbundler update \-\-patch\fR\. .TP \fBredirect\fR (\fBBUNDLE_REDIRECT\fR) diff --git a/bundler/lib/bundler/man/bundle-config.1.ronn b/bundler/lib/bundler/man/bundle-config.1.ronn index b70293cfedda..81eb67326b9e 100644 --- a/bundler/lib/bundler/man/bundle-config.1.ronn +++ b/bundler/lib/bundler/man/bundle-config.1.ronn @@ -223,7 +223,7 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html). Whether Bundler will install gems into the default system path (`Gem.dir`). * `plugins` (`BUNDLE_PLUGINS`): Enable Bundler's experimental plugin system. -* `prefer_patch` (BUNDLE_PREFER_PATCH): +* `prefer_patch` (`BUNDLE_PREFER_PATCH`): Prefer updating only to next patch version during updates. Makes `bundle update` calls equivalent to `bundler update --patch`. * `redirect` (`BUNDLE_REDIRECT`): The number of redirects allowed for network requests. Defaults to `5`. diff --git a/bundler/lib/bundler/man/bundle-console.1 b/bundler/lib/bundler/man/bundle-console.1 index 4594cb74be44..c86b90e3bd23 100644 --- a/bundler/lib/bundler/man/bundle-console.1 +++ b/bundler/lib/bundler/man/bundle-console.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-CONSOLE" "1" "March 2026" "" +.TH "BUNDLE\-CONSOLE" "1" "April 2026" "" .SH "NAME" \fBbundle\-console\fR \- Open an IRB session with the bundle pre\-loaded .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-doctor.1 b/bundler/lib/bundler/man/bundle-doctor.1 index e94ebbd8342b..fe9a8a35b9af 100644 --- a/bundler/lib/bundler/man/bundle-doctor.1 +++ b/bundler/lib/bundler/man/bundle-doctor.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-DOCTOR" "1" "March 2026" "" +.TH "BUNDLE\-DOCTOR" "1" "April 2026" "" .SH "NAME" \fBbundle\-doctor\fR \- Checks the bundle for common problems .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-env.1 b/bundler/lib/bundler/man/bundle-env.1 index c57bec014eff..29c4ac2a8e21 100644 --- a/bundler/lib/bundler/man/bundle-env.1 +++ b/bundler/lib/bundler/man/bundle-env.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-ENV" "1" "March 2026" "" +.TH "BUNDLE\-ENV" "1" "April 2026" "" .SH "NAME" \fBbundle\-env\fR \- Print information about the environment Bundler is running under .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-exec.1 b/bundler/lib/bundler/man/bundle-exec.1 index 36fed764aca8..fec7bee39c33 100644 --- a/bundler/lib/bundler/man/bundle-exec.1 +++ b/bundler/lib/bundler/man/bundle-exec.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-EXEC" "1" "March 2026" "" +.TH "BUNDLE\-EXEC" "1" "April 2026" "" .SH "NAME" \fBbundle\-exec\fR \- Execute a command in the context of the bundle .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-fund.1 b/bundler/lib/bundler/man/bundle-fund.1 index 96f182e05f9f..2eb07a6c8d8c 100644 --- a/bundler/lib/bundler/man/bundle-fund.1 +++ b/bundler/lib/bundler/man/bundle-fund.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-FUND" "1" "March 2026" "" +.TH "BUNDLE\-FUND" "1" "April 2026" "" .SH "NAME" \fBbundle\-fund\fR \- Lists information about gems seeking funding assistance .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-gem.1 b/bundler/lib/bundler/man/bundle-gem.1 index 68c77a03ce18..bdb84faebdd0 100644 --- a/bundler/lib/bundler/man/bundle-gem.1 +++ b/bundler/lib/bundler/man/bundle-gem.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-GEM" "1" "March 2026" "" +.TH "BUNDLE\-GEM" "1" "April 2026" "" .SH "NAME" \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-help.1 b/bundler/lib/bundler/man/bundle-help.1 index 17e1d4a90449..6e6ad14624d7 100644 --- a/bundler/lib/bundler/man/bundle-help.1 +++ b/bundler/lib/bundler/man/bundle-help.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-HELP" "1" "March 2026" "" +.TH "BUNDLE\-HELP" "1" "April 2026" "" .SH "NAME" \fBbundle\-help\fR \- Displays detailed help for each subcommand .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-info.1 b/bundler/lib/bundler/man/bundle-info.1 index 50f5e36f18c1..b18b70309c50 100644 --- a/bundler/lib/bundler/man/bundle-info.1 +++ b/bundler/lib/bundler/man/bundle-info.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-INFO" "1" "March 2026" "" +.TH "BUNDLE\-INFO" "1" "April 2026" "" .SH "NAME" \fBbundle\-info\fR \- Show information for the given gem in your bundle .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-init.1 b/bundler/lib/bundler/man/bundle-init.1 index 14fd0a73cb4c..5ea1c3b47837 100644 --- a/bundler/lib/bundler/man/bundle-init.1 +++ b/bundler/lib/bundler/man/bundle-init.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-INIT" "1" "March 2026" "" +.TH "BUNDLE\-INIT" "1" "April 2026" "" .SH "NAME" \fBbundle\-init\fR \- Generates a Gemfile into the current working directory .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-install.1 b/bundler/lib/bundler/man/bundle-install.1 index 1d52335644f4..c2f9bfeea1f7 100644 --- a/bundler/lib/bundler/man/bundle-install.1 +++ b/bundler/lib/bundler/man/bundle-install.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-INSTALL" "1" "March 2026" "" +.TH "BUNDLE\-INSTALL" "1" "April 2026" "" .SH "NAME" \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-issue.1 b/bundler/lib/bundler/man/bundle-issue.1 index 7e2fcaf0fa5e..e99cf67638f3 100644 --- a/bundler/lib/bundler/man/bundle-issue.1 +++ b/bundler/lib/bundler/man/bundle-issue.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-ISSUE" "1" "March 2026" "" +.TH "BUNDLE\-ISSUE" "1" "April 2026" "" .SH "NAME" \fBbundle\-issue\fR \- Get help reporting Bundler issues .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-licenses.1 b/bundler/lib/bundler/man/bundle-licenses.1 index 9170fecd7351..eb5f7203ec1d 100644 --- a/bundler/lib/bundler/man/bundle-licenses.1 +++ b/bundler/lib/bundler/man/bundle-licenses.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-LICENSES" "1" "March 2026" "" +.TH "BUNDLE\-LICENSES" "1" "April 2026" "" .SH "NAME" \fBbundle\-licenses\fR \- Print the license of all gems in the bundle .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-list.1 b/bundler/lib/bundler/man/bundle-list.1 index 165a99bb58a2..69276822d2cd 100644 --- a/bundler/lib/bundler/man/bundle-list.1 +++ b/bundler/lib/bundler/man/bundle-list.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-LIST" "1" "March 2026" "" +.TH "BUNDLE\-LIST" "1" "April 2026" "" .SH "NAME" \fBbundle\-list\fR \- List all the gems in the bundle .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-lock.1 b/bundler/lib/bundler/man/bundle-lock.1 index 426e80ec77e1..ba1915af2e15 100644 --- a/bundler/lib/bundler/man/bundle-lock.1 +++ b/bundler/lib/bundler/man/bundle-lock.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-LOCK" "1" "March 2026" "" +.TH "BUNDLE\-LOCK" "1" "April 2026" "" .SH "NAME" \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-open.1 b/bundler/lib/bundler/man/bundle-open.1 index caeb22384439..99166e8580f4 100644 --- a/bundler/lib/bundler/man/bundle-open.1 +++ b/bundler/lib/bundler/man/bundle-open.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-OPEN" "1" "March 2026" "" +.TH "BUNDLE\-OPEN" "1" "April 2026" "" .SH "NAME" \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-outdated.1 b/bundler/lib/bundler/man/bundle-outdated.1 index 7363e27584b5..8cdb5a892b97 100644 --- a/bundler/lib/bundler/man/bundle-outdated.1 +++ b/bundler/lib/bundler/man/bundle-outdated.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-OUTDATED" "1" "March 2026" "" +.TH "BUNDLE\-OUTDATED" "1" "April 2026" "" .SH "NAME" \fBbundle\-outdated\fR \- List installed gems with newer versions available .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-platform.1 b/bundler/lib/bundler/man/bundle-platform.1 index b859ead72f8c..486e2d4406bf 100644 --- a/bundler/lib/bundler/man/bundle-platform.1 +++ b/bundler/lib/bundler/man/bundle-platform.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-PLATFORM" "1" "March 2026" "" +.TH "BUNDLE\-PLATFORM" "1" "April 2026" "" .SH "NAME" \fBbundle\-platform\fR \- Displays platform compatibility information .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-plugin.1 b/bundler/lib/bundler/man/bundle-plugin.1 index 450d3e0862ea..1c3feead7630 100644 --- a/bundler/lib/bundler/man/bundle-plugin.1 +++ b/bundler/lib/bundler/man/bundle-plugin.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-PLUGIN" "1" "March 2026" "" +.TH "BUNDLE\-PLUGIN" "1" "April 2026" "" .SH "NAME" \fBbundle\-plugin\fR \- Manage Bundler plugins .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-pristine.1 b/bundler/lib/bundler/man/bundle-pristine.1 index f8722bff3eac..cbfc51399a70 100644 --- a/bundler/lib/bundler/man/bundle-pristine.1 +++ b/bundler/lib/bundler/man/bundle-pristine.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-PRISTINE" "1" "March 2026" "" +.TH "BUNDLE\-PRISTINE" "1" "April 2026" "" .SH "NAME" \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-remove.1 b/bundler/lib/bundler/man/bundle-remove.1 index df00b8dbdcf0..f8981f9fcfcb 100644 --- a/bundler/lib/bundler/man/bundle-remove.1 +++ b/bundler/lib/bundler/man/bundle-remove.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-REMOVE" "1" "March 2026" "" +.TH "BUNDLE\-REMOVE" "1" "April 2026" "" .SH "NAME" \fBbundle\-remove\fR \- Removes gems from the Gemfile .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-show.1 b/bundler/lib/bundler/man/bundle-show.1 index 4f6109a4a6c0..aaf146fa271b 100644 --- a/bundler/lib/bundler/man/bundle-show.1 +++ b/bundler/lib/bundler/man/bundle-show.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-SHOW" "1" "March 2026" "" +.TH "BUNDLE\-SHOW" "1" "April 2026" "" .SH "NAME" \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-update.1 b/bundler/lib/bundler/man/bundle-update.1 index 9e6076a2c2bf..e5f18f2a1e26 100644 --- a/bundler/lib/bundler/man/bundle-update.1 +++ b/bundler/lib/bundler/man/bundle-update.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-UPDATE" "1" "March 2026" "" +.TH "BUNDLE\-UPDATE" "1" "April 2026" "" .SH "NAME" \fBbundle\-update\fR \- Update your gems to the latest available versions .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle-version.1 b/bundler/lib/bundler/man/bundle-version.1 index bc0cf692b3da..24b5dcef45d7 100644 --- a/bundler/lib/bundler/man/bundle-version.1 +++ b/bundler/lib/bundler/man/bundle-version.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE\-VERSION" "1" "March 2026" "" +.TH "BUNDLE\-VERSION" "1" "April 2026" "" .SH "NAME" \fBbundle\-version\fR \- Prints Bundler version information .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/bundle.1 b/bundler/lib/bundler/man/bundle.1 index c69f0e26bc6f..492de63295a1 100644 --- a/bundler/lib/bundler/man/bundle.1 +++ b/bundler/lib/bundler/man/bundle.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "BUNDLE" "1" "March 2026" "" +.TH "BUNDLE" "1" "April 2026" "" .SH "NAME" \fBbundle\fR \- Ruby Dependency Management .SH "SYNOPSIS" diff --git a/bundler/lib/bundler/man/gemfile.5 b/bundler/lib/bundler/man/gemfile.5 index 2818b1221030..db04250b8b8c 100644 --- a/bundler/lib/bundler/man/gemfile.5 +++ b/bundler/lib/bundler/man/gemfile.5 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.10.1 -.TH "GEMFILE" "5" "March 2026" "" +.TH "GEMFILE" "5" "April 2026" "" .SH "NAME" \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs .SH "SYNOPSIS" From 40669ea43013c581fc3a06200d0ffb0b45a9ec18 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sat, 11 Apr 2026 23:42:41 +0200 Subject: [PATCH 11/21] Clarify the name and meaning of the first argument to `gem spec` (#9476) * GEMFILE sound like Bundler Gemfile but this is unrelated. (cherry picked from commit 3e3addb8d222d23ac46ca3b1959b29b7b93b04db) --- lib/rubygems/commands/specification_command.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/rubygems/commands/specification_command.rb b/lib/rubygems/commands/specification_command.rb index a21ed35be316..7831f6fdbd6c 100644 --- a/lib/rubygems/commands/specification_command.rb +++ b/lib/rubygems/commands/specification_command.rb @@ -42,7 +42,7 @@ def initialize def arguments # :nodoc: <<-ARGS -GEMFILE name of gem to show the gemspec for +GEM_OR_FILE gem name or a .gem file to show the gemspec for FIELD name of gemspec field to show ARGS end @@ -68,7 +68,7 @@ def description # :nodoc: end def usage # :nodoc: - "#{program_name} [GEMFILE] [FIELD]" + "#{program_name} [GEM_OR_FILE] [FIELD]" end def execute @@ -77,7 +77,7 @@ def execute unless gem raise Gem::CommandLineError, - "Please specify a gem name or file on the command line" + "Please specify a gem name or a .gem file on the command line" end case v = options[:version] From c3518ea17d95f5d753d8dbc689414b594fea70f0 Mon Sep 17 00:00:00 2001 From: Matheus Richard Date: Wed, 15 Apr 2026 16:55:33 -0300 Subject: [PATCH 12/21] Add commented-out rubygems_mfa_required to bundle gem template Package registries are active supply chain attack targets. Recent high-profile incidents include the Axios NPM compromise (https://socket.dev/blog/axios-npm-package-compromised) and the LiteLLM PyPI compromise (https://docs.litellm.ai/blog/security-update-march-2026). RubyGems supports an MFA-required opt-in via gemspec metadata: spec.metadata["rubygems_mfa_required"] = "true" but most gems haven't enabled it. A big reason is discoverability. Nothing in the `bundle gem` flow mentions the option, so authors would need to already know it exists to find it. Reference: https://guides.rubygems.org/mfa-requirement-opt-in/ This commit adds a commented-out `spec.metadata["rubygems_mfa_required"] = "true"` line, along with a short explanatory comment and a reference link, to the gemspec template used by `bundle gem`. Default behavior is unchanged because the line is commented out, but every new gem author now sees the MFA opt-in right where they configure their gemspec. Opting in is then a matter of deleting the leading `# `. (cherry picked from commit 2fd3496ce15b77fac1fffc9017c0de68bb7fb9c1) --- bundler/lib/bundler/templates/newgem/newgem.gemspec.tt | 6 ++++++ bundler/spec/commands/newgem_spec.rb | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt b/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt index c705f9eac0c7..fabb308043c9 100644 --- a/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +++ b/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt @@ -22,6 +22,12 @@ Gem::Specification.new do |spec| spec.metadata["changelog_uri"] = "<%= config[:changelog_uri] %>" <%- end -%> + # Uncomment the line below to require MFA for gem pushes. + # This helps protect your gem from supply chain attacks by ensuring + # no one can publish a new version without multi-factor authentication. + # See: https://guides.rubygems.org/mfa-requirement-opt-in/ + # spec.metadata["rubygems_mfa_required"] = "true" + # Specify which files should be added to the gem when it is released. # The `git ls-files -z` loads the files in the RubyGem that have been added into git. gemspec = File.basename(__FILE__) diff --git a/bundler/spec/commands/newgem_spec.rb b/bundler/spec/commands/newgem_spec.rb index 7a6c05fbb0e6..281c7a0ddd30 100644 --- a/bundler/spec/commands/newgem_spec.rb +++ b/bundler/spec/commands/newgem_spec.rb @@ -645,6 +645,15 @@ def create_temporary_dir(dir) to match(/example\.com/) end + it "includes a commented-out rubygems_mfa_required metadata hint" do + bundle "gem #{gem_name}" + + gemspec_contents = bundled_app("#{gem_name}/#{gem_name}.gemspec").read + + expect(gemspec_contents).to include('# spec.metadata["rubygems_mfa_required"] = "true"') + expect(gemspec_contents).to include("https://guides.rubygems.org/mfa-requirement-opt-in/") + end + it "sets a minimum ruby version" do bundle "gem #{gem_name}" From 677f56bf3b7b20b93e7551977e19deabc8da947e Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Fri, 17 Apr 2026 13:27:40 +0200 Subject: [PATCH 13/21] Merge pull request #9477 from nicholasdower/nickd/race Fix installing gems with native extensions + transitive dependencies (cherry picked from commit 49c0aff8bf86f2c9a5925608514e0f4565c56bfc) --- .../bundler/installer/parallel_installer.rb | 30 +++---- .../installer/spec_installation_spec.rb | 79 ++++++++++++------- bundler/spec/commands/install_spec.rb | 42 ++++++++++ 3 files changed, 103 insertions(+), 48 deletions(-) diff --git a/bundler/lib/bundler/installer/parallel_installer.rb b/bundler/lib/bundler/installer/parallel_installer.rb index 020db30b8443..fef326ed0a9c 100644 --- a/bundler/lib/bundler/installer/parallel_installer.rb +++ b/bundler/lib/bundler/installer/parallel_installer.rb @@ -6,7 +6,7 @@ module Bundler class ParallelInstaller class SpecInstallation - attr_accessor :spec, :name, :full_name, :post_install_message, :state, :error + attr_accessor :spec, :name, :full_name, :post_install_message, :state, :error, :dependencies def initialize(spec) @spec = spec @name = spec.name @@ -46,25 +46,11 @@ def has_post_install_message? !post_install_message.empty? end - def ignorable_dependency?(dep) - dep.type == :development || dep.name == @name - end - - # Checks installed dependencies against spec's dependencies to make - # sure needed dependencies have been installed. + # Recursively checks that all dependencies (direct and transitive) have been installed. def dependencies_installed?(installed_specs) - dependencies.all? {|d| installed_specs.include? d.name } - end - - # Represents only the non-development dependencies, the ones that are - # itself and are in the total list. - def dependencies - @dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep } - end - - # Represents all dependencies - def all_dependencies - @spec.dependencies + dependencies.all? do |dep| + installed_specs.include?(dep.name) && dep.dependencies_installed?(installed_specs) + end end def to_s @@ -85,6 +71,12 @@ def initialize(installer, all_specs, size, standalone, force, local: false, skip @force = force @local = local @specs = all_specs.map {|s| SpecInstallation.new(s) } + specs_by_name = @specs.to_h {|s| [s.name, s] } + @specs.each do |spec_install| + spec_install.dependencies = spec_install.spec.dependencies.filter_map do |dep| + specs_by_name[dep.name] unless dep.type == :development || dep.name == spec_install.name + end + end @specs.each do |spec_install| spec_install.state = :installed if skip.include?(spec_install.name) end if skip diff --git a/bundler/spec/bundler/installer/spec_installation_spec.rb b/bundler/spec/bundler/installer/spec_installation_spec.rb index cbe2589b99b7..57868766d9b3 100644 --- a/bundler/spec/bundler/installer/spec_installation_spec.rb +++ b/bundler/spec/bundler/installer/spec_installation_spec.rb @@ -3,18 +3,17 @@ require "bundler/installer/parallel_installer" RSpec.describe Bundler::ParallelInstaller::SpecInstallation do - let!(:dep) do - a_spec = Object.new - def a_spec.name - "I like tests" - end - - def a_spec.full_name - "I really like tests" - end - a_spec + def build_spec(name, extensions: []) + spec = Object.new + spec.define_singleton_method(:name) { name } + spec.define_singleton_method(:full_name) { "#{name}-1.0" } + spec.define_singleton_method(:extensions) { extensions } + spec.define_singleton_method(:dependencies) { [] } + spec end + let!(:dep) { build_spec("I like tests") } + describe "#ready_to_enqueue?" do context "when in enqueued state" do it "is falsey" do @@ -39,29 +38,51 @@ def a_spec.full_name end describe "#dependencies_installed?" do - context "when all dependencies are installed" do - it "returns true" do - dependencies = [] - dependencies << instance_double("SpecInstallation", spec: "alpha", name: "alpha", installed?: true, all_dependencies: [], type: :production) - dependencies << instance_double("SpecInstallation", spec: "beta", name: "beta", installed?: true, all_dependencies: [], type: :production) - all_specs = dependencies + [instance_double("SpecInstallation", spec: "gamma", name: "gamma", installed?: false, all_dependencies: [], type: :production)] + it "returns true when all dependencies are installed" do + alpha = described_class.new(build_spec("alpha")) + alpha.dependencies = [] + + beta = described_class.new(build_spec("beta")) + beta.dependencies = [alpha] + + gamma = described_class.new(build_spec("gamma")) + gamma.dependencies = [beta] + + expect(gamma.dependencies_installed?({})).to be_falsey + expect(gamma.dependencies_installed?({ "beta" => true })).to be_falsey + expect(gamma.dependencies_installed?({ "alpha" => true, "beta" => true })).to be_truthy + end + end + + describe "#ready_to_install?" do + context "when spec has no extensions" do + it "returns true regardless of dependencies" do + beta = described_class.new(build_spec("beta")) + beta.dependencies = [] + spec = described_class.new(dep) - allow(spec).to receive(:all_dependencies).and_return(dependencies) - installed_specs = all_specs.select(&:installed?).map {|s| [s.name, true] }.to_h - expect(spec.dependencies_installed?(installed_specs)).to be_truthy + spec.state = :downloaded + spec.dependencies = [beta] + + expect(spec.ready_to_install?({})).to be_truthy end end - context "when all dependencies are not installed" do - it "returns false" do - dependencies = [] - dependencies << instance_double("SpecInstallation", spec: "alpha", name: "alpha", installed?: false, all_dependencies: [], type: :production) - dependencies << instance_double("SpecInstallation", spec: "beta", name: "beta", installed?: true, all_dependencies: [], type: :production) - all_specs = dependencies + [instance_double("SpecInstallation", spec: "gamma", name: "gamma", installed?: false, all_dependencies: [], type: :production)] - spec = described_class.new(dep) - allow(spec).to receive(:all_dependencies).and_return(dependencies) - installed_specs = all_specs.select(&:installed?).map {|s| [s.name, true] }.to_h - expect(spec.dependencies_installed?(installed_specs)).to be_falsey + context "when spec has extensions" do + it "returns true when all dependencies are installed" do + alpha = described_class.new(build_spec("alpha")) + alpha.dependencies = [] + + beta = described_class.new(build_spec("beta")) + beta.dependencies = [alpha] + + gamma = described_class.new(build_spec("gamma", extensions: ["ext/Rakefile"])) + gamma.state = :downloaded + gamma.dependencies = [beta] + + expect(gamma.ready_to_install?({})).to be_falsey + expect(gamma.ready_to_install?({ "beta" => true })).to be_falsey + expect(gamma.ready_to_install?({ "alpha" => true, "beta" => true })).to be_truthy end end end diff --git a/bundler/spec/commands/install_spec.rb b/bundler/spec/commands/install_spec.rb index ae651bf981c7..3c68c2cb30d1 100644 --- a/bundler/spec/commands/install_spec.rb +++ b/bundler/spec/commands/install_spec.rb @@ -1379,6 +1379,48 @@ def run end end + describe "when a native extension requires a transitive dependency at build time" do + before do + build_repo4 do + build_gem "alpha", "1.0.0" do |s| + extension = "ext/alpha/extconf.rb" + s.extensions = extension + s.write(extension, <<~CODE) + require "mkmf" + sleep 1 + create_makefile("alpha") + CODE + s.write "lib/alpha.rb", "ALPHA = '1.0.0'" + end + + build_gem "beta", "1.0.0" do |s| + s.add_dependency "alpha" + s.write "lib/beta.rb", "require 'alpha'\nBETA = '1.0.0'" + end + + build_gem "gamma", "1.0.0" do |s| + s.add_dependency "beta" + extension = "ext/gamma/extconf.rb" + s.extensions = extension + s.write(extension, <<~EXTCONF) + require "beta" + require "mkmf" + create_makefile("gamma") + EXTCONF + end + end + end + + it "installs successfully" do + install_gemfile <<~G + source "https://gem.repo4" + gem "gamma" + G + + expect(the_bundle).to include_gems "alpha 1.0.0", "beta 1.0.0", "gamma 1.0.0" + end + end + describe "when configured path is UTF-8 and a file inside a gem package too" do let(:app_path) do path = tmp("♥") From 27ef890d427d4cf5dfd4420d1b51e8c5bc411213 Mon Sep 17 00:00:00 2001 From: y-onishi Date: Thu, 23 Apr 2026 19:57:36 +0900 Subject: [PATCH 14/21] Update gem creation guide URL to rubygems.org Update the gem creation guide links in the CLI output and gemspac template. The previous Bundler guide URL now redirects to RubyGems Guides. (cherry picked from commit 0b469edf03b8f20aa44a6de8ce7e6ed916e934b9) --- bundler/lib/bundler/cli/gem.rb | 2 +- bundler/lib/bundler/templates/newgem/newgem.gemspec.tt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bundler/lib/bundler/cli/gem.rb b/bundler/lib/bundler/cli/gem.rb index 79344314fe49..3f9432db3a81 100644 --- a/bundler/lib/bundler/cli/gem.rb +++ b/bundler/lib/bundler/cli/gem.rb @@ -288,7 +288,7 @@ def run open_editor(options["edit"], target.join("#{name}.gemspec")) if options[:edit] Bundler.ui.info "\nGem '#{name}' was successfully created. " \ - "For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html" + "For more information on making a RubyGem visit https://guides.rubygems.org/make-your-own-gem/" end private diff --git a/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt b/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt index fabb308043c9..b81ecec624af 100644 --- a/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +++ b/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt @@ -54,5 +54,5 @@ Gem::Specification.new do |spec| <%- end -%> # For more information and examples about making a new gem, check out our - # guide at: https://bundler.io/guides/creating_gem.html + # guide at: https://guides.rubygems.org/make-your-own-gem/ end From 8a9c7a6fce06eadc30ce61156386cbdea7f59185 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 09:17:59 +0900 Subject: [PATCH 15/21] Skip bundler self-checksum for unreleased bundlers (#9501) * Skip bundler self-checksum for unreleased bundlers Using `Bundler.gem_version.end_with?(".dev")` only skips the own checksum on master, but patch releases run from a source checkout (e.g., bumping bundler/lib/bundler/version.rb to 4.0.11 on a release branch) still record the checksum, which is environment dependent on the local gem cache and causes frozen-lock drift on CI. Generalize the guard with `released_bundler?`, which returns false for any prerelease version and for bundlers loaded outside of an installed gem location (`/specifications/`), so dev workflows don't record self-checksums while released installs still do. Co-Authored-By: Claude Opus 4.7 (1M context) * Revert "Skip bundler self-checksum for unreleased bundlers" This reverts commit d4e51dd7d74c534b969415a65a23f7d6ad1dde6c. * Skip bundler checksum when running version:update_locked_bundler: - Our development lockfile should not include the checksum of bundler itself. No matter if we are doing a release. The problem being that including a checksum in our development lockfile create issues as some rake tasks don't run the same way on CI. For example, some rake tasks, build bundler.gem and some other don't. I explained in more details the issue here 2c40b8d563f20d7cafdaefc6a60fb08566159cf2 This commit here is motivated by the fact that when the release manager runs `version:update_locked_bundler`, if a `bundler-.gem` exists on its system (e.g it previously ran `rake bundler:install`), then the lockfile will include a checksum entry. --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: Edouard CHIN (cherry picked from commit ee558f2f9dfcdc0b8bf15e1d3446c58547bd9fee) --- Rakefile | 1 + bundler/lib/bundler/lockfile_generator.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index d1e0f2e17dfa..d44576bb2be3 100644 --- a/Rakefile +++ b/Rakefile @@ -32,6 +32,7 @@ namespace :version do task :update_locked_bundler do |_, _args| stdout = Spec::Rubygems.dev_bundle "--version" version = stdout.split(" ").last + ENV["SKIP_BUNDLER_CHECKSUM"] = "1" Dir.glob("{tool/bundler/*_gems.rb,bundler/spec/realworld/fixtures/*/Gemfile}").each do |file| Spec::Rubygems.dev_bundle("lock", "--update", "--bundler", version, gemfile: file) diff --git a/bundler/lib/bundler/lockfile_generator.rb b/bundler/lib/bundler/lockfile_generator.rb index b56ae2e2b104..2a3ad2248058 100644 --- a/bundler/lib/bundler/lockfile_generator.rb +++ b/bundler/lib/bundler/lockfile_generator.rb @@ -103,7 +103,7 @@ def add_section(name, value) end def bundler_checksum - return [] if Bundler.gem_version.to_s.end_with?(".dev") + return [] if Bundler.gem_version.to_s.end_with?(".dev") || ENV["SKIP_BUNDLER_CHECKSUM"] bundler_spec = definition.sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last return [] unless File.exist?(bundler_spec.cache_file) From 9da428589d521a84b4c06759c1abc72fbaae3cff Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 11:41:34 +0900 Subject: [PATCH 16/21] Skip bundler self-checksum on ruby-core in test fixtures (#9506) * Skip bundler self-checksum on ruby-core in test fixtures In ruby-core test setup, bundler is loaded as a default gem and the bundler.gem cache file is not present on disk where LockfileGenerator#bundler_checksum looks for it. As a result, the generator omits the bundler checksum from the regenerated lockfile, while the test's checksums_section helper still adds it, making the "does not change the lock" expectations in setup_spec.rb fail on ruby-core CI for release branches (where Bundler::VERSION does not end in .dev). Mirror the generator's give-up conditions in the helper so that test fixtures and the regenerated lockfile stay in sync. Co-Authored-By: Claude Opus 4.7 (1M context) * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> (cherry picked from commit 40112f7663a2fa279f2fcd7b507b91e2615b1f89) --- bundler/spec/support/checksums.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bundler/spec/support/checksums.rb b/bundler/spec/support/checksums.rb index 7b69bba6680b..06a0a8e88e09 100644 --- a/bundler/spec/support/checksums.rb +++ b/bundler/spec/support/checksums.rb @@ -58,7 +58,12 @@ def checksums_section(enabled = true, bundler_checksum: true, &block) ChecksumsBuilder.new(enabled, &block).tap do |builder| next if builder.bundler_registered || !bundler_checksum - next if Bundler::VERSION.to_s.end_with?(".dev") + # Mirror the conditions under which LockfileGenerator#bundler_checksum + # gives up and omits the bundler checksum from the lockfile: + # - .dev: development builds have no released bundler.gem to checksum. + # - ruby_core?: bundler is loaded as a default gem, so bundler.gem + # is not present on disk under the test gem cache. + next if Bundler::VERSION.to_s.end_with?(".dev") || Spec::Path.ruby_core? builder.checksum(system_gem_path, "bundler", Bundler::VERSION, Gem::Platform::RUBY, "cache") end end From 8da091dafabd9ff9801872d1877486c078657c31 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 12:13:34 +0900 Subject: [PATCH 17/21] Replace #9506 with a targeted :ruby_repo skip The blanket skip in checksums_section from #9506 caused 82 ruby-core test failures whose lockfile expectations legitimately include the bundler checksum (paths that go through `bundle install` where bundler is activated as a gem). Revert that change and instead tag only the affected setup_spec example with :ruby_repo, since its `ruby "require 'bundler/setup'"` invocation is the one case where bundler is loaded from $LOAD_PATH and Source::Metadata's synthetic bundler spec has no cache_file on disk. Co-Authored-By: Claude Opus 4.7 (1M context) (cherry picked from commit 66c7546764187ae8080e8b8d8d72b3fc85a49aef) --- bundler/spec/runtime/setup_spec.rb | 7 ++++++- bundler/spec/support/checksums.rb | 7 +------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bundler/spec/runtime/setup_spec.rb b/bundler/spec/runtime/setup_spec.rb index 694ef7f5183f..2cbb61dbff5d 100644 --- a/bundler/spec/runtime/setup_spec.rb +++ b/bundler/spec/runtime/setup_spec.rb @@ -1283,7 +1283,12 @@ def lock_with(ruby_version = nil) end context "is not present" do - it "does not change the lock" do + # Skipped on ruby-core because `ruby "require 'bundler/setup'"` does not + # activate bundler as a gem there, so Source::Metadata falls back to a + # synthetic spec whose cache_file does not exist on disk and + # LockfileGenerator#bundler_checksum drops the bundler checksum, while + # the on-disk lockfile still has it. + it "does not change the lock", :ruby_repo do expect { ruby "require 'bundler/setup'" }.not_to change { lockfile } end end diff --git a/bundler/spec/support/checksums.rb b/bundler/spec/support/checksums.rb index 06a0a8e88e09..7b69bba6680b 100644 --- a/bundler/spec/support/checksums.rb +++ b/bundler/spec/support/checksums.rb @@ -58,12 +58,7 @@ def checksums_section(enabled = true, bundler_checksum: true, &block) ChecksumsBuilder.new(enabled, &block).tap do |builder| next if builder.bundler_registered || !bundler_checksum - # Mirror the conditions under which LockfileGenerator#bundler_checksum - # gives up and omits the bundler checksum from the lockfile: - # - .dev: development builds have no released bundler.gem to checksum. - # - ruby_core?: bundler is loaded as a default gem, so bundler.gem - # is not present on disk under the test gem cache. - next if Bundler::VERSION.to_s.end_with?(".dev") || Spec::Path.ruby_core? + next if Bundler::VERSION.to_s.end_with?(".dev") builder.checksum(system_gem_path, "bundler", Bundler::VERSION, Gem::Platform::RUBY, "cache") end end From 6c0c403838822bc36b1dd514bfa880b7f9bb0453 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 12:47:53 +0900 Subject: [PATCH 18/21] Changelog for Bundler version 4.0.11 --- bundler/CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/bundler/CHANGELOG.md b/bundler/CHANGELOG.md index 883ecd06ee71..368b4dc51578 100644 --- a/bundler/CHANGELOG.md +++ b/bundler/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 4.0.11 / 2026-04-30 + +### Enhancements: + +* Update gem creation guide URL to rubygems.org. Pull request [#9500](https://github.com/ruby/rubygems/pull/9500) by nissyi-gh +* Lock the checksum of Bundler itself in the lockfile. Pull request [#9366](https://github.com/ruby/rubygems/pull/9366) by Edouard-chin + +### Bug fixes: + +* Fix installing gems with native extensions + transitive dependencies. Pull request [#9477](https://github.com/ruby/rubygems/pull/9477) by nicholasdower +* Fix the bundler version not being updated in dev/test lockfile. Pull request [#9463](https://github.com/ruby/rubygems/pull/9463) by Edouard-chin +* Ensure the release CI doesn't break due to the Bundler checksum feature. Pull request [#9436](https://github.com/ruby/rubygems/pull/9436) by Edouard-chin + +### Documentation: + +* Fix formatting for BUNDLE_PREFER_PATCH variable in man page. Pull request [#9474](https://github.com/ruby/rubygems/pull/9474) by toy + ## 4.0.10 / 2026-04-08 ### Enhancements: From 93e5bff3d5f010b52b0b354a222ebcd22434c353 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 12:48:20 +0900 Subject: [PATCH 19/21] Bump Bundler version to 4.0.11 --- bundler/lib/bundler/version.rb | 2 +- bundler/spec/realworld/fixtures/tapioca/Gemfile.lock | 2 +- bundler/spec/realworld/fixtures/warbler/Gemfile.lock | 2 +- tool/bundler/dev_gems.rb.lock | 2 +- tool/bundler/lint_gems.rb.lock | 2 +- tool/bundler/release_gems.rb.lock | 2 +- tool/bundler/rubocop_gems.rb.lock | 2 +- tool/bundler/standard_gems.rb.lock | 2 +- tool/bundler/test_gems.rb.lock | 2 +- tool/bundler/vendor_gems.rb.lock | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bundler/lib/bundler/version.rb b/bundler/lib/bundler/version.rb index 7279965f7046..e8b442674a61 100644 --- a/bundler/lib/bundler/version.rb +++ b/bundler/lib/bundler/version.rb @@ -1,7 +1,7 @@ # frozen_string_literal: false module Bundler - VERSION = "4.0.10".freeze + VERSION = "4.0.11".freeze def self.bundler_major_version @bundler_major_version ||= gem_version.segments.first diff --git a/bundler/spec/realworld/fixtures/tapioca/Gemfile.lock b/bundler/spec/realworld/fixtures/tapioca/Gemfile.lock index c1de0f776963..bbaf8328d638 100644 --- a/bundler/spec/realworld/fixtures/tapioca/Gemfile.lock +++ b/bundler/spec/realworld/fixtures/tapioca/Gemfile.lock @@ -46,4 +46,4 @@ DEPENDENCIES tapioca BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/bundler/spec/realworld/fixtures/warbler/Gemfile.lock b/bundler/spec/realworld/fixtures/warbler/Gemfile.lock index a27690c5934d..3c6fd5218080 100644 --- a/bundler/spec/realworld/fixtures/warbler/Gemfile.lock +++ b/bundler/spec/realworld/fixtures/warbler/Gemfile.lock @@ -36,4 +36,4 @@ DEPENDENCIES warbler! BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/dev_gems.rb.lock b/tool/bundler/dev_gems.rb.lock index f6c13704adb7..b2d1783acb39 100644 --- a/tool/bundler/dev_gems.rb.lock +++ b/tool/bundler/dev_gems.rb.lock @@ -129,4 +129,4 @@ CHECKSUMS turbo_tests (2.2.5) sha256=3fa31497d12976d11ccc298add29107b92bda94a90d8a0a5783f06f05102509f BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/lint_gems.rb.lock b/tool/bundler/lint_gems.rb.lock index 2e4ae39e741e..80baf85f0370 100644 --- a/tool/bundler/lint_gems.rb.lock +++ b/tool/bundler/lint_gems.rb.lock @@ -119,4 +119,4 @@ CHECKSUMS wmi-lite (1.0.7) sha256=116ef5bb470dbe60f58c2db9047af3064c16245d6562c646bc0d90877e27ddda BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/release_gems.rb.lock b/tool/bundler/release_gems.rb.lock index c827d9091e2d..657e6158b8df 100644 --- a/tool/bundler/release_gems.rb.lock +++ b/tool/bundler/release_gems.rb.lock @@ -87,4 +87,4 @@ CHECKSUMS uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/rubocop_gems.rb.lock b/tool/bundler/rubocop_gems.rb.lock index 422a8869114b..2893c91a2ca0 100644 --- a/tool/bundler/rubocop_gems.rb.lock +++ b/tool/bundler/rubocop_gems.rb.lock @@ -156,4 +156,4 @@ CHECKSUMS unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/standard_gems.rb.lock b/tool/bundler/standard_gems.rb.lock index bbc83b79ce25..285bafab7442 100644 --- a/tool/bundler/standard_gems.rb.lock +++ b/tool/bundler/standard_gems.rb.lock @@ -176,4 +176,4 @@ CHECKSUMS unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/test_gems.rb.lock b/tool/bundler/test_gems.rb.lock index 0688ecb31b4f..031216b465ab 100644 --- a/tool/bundler/test_gems.rb.lock +++ b/tool/bundler/test_gems.rb.lock @@ -103,4 +103,4 @@ CHECKSUMS tilt (2.6.1) sha256=35a99bba2adf7c1e362f5b48f9b581cce4edfba98117e34696dde6d308d84770 BUNDLED WITH - 4.0.10 + 4.0.11 diff --git a/tool/bundler/vendor_gems.rb.lock b/tool/bundler/vendor_gems.rb.lock index c817a737039e..2534e5c595c2 100644 --- a/tool/bundler/vendor_gems.rb.lock +++ b/tool/bundler/vendor_gems.rb.lock @@ -72,4 +72,4 @@ CHECKSUMS uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 BUNDLED WITH - 4.0.10 + 4.0.11 From 520560bd0037fa370ae24844b4b4d04fb17a3b97 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 12:48:20 +0900 Subject: [PATCH 20/21] Changelog for Rubygems version 4.0.11 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50f2d43c7af2..2ab75347eeab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 4.0.11 / 2026-04-30 + +### Enhancements: + +* Add commented-out rubygems_mfa_required to bundle gem template. Pull request [#9487](https://github.com/ruby/rubygems/pull/9487) by MatheusRich +* Clarify the name and meaning of the first argument to `gem spec`. Pull request [#9476](https://github.com/ruby/rubygems/pull/9476) by eregon +* Installs bundler 4.0.11 as a default gem. + ## 4.0.10 / 2026-04-08 ### Enhancements: From b7155a38653e35c5789e8f606f5a77999b38ecc2 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 30 Apr 2026 12:48:20 +0900 Subject: [PATCH 21/21] Bump Rubygems version to 4.0.11 --- lib/rubygems.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index d9d0fefdf83e..d9da84ed3b1f 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -9,7 +9,7 @@ require "rbconfig" module Gem - VERSION = "4.0.10" + VERSION = "4.0.11" end require_relative "rubygems/defaults"