Describe the problem as clearly as you can
gem update --system prints every CHANGELOG.md entry newer than the version you're upgrading from. On the official ruby:3.4 Docker image, that's 478 of the 499 lines it prints; on ruby:3.3, 716 of 737. It comes from show_release_notes in lib/rubygems/commands/setup_command.rb, which is called unconditionally.
CHANGELOG.md is now over 7,000 lines and generated from merged PR titles (tool/changelog.rb), so what gets printed is closer to a list of PR titles than to release notes:
* Check the resolved parent directory before extracting old format gems. Pull request [#9755](https://github.com/ruby/rubygems/pull/9755) by hsbt
* Installs bundler 4.0.18 as a default gem.
Neither existing flag covers this. --quiet isn't forwarded to setup.rb — duckinator mentioned in #4355 that they hadn't touched it ("I didn't know it existed"). --silent does silence the changelog, but it silences errors too (gem install --silent no-such-gem prints nothing and exits 2), which seems fair enough for --silent. In #3789, duckinator said they "would like something between the changelog-dump and silence, too".
Which raises the question: should gem update --system print the changelog at all, or would a link to the release notes be enough?
Did you try upgrading RubyGems?
Yes — and upgrading can't fix this one by itself. As duckinator pointed out in #4355, a flag-based fix "will only help when updating from versions with the fix", and the changelog is printed by the child process — system(*Shellwords.split(Gem.ruby), "--disable-gems", "setup.rb", *args). Only a change to the child's default reaches people upgrading from an older RubyGems.
Post steps to reproduce the problem
See below.
Which command did you run?
$ docker run --rm ruby:3.4 sh -c 'gem update --system | wc -l'
499
$ docker run --rm ruby:3.3 sh -c 'gem update --system | wc -l'
737
What were you expecting to happen?
A summary of what was installed: the versions, the executables, and where to read about the changes.
Concretely, I'd expect something like this to be enough:
def show_release_notes
say "See https://github.com/ruby/rubygems/releases for the release notes."
end
The CHANGELOG.md parsing would go away too. setup.rb would keep accepting --previous-version, since older parents still pass it; only its last use (setup_command.rb:573) would be removed.
Measured on the ruby:3.4 Docker image, with rubygems-update already installed, so the same command runs in both cases (which is why it's 498 rather than the 499 above — the Successfully installed rubygems-update line isn't printed):
gem update --system |
stdout |
| today |
498 lines |
| with the above |
20 lines |
I picked /releases because it lists releases newest-first, so the version you just installed is at the top, but the gemspec's changelog_uri (blob/master/CHANGELOG.md) would work just as well.
What actually happened?
478 of the 499 lines were the changelog:
Installing RubyGems 4.0.19
Successfully built RubyGem
Name: bundler
Version: 4.0.19
File: bundler-4.0.19.gem
Bundler 4.0.19 installed
RubyGems 4.0.19 installed
Regenerating binstubs
Regenerating plugins
## 4.0.19 / 2026-08-20
[... 478 lines, 23 release headings ...]
* Fix heading ranks in documentation. Pull request
[#8711](https://github.com/ruby/rubygems/pull/8711) by antoinem
------------------------------------------------------------------------------
RubyGems installed the following executables:
/usr/local/bin/gem
/usr/local/bin/bundle
/usr/local/bin/bundler
RubyGems system software updated
Run gem env and paste the output below
RubyGems Environment:
- RUBYGEMS VERSION: 3.6.9
- RUBY VERSION: 3.4.10 (2026-06-30 patchlevel 104) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/bundle
- USER INSTALLATION DIRECTORY: /root/.local/share/gem/ruby/3.4.0
- RUBY EXECUTABLE: /usr/local/bin/ruby
- GIT EXECUTABLE: /usr/bin/git
- EXECUTABLE DIRECTORY: /usr/local/bundle/bin
- SPEC CACHE DIRECTORY: /root/.cache/gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /usr/local/etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/local/bundle
- /root/.local/share/gem/ruby/3.4.0
- /usr/local/lib/ruby/gems/3.4.0
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => true
- :bulk_threshold => 1000
- "gem" => "--no-document"
- REMOTE SOURCES:
- https://rubygems.org/
Past changes here (#3041, #4145, #4198) tuned how much gets printed, so this is a different kind of change. How does that sound?
Describe the problem as clearly as you can
gem update --systemprints everyCHANGELOG.mdentry newer than the version you're upgrading from. On the officialruby:3.4Docker image, that's 478 of the 499 lines it prints; onruby:3.3, 716 of 737. It comes fromshow_release_notesinlib/rubygems/commands/setup_command.rb, which is called unconditionally.CHANGELOG.mdis now over 7,000 lines and generated from merged PR titles (tool/changelog.rb), so what gets printed is closer to a list of PR titles than to release notes:Neither existing flag covers this.
--quietisn't forwarded tosetup.rb— duckinator mentioned in #4355 that they hadn't touched it ("I didn't know it existed").--silentdoes silence the changelog, but it silences errors too (gem install --silent no-such-gemprints nothing and exits 2), which seems fair enough for--silent. In #3789, duckinator said they "would like something between the changelog-dump and silence, too".Which raises the question: should
gem update --systemprint the changelog at all, or would a link to the release notes be enough?Did you try upgrading RubyGems?
Yes — and upgrading can't fix this one by itself. As duckinator pointed out in #4355, a flag-based fix "will only help when updating from versions with the fix", and the changelog is printed by the child process —
system(*Shellwords.split(Gem.ruby), "--disable-gems", "setup.rb", *args). Only a change to the child's default reaches people upgrading from an older RubyGems.Post steps to reproduce the problem
See below.
Which command did you run?
What were you expecting to happen?
A summary of what was installed: the versions, the executables, and where to read about the changes.
Concretely, I'd expect something like this to be enough:
The
CHANGELOG.mdparsing would go away too.setup.rbwould keep accepting--previous-version, since older parents still pass it; only its last use (setup_command.rb:573) would be removed.Measured on the
ruby:3.4Docker image, withrubygems-updatealready installed, so the same command runs in both cases (which is why it's 498 rather than the 499 above — theSuccessfully installed rubygems-updateline isn't printed):gem update --systemI picked
/releasesbecause it lists releases newest-first, so the version you just installed is at the top, but the gemspec'schangelog_uri(blob/master/CHANGELOG.md) would work just as well.What actually happened?
478 of the 499 lines were the changelog:
Run
gem envand paste the output belowPast changes here (#3041, #4145, #4198) tuned how much gets printed, so this is a different kind of change. How does that sound?