Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 19 additions & 13 deletions .github/workflows/bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,29 @@ jobs:

ruby:
- { name: ruby-3.2, value: 3.2.9 }
- { name: ruby-3.3, value: 3.3.9 }
- { name: ruby-3.4, value: 3.4.5 }
- { name: ruby-3.3, value: 3.3.10 }
- { name: ruby-3.4, value: 3.4.8 }
- { name: ruby-4.0, value: 4.0.0 }

include:
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.2, value: 3.2.9 }, timeout: 90 }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.3, value: 3.3.9 }, timeout: 90 }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.4, value: 3.4.5 }, timeout: 90 }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.3, value: 3.3.10 }, timeout: 90 }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.4, value: 3.4.8 }, timeout: 90 }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-4.0, value: 4.0.0 }, timeout: 90 }

# Ruby 3.2 is about 20 minutes slower than 3.3/3.4, so it will be excluded from testing.
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.9 }, timeout: 150, group: a }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.9 }, timeout: 150, group: b }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.9 }, timeout: 150, group: c }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.9 }, timeout: 150, group: d }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.5 }, timeout: 150, group: a }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.5 }, timeout: 150, group: b }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.5 }, timeout: 150, group: c }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.5 }, timeout: 150, group: d }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.10 }, timeout: 150, group: a }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.10 }, timeout: 150, group: b }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.10 }, timeout: 150, group: c }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.3, value: 3.3.10 }, timeout: 150, group: d }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.8 }, timeout: 150, group: a }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.8 }, timeout: 150, group: b }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.8 }, timeout: 150, group: c }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-3.4, value: 3.4.8 }, timeout: 150, group: d }
# - { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-4.0, value: 4.0.0 }, timeout: 150, group: a }
# - { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-4.0, value: 4.0.0 }, timeout: 150, group: b }
# - { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-4.0, value: 4.0.0 }, timeout: 150, group: c }
# - { os: { name: Windows, value: windows-2025 }, ruby: { name: ruby-4.0, value: 4.0.0 }, timeout: 150, group: d }

- { os: { name: Ubuntu, value: ubuntu-24.04 }, ruby: { name: jruby, value: jruby-10.0.2.0 } }
- { os: { name: Windows, value: windows-2025 }, ruby: { name: jruby, value: jruby-10.0.2.0 } }
Expand All @@ -59,7 +65,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/daily-bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
persist-credentials: false

- name: Set up Ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ruby-head
bundler: none
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/daily-rubygems.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
persist-credentials: false

- name: Set up Ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby }}
bundler: none
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/install-rubygems.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down Expand Up @@ -128,7 +128,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down Expand Up @@ -170,7 +170,7 @@ jobs:
with:
persist-credentials: false
- name: Setup original ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: 3.2
bundler: none
Expand All @@ -191,7 +191,7 @@ jobs:
GEM_HOME: bar
GEM_PATH: bar
- name: Setup final ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: 3.3
bundler: none
Expand Down Expand Up @@ -220,7 +220,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down
22 changes: 12 additions & 10 deletions .github/workflows/realworld-bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@ jobs:

ruby:
- { name: ruby-3.2, value: 3.2.9 }
- { name: ruby-3.3, value: 3.3.9 }
- { name: ruby-3.4, value: 3.4.5 }
- { name: ruby-3.3, value: 3.3.10 }
- { name: ruby-3.4, value: 3.4.8 }
- { name: ruby-4.0, value: 4.0.0 }

include:
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.2, value: 3.2.9 } }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.3, value: 3.3.9 } }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.4, value: 3.4.5 } }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.3, value: 3.3.10 } }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-3.4, value: 3.4.8 } }
- { os: { name: macOS, value: macos-15 }, ruby: { name: ruby-4.0, value: 4.0.0 } }
env:
RGV: ..
RUBYOPT: --disable-gems
Expand All @@ -41,7 +43,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand All @@ -64,9 +66,9 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: 3.4.5
ruby-version: 3.4.8
bundler: none
- name: Prepare tapioca
run: ../../../../bin/bundle install
Expand All @@ -91,7 +93,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand All @@ -115,9 +117,9 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: 3.4.5
ruby-version: 3.4.8
bundler: none
- name: Prepare dependencies
run: bin/rake setup
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/rubygems.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ jobs:

ruby:
- { name: "3.2", value: 3.2.9 }
- { name: "3.3", value: 3.3.9 }
- { name: "3.4", value: 3.4.5 }
- { name: "3.3", value: 3.3.10 }
- { name: "3.4", value: 3.4.8 }
- { name: "4.0", value: 4.0.0 }

include:
- ruby: { name: jruby, value: jruby-10.0.2.0 }
Expand All @@ -43,7 +44,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/system-rubygems-bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/truffleruby-bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: truffleruby-24.2.1
bundler: none
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ubuntu-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ jobs:
with:
persist-credentials: false
- name: Setup ruby
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
uses: ruby/setup-ruby@b90be12699fdfcbee4440c2bba85f6f460446bb0 # v1.279.0
with:
ruby-version: ${{ matrix.ruby.value }}
bundler: none
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog

## 4.0.4 / 2026-01-15

### Enhancements:

* Remove date require from rebuild command. Pull request
[#9232](https://github.com/ruby/rubygems/pull/9232) by jeremyevans
* Installs bundler 4.0.4 as a default gem.

### Bug fixes:

* Add a missing "require 'etc'" statement:. Pull request
Copy link

Copilot AI Jan 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is an extra colon after "statement" that should be removed. The sentence should end with "statement." instead of "statement:."

Suggested change
* Add a missing "require 'etc'" statement:. Pull request
* Add a missing "require 'etc'" statement. Pull request

Copilot uses AI. Check for mistakes.
[#9242](https://github.com/ruby/rubygems/pull/9242) by Edouard-chin

## 4.0.3 / 2025-12-23

### Enhancements:
Expand Down
12 changes: 12 additions & 0 deletions bundler/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## 4.0.4 (2026-01-15)

### Enhancements:

- Validate more options for add sub-command [#5905](https://github.com/ruby/rubygems/pull/5905)
- Support Ruby 4.1 [#9219](https://github.com/ruby/rubygems/pull/9219)

### Bug fixes:

- Fix dependency source bug in bundler [#9213](https://github.com/ruby/rubygems/pull/9213)
- Retain current bundler version on `bundle clean` [#9221](https://github.com/ruby/rubygems/pull/9221)

## 4.0.3 (2025-12-23)

### Enhancements:
Expand Down
10 changes: 10 additions & 0 deletions bundler/lib/bundler/cli/add.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,16 @@ def inject_dependencies
end

def validate_options!
raise InvalidOption, "You cannot specify `--git` and `--github` at the same time." if options["git"] && options["github"]

unless options["git"] || options["github"]
raise InvalidOption, "You cannot specify `--branch` unless `--git` or `--github` is specified." if options["branch"]

raise InvalidOption, "You cannot specify `--ref` unless `--git` or `--github` is specified." if options["ref"]
end

raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]

raise InvalidOption, "You cannot specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic]

# raise error when no gems are specified
Expand Down
2 changes: 1 addition & 1 deletion bundler/lib/bundler/current_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def self.current_ruby
end

class CurrentRuby
ALL_RUBY_VERSIONS = [*18..27, *30..34, 40].freeze
ALL_RUBY_VERSIONS = [*18..27, *30..34, *40..41].freeze
KNOWN_MINOR_VERSIONS = ALL_RUBY_VERSIONS.map {|v| v.digits.reverse.join(".") }.freeze
KNOWN_MAJOR_VERSIONS = ALL_RUBY_VERSIONS.map {|v| v.digits.last.to_s }.uniq.freeze
PLATFORM_MAP = {
Expand Down
17 changes: 16 additions & 1 deletion bundler/lib/bundler/definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1066,7 +1066,22 @@ def converge_specs(specs)

deps << dep if !replacement_source || lockfile_source.include?(replacement_source) || new_deps.include?(dep)
else
replacement_source = sources.get(lockfile_source)
parent_dep = @dependencies.find do |d|
next unless d.source && d.source != lockfile_source
next if d.source.is_a?(Source::Gemspec)

parent_locked_specs = @originally_locked_specs[d.name]

parent_locked_specs.any? do |parent_spec|
parent_spec.runtime_dependencies.any? {|rd| rd.name == s.name }
end
end

if parent_dep
replacement_source = parent_dep.source
else
replacement_source = sources.get(lockfile_source)
end
end

# Replace the locked dependency's source with the equivalent source from the Gemfile
Expand Down
2 changes: 1 addition & 1 deletion bundler/lib/bundler/rubygems_integration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ def default_specs
end

def find_bundler(version)
find_name("bundler").find {|s| s.version.to_s == version }
find_name("bundler").find {|s| s.version.to_s == version.to_s }
end

def find_name(name)
Expand Down
9 changes: 8 additions & 1 deletion bundler/lib/bundler/runtime.rb
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,14 @@ def clean(dry_run = false)
spec_cache_paths = []
spec_gemspec_paths = []
spec_extension_paths = []
Bundler.rubygems.add_default_gems_to(specs).values.each do |spec|
specs_to_keep = Bundler.rubygems.add_default_gems_to(specs).values

current_bundler = Bundler.rubygems.find_bundler(Bundler.gem_version)
if current_bundler
specs_to_keep << current_bundler
end

specs_to_keep.each do |spec|
spec_gem_paths << spec.full_gem_path
# need to check here in case gems are nested like for the rails git repo
md = %r{(.+bundler/gems/.+-[a-f0-9]{7,12})}.match(spec.full_gem_path)
Expand Down
2 changes: 1 addition & 1 deletion bundler/lib/bundler/version.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: false

module Bundler
VERSION = "4.0.3".freeze
VERSION = "4.0.4".freeze

def self.bundler_major_version
@bundler_major_version ||= gem_version.segments.first
Expand Down
Loading
Loading