Skip to content

Print a link to the release notes instead of the whole changelog on gem update --system #9789

Description

@kenchan

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions