Skip to content

Commit bfde9b3

Browse files
authored
Merge pull request #9273 from ruby/release/4.0.5
Prepare RubyGems 4.0.5 and Bundler 4.0.5
2 parents 2b06b46 + 6d11c1f commit bfde9b3

28 files changed

Lines changed: 378 additions & 96 deletions

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
# Changelog
22

3+
## 4.0.5 / 2026-01-29
4+
5+
### Enhancements:
6+
7+
* Removed unused deprecate loading. Pull request
8+
[#9266](https://github.com/ruby/rubygems/pull/9266) by hsbt
9+
* Validate executable names for invalid characters. Pull request
10+
[#9257](https://github.com/ruby/rubygems/pull/9257) by hsbt
11+
* Installs bundler 4.0.5 as a default gem.
12+
13+
### Bug fixes:
14+
15+
* Fix RubyGems not able to require the right gem:. Pull request
16+
[#9246](https://github.com/ruby/rubygems/pull/9246) by Edouard-chin
17+
* Remove special behavior for rake. Pull request
18+
[#9245](https://github.com/ruby/rubygems/pull/9245) by JasonLunn
19+
20+
### Documentation:
21+
22+
* Added another usage of pristine command. Pull request
23+
[#9255](https://github.com/ruby/rubygems/pull/9255) by hsbt
24+
325
## 4.0.4 / 2026-01-15
426

527
### Enhancements:

bundler/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## 4.0.5 (2026-01-29)
4+
5+
### Enhancements:
6+
7+
- Fix Bundler that re-exec $0 when a `version` is present in the config: [#9249](https://github.com/ruby/rubygems/pull/9249)
8+
9+
### Bug fixes:
10+
11+
- Only use parent source with Git and Path sources [#9269](https://github.com/ruby/rubygems/pull/9269)
12+
313
## 4.0.4 (2026-01-15)
414

515
### Enhancements:

bundler/lib/bundler/definition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ def converge_specs(specs)
10771077
end
10781078
end
10791079

1080-
if parent_dep
1080+
if parent_dep && parent_dep.source.is_a?(Source::Path)
10811081
replacement_source = parent_dep.source
10821082
else
10831083
replacement_source = sources.get(lockfile_source)

bundler/lib/bundler/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: false
22

33
module Bundler
4-
VERSION = "4.0.4".freeze
4+
VERSION = "4.0.5".freeze
55

66
def self.bundler_major_version
77
@bundler_major_version ||= gem_version.segments.first

bundler/spec/install/gemfile/sources_spec.rb

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,4 +1195,45 @@
11951195
expect(gem_section).not_to include("activerecord (7.0.0)")
11961196
end
11971197
end
1198+
1199+
context "when a scoped rubygems source is missing a transitive dependency" do
1200+
before do
1201+
build_repo2 do
1202+
build_gem "fallback_dep", "1.0.0"
1203+
build_gem "foo", "1.0.0"
1204+
end
1205+
1206+
build_repo3 do
1207+
build_gem "private_parent", "1.0.0" do |s|
1208+
s.add_dependency "fallback_dep"
1209+
end
1210+
end
1211+
1212+
gemfile <<-G
1213+
source "https://gem.repo2"
1214+
1215+
gem "foo"
1216+
1217+
source "https://gem.repo3" do
1218+
gem "private_parent", "1.0.0"
1219+
end
1220+
G
1221+
1222+
bundle :install, artifice: "compact_index"
1223+
end
1224+
1225+
it "falls back to the default rubygems source for that dependency" do
1226+
build_repo2 do
1227+
build_gem "foo", "2.0.0"
1228+
end
1229+
1230+
system_gems []
1231+
1232+
bundle "update foo", artifice: "compact_index"
1233+
1234+
expect(the_bundle).to include_gems("private_parent 1.0.0", "fallback_dep 1.0.0", "foo 2.0.0")
1235+
expect(the_bundle).to include_gems("private_parent 1.0.0", source: "remote3")
1236+
expect(the_bundle).to include_gems("fallback_dep 1.0.0", source: "remote2")
1237+
end
1238+
end
11981239
end

bundler/spec/realworld/fixtures/tapioca/Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@ DEPENDENCIES
4646
tapioca
4747

4848
BUNDLED WITH
49-
4.0.4
49+
4.0.5

bundler/spec/realworld/fixtures/warbler/Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@ DEPENDENCIES
3636
warbler!
3737

3838
BUNDLED WITH
39-
4.0.4
39+
4.0.5

bundler/spec/runtime/self_management_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,24 @@
171171
expect(out).to eq(previous_minor)
172172
end
173173

174+
it "requires the right bundler version from the config and run bundle CLI without re-exec" do
175+
unless Bundler.rubygems.provides?(">= 4.1.0.dev")
176+
skip "This spec can only run when Gem::BundlerVersionFinder.bundler_versions reads bundler configs"
177+
end
178+
179+
lockfile_bundled_with(current_version)
180+
181+
bundle "config set --local version #{previous_minor}"
182+
bundle "config set --local path.system true"
183+
bundle "install"
184+
185+
script = bundled_app("script.rb")
186+
create_file(script, "p 'executed once'")
187+
188+
bundle "-v", env: { "RUBYOPT" => "-r#{script}" }
189+
expect(out).to eq(%("executed once"\n9.3.0))
190+
end
191+
174192
it "does not try to install when using bundle config version global" do
175193
lockfile_bundled_with(previous_minor)
176194

bundler/spec/support/builders.rb

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -695,54 +695,54 @@ def _default_files
695695

696696
TEST_CERT = <<~CERT
697697
-----BEGIN CERTIFICATE-----
698-
MIIDMjCCAhqgAwIBAgIBATANBgkqhkiG9w0BAQUFADAnMQwwCgYDVQQDDAN5b3Ux
698+
MIIDNTCCAh2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAnMQwwCgYDVQQDDAN5b3Ux
699699
FzAVBgoJkiaJk/IsZAEZFgdleGFtcGxlMB4XDTE1MDIwODAwMTIyM1oXDTQyMDYy
700700
NTAwMTIyM1owJzEMMAoGA1UEAwwDeW91MRcwFQYKCZImiZPyLGQBGRYHZXhhbXBs
701-
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANlvFdpN43c4DMS9Jo06
702-
m0a7k3bQ3HWQ1yrYhZMi77F1F73NpBknYHIzDktQpGn6hs/4QFJT4m4zNEBF47UL
703-
jHU5nTK5rjkS3niGYUjvh3ZEzVeo9zHUlD/UwflDo4ALl3TSo2KY/KdPS/UTdLXL
704-
ajkQvaVJtEDgBPE3DPhlj5whp+Ik3mDHej7qpV6F502leAwYaFyOtlEG/ZGNG+nZ
705-
L0clH0j77HpP42AylHDi+vakEM3xcjo9BeWQ6Vkboic93c9RTt6CWBWxMQP7Nol1
706-
MOebz9XOSQclxpxWteXNfPRtMdAhmRl76SMI8ywzThNPpa4EH/yz34ftebVOgKyM
707-
nd0CAwEAAaNpMGcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFA7D
708-
n9qo0np23qi3aOYuAAPn/5IdMBYGA1UdEQQPMA2BC3lvdUBleGFtcGxlMBYGA1Ud
709-
EgQPMA2BC3lvdUBleGFtcGxlMA0GCSqGSIb3DQEBBQUAA4IBAQA7Gyk62sWOUX/N
710-
vk4tJrgKESph6Ns8+E36A7n3jt8zCep8ldzMvwTWquf9iqhsC68FilEoaDnUlWw7
711-
d6oNuaFkv7zfrWGLlvqQJC+cu2X5EpcCksg5oRp8VNbwJysJ6JgwosxzROII8eXc
712-
R+j1j6mDvQYqig2QOnzf480pjaqbP+tspfDFZbhKPrgM3Blrb3ZYuFpv4zkqI7aB
713-
6fuk2DUhNO1CuwrJA84TqC+jGo73bDKaT5hrIDiaJRrN5+zcWja2uEWrj5jSbep4
714-
oXdEdyH73hOHMBP40uds3PqnUsxEJhzjB2sCCe1geV24kw9J4m7EQXPVkUKDgKrt
715-
LlpDmOoo
701+
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkupYkg3Nd1oXM3fo0d
702+
mVJBWNrni88lKDuIIQXwcKe6XCgiloZG708ecLTOws9+o9MkTl9Wtpf/WGXT98NK
703+
EPUYakd2Fv1SuD1jWYlP7iDR6hB3RkWBm5ziujYftVJ4ZrPD42PLjDASvlh75Tvr
704+
MeM7yq/qkcgNsd9dQyUvMNPks3tla9je7Dt7Auli2IN3CNXys7gIOfwJH0Bb/M6t
705+
y7oUfpoUKAfLzwe61abztgDu1lSNgdFBM1kcxYflyh/FkX5TlAcWeAXzLrnxAXGR
706+
UxXrxW4oPC+kZi/pDRBd7X4zQDx7bCmr1+FsS3M05i3w5E08Tt9iKRk4V8nCmE4i
707+
k6UCAwEAAaNsMGowCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYE
708+
FOOOFw5TNAqt/TcRRZEU3Dg/58XuMBYGA1UdEQQPMA2BC3lvdUBleGFtcGxlMBYG
709+
A1UdEgQPMA2BC3lvdUBleGFtcGxlMA0GCSqGSIb3DQEBCwUAA4IBAQAy3xnmobxU
710+
1SyhHvoIXTJmG0wt1DQ/Dqwjy362LpEf1UHt29wtg1Mph58eVtl93z5Vd2t4/O77
711+
E2BHpSu9ujc6/Br4+2uA/Qk/xRyLBtZAwty6J4uFvOOg985HonN+RCUZbKSUTmtA
712+
TZvNtIDAZFQ8Tu75K4gIBxDcz7biGi4i1VJ3F3GNCNeossr9IQwKvb+UWFq14U5R
713+
IzUnGgMIzcjUG2kKQvddRD1CjS+egtcLvShbOfm5bs4w4rfQ2FPF+Aaf9v7fxa/c
714+
Jrf3K+cB19eAy7O4nlPG1xurvnZd0QpqRk++werrBuKe1Pgga7YBLePfJhzwqcZv
715+
wVOSsB870yeO
716716
-----END CERTIFICATE-----
717717
CERT
718718

719719
TEST_PKEY = <<~PKEY
720720
-----BEGIN RSA PRIVATE KEY-----
721-
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
746746
-----END RSA PRIVATE KEY-----
747747
PKEY
748748
end

lib/rubygems.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
require "rbconfig"
1010

1111
module Gem
12-
VERSION = "4.0.4"
12+
VERSION = "4.0.5"
1313
end
1414

1515
require_relative "rubygems/defaults"
@@ -192,11 +192,12 @@ def self.try_activate(path)
192192
begin
193193
spec.activate
194194
rescue Gem::LoadError => e # this could fail due to gem dep collisions, go lax
195-
spec_by_name = Gem::Specification.find_by_name(spec.name)
196-
if spec_by_name.nil?
195+
spec = Gem::Specification.find_unloaded_by_path(path)
196+
spec ||= Gem::Specification.find_by_name(spec.name)
197+
if spec.nil?
197198
raise e
198199
else
199-
spec_by_name.activate
200+
spec.activate
200201
end
201202
end
202203

0 commit comments

Comments
 (0)