<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ruby.git/tool/update-NEWS-github-release.rb, branch master</title>
<subtitle>The Ruby Programming Language</subtitle>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/'/>
<entry>
<title>Make NEWS.md release-link footer idempotent</title>
<updated>2026-04-20T01:15:49+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-20T01:15:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=6e9ad14db9260090aa5f055d6ed123632efdf75b'/>
<id>6e9ad14db9260090aa5f055d6ed123632efdf75b</id>
<content type='text'>
Seed available_footnotes from the existing release-tag link defs in the
file before overlaying freshly fetched URLs, so gems whose Octokit
fetches are skipped this run keep their URLs instead of being stranded
at their old positions. With every used ref backed by a footnote, the
reject step can drop all release-tag defs unconditionally and re-emit
them in body-ref order, eliminating the back-and-forth reordering
between consecutive scheduled bot runs.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Seed available_footnotes from the existing release-tag link defs in the
file before overlaying freshly fetched URLs, so gems whose Octokit
fetches are skipped this run keep their URLs instead of being stranded
at their old positions. With every used ref backed by a footnote, the
reject step can drop all release-tag defs unconditionally and re-emit
them in body-ref order, eliminating the back-and-forth reordering
between consecutive scheduled bot runs.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Generate sub-bullets for RubyGems and bundler</title>
<updated>2026-04-17T07:13:49+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T07:13:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=6c5f1225a1cc6036732f65e1f43080ddef621eb5'/>
<id>6c5f1225a1cc6036732f65e1f43080ddef621eb5</id>
<content type='text'>
RubyGems and bundler were skipped outright in collect_gem_updates, so
NEWS.md never picked up the rubygems/rubygems releases shipped between
the X.Y.0 baseline and the in-development X.(Y+1).0.dev. Wire them
through resolve_repo (RubyGems → rubygems/rubygems, bundler same repo
with a "bundler-" tag prefix) and teach fetch_release_range to filter
and look up tags by that prefix. Display tags strip the prefix so the
rendered diff reads "4.0.3 to v4.0.4, ..." for both gems while the
footnote URLs still point at the actual tag names. When the "to"
version ends in .dev/.beta/.rc/etc., the lookup falls back to the
highest released tag so unreleased dev versions still produce a range.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
RubyGems and bundler were skipped outright in collect_gem_updates, so
NEWS.md never picked up the rubygems/rubygems releases shipped between
the X.Y.0 baseline and the in-development X.(Y+1).0.dev. Wire them
through resolve_repo (RubyGems → rubygems/rubygems, bundler same repo
with a "bundler-" tag prefix) and teach fetch_release_range to filter
and look up tags by that prefix. Display tags strip the prefix so the
rendered diff reads "4.0.3 to v4.0.4, ..." for both gems while the
footnote URLs still point at the actual tag names. When the "to"
version ends in .dev/.beta/.rc/etc., the lookup falls back to the
highest released tag so unreleased dev versions still produce a range.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Use the X.Y.0 release as the gem-version baseline</title>
<updated>2026-04-17T07:04:49+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T07:04:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=9d6deeba3b839b1236f9afd785dfcf8bb12b195a'/>
<id>9d6deeba3b839b1236f9afd785dfcf8bb12b195a</id>
<content type='text'>
stdgems.org's "X.Y" key tracks the latest 4.0.x patch level, so once a
gem gets bumped in a Ruby patch release the diff baseline shifts forward
and history that should appear in NEWS.md for the next minor disappears.
Prefer the explicit "X.Y.0" key when present so the baseline always
points at the original X.Y.0 release; fall back to "X.Y" or the highest
matching patch otherwise.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
stdgems.org's "X.Y" key tracks the latest 4.0.x patch level, so once a
gem gets bumped in a Ruby patch release the diff baseline shifts forward
and history that should appear in NEWS.md for the next minor disappears.
Prefer the explicit "X.Y.0" key when present so the baseline always
points at the original X.Y.0 release; fall back to "X.Y" or the highest
matching patch otherwise.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Tidy up NEWS.md updater leftovers</title>
<updated>2026-04-17T07:00:43+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T07:00:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=c45dddeb7197af8037db43c65027300685ae7ba9'/>
<id>c45dddeb7197af8037db43c65027300685ae7ba9</id>
<content type='text'>
* Drop the bundler- tag-prefix handling from fetch_release_range,
  collect_gem_updates, and format_release_diff. collect_gem_updates skips
  the bundler gem before any of these run, so the special-case prefix
  stripping never had a chance to fire.
* Rename fetch_versions_to_from_news to fetch_versions_from_news now that
  the "to" side comes from load_current_versions; the function only
  feeds the "from" baseline.
* Use Enumerable#to_h to build result_by_name, and remove a couple of
  comments that just restate the immediately following code.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Drop the bundler- tag-prefix handling from fetch_release_range,
  collect_gem_updates, and format_release_diff. collect_gem_updates skips
  the bundler gem before any of these run, so the special-case prefix
  stripping never had a chance to fire.
* Rename fetch_versions_to_from_news to fetch_versions_from_news now that
  the "to" side comes from load_current_versions; the function only
  feeds the "from" baseline.
* Use Enumerable#to_h to build result_by_name, and remove a couple of
  comments that just restate the immediately following code.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Extract sub-bullet formatting into format_release_diff</title>
<updated>2026-04-17T06:54:12+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T06:54:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=175062690c5232bd2fcfd273bd1c3c8e58335dcf'/>
<id>175062690c5232bd2fcfd273bd1c3c8e58335dcf</id>
<content type='text'>
The "  * 1.2.3 to [v1.2.4][gem-v1.2.4], ..." sub-bullet was assembled in
two places with the same expression. Pull it into a single helper so the
formatting and the bundler-prefix stripping live in one spot.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The "  * 1.2.3 to [v1.2.4][gem-v1.2.4], ..." sub-bullet was assembled in
two places with the same expression. Pull it into a single helper so the
formatting and the bundler-prefix stripping live in one spot.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Read current gem versions from repo state instead of NEWS.md</title>
<updated>2026-04-17T06:51:43+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T06:51:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=2885214501e807ca94e2beb8bf4376b21e2d76d9'/>
<id>2885214501e807ca94e2beb8bf4376b21e2d76d9</id>
<content type='text'>
The "to" side of the diff used to come from parsing NEWS.md, which made
this script depend on update-NEWS-gemlist.rb having already written the
right versions there. Read the authoritative sources directly: scan
{ext,lib}/**/*.gemspec for default gems (mirroring the logic in
default_gems_list.yml), pick up the RubyGems version from
lib/rubygems.rb, and load gems/bundled_gems for the bundled set.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The "to" side of the diff used to come from parsing NEWS.md, which made
this script depend on update-NEWS-gemlist.rb having already written the
right versions there. Read the authoritative sources directly: scan
{ext,lib}/**/*.gemspec for default gems (mirroring the logic in
default_gems_list.yml), pick up the RubyGems version from
lib/rubygems.rb, and load gems/bundled_gems for the bundled set.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Drop dead code from NEWS.md updater</title>
<updated>2026-04-17T06:43:13+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T06:43:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=fbe968e6bf7142586a99de3473807470086df1b8'/>
<id>fbe968e6bf7142586a99de3473807470086df1b8</id>
<content type='text'>
* Remove the bundler branch in resolve_repo: collect_gem_updates skips
  bundler before resolve_repo is ever consulted, so the mapping was
  unreachable.
* Inline the gem_name_normalized ternary, which had the same value in both
  arms.
* Remove the unused tag field from footnote_links and switch to map.
* Drop require "set" since Set is autoloaded on supported Ruby versions.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Remove the bundler branch in resolve_repo: collect_gem_updates skips
  bundler before resolve_repo is ever consulted, so the mapping was
  unreachable.
* Inline the gem_name_normalized ternary, which had the same value in both
  arms.
* Remove the unused tag field from footnote_links and switch to map.
* Drop require "set" since Set is autoloaded on supported Ruby versions.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Handle network failures in NEWS.md updater</title>
<updated>2026-04-17T06:41:42+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T06:41:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=466f6755935e8446bf67c88ab5cb7e934cf002ff'/>
<id>466f6755935e8446bf67c88ab5cb7e934cf002ff</id>
<content type='text'>
GitHub API failures (rate limit, transient 5xx, repo missing) used to abort
the whole script mid-run, leaving NEWS.md in a partially regenerated state.
Wrap the per-gem Octokit call so a single failure only skips that gem with
a stderr warning. Centralise stdgems.json and remote NEWS.md fetches behind
http_get so the script aborts with a readable error when the upstream data
source is unreachable, instead of dumping a Net::HTTP backtrace.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
GitHub API failures (rate limit, transient 5xx, repo missing) used to abort
the whole script mid-run, leaving NEWS.md in a partially regenerated state.
Wrap the per-gem Octokit call so a single failure only skips that gem with
a stderr warning. Centralise stdgems.json and remote NEWS.md fetches behind
http_get so the script aborts with a readable error when the upstream data
source is unreachable, instead of dumping a Net::HTTP backtrace.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Clean up orphaned release-tag link refs in NEWS.md updater</title>
<updated>2026-04-17T06:36:31+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-04-17T06:36:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=13df62bbb3a00addf1b9b819fd9d55f7ba05c31c'/>
<id>13df62bbb3a00addf1b9b819fd9d55f7ba05c31c</id>
<content type='text'>
When update-NEWS-gemlist.rb drops a bundled/default gem entry from NEWS.md
(because it no longer differs from the previous-release snapshot), the
matching `[gem-vX.Y.Z]: ...` link definitions were left behind by
update-NEWS-github-release.rb. Detect refs that are no longer cited from
the body and drop them alongside the ones we re-emit, while preserving
defs still referenced by gems whose release range could not be refreshed.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When update-NEWS-gemlist.rb drops a bundled/default gem entry from NEWS.md
(because it no longer differs from the previous-release snapshot), the
matching `[gem-vX.Y.Z]: ...` link definitions were left behind by
update-NEWS-github-release.rb. Detect refs that are no longer cited from
the body and drop them alongside the ones we re-emit, while preserving
defs still referenced by gems whose release range could not be refreshed.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Detect previous Ruby version in update script</title>
<updated>2026-02-27T20:23:16+00:00</updated>
<author>
<name>Hiroshi SHIBATA</name>
<email>hsbt@ruby-lang.org</email>
</author>
<published>2026-02-26T09:43:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=e43b35f2f1e394a901bf00e0116b1e182d8246b1'/>
<id>e43b35f2f1e394a901bf00e0116b1e182d8246b1</id>
<content type='text'>
Read include/ruby/version.h to compute the previous Ruby version and
use it as the default FROM argument in
tool/update-NEWS-github-release.rb.

Add a workflow step to run the script for Ruby 4.0 in bundled_gems.yml
Detect previous Ruby version in update script
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Read include/ruby/version.h to compute the previous Ruby version and
use it as the default FROM argument in
tool/update-NEWS-github-release.rb.

Add a workflow step to run the script for Ruby 4.0 in bundled_gems.yml
Detect previous Ruby version in update script
</pre>
</div>
</content>
</entry>
</feed>
