Skip to content

Commit 6c5f122

Browse files
hsbtclaude
andcommitted
Generate sub-bullets for RubyGems and bundler
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) <noreply@anthropic.com>
1 parent 9d6deeb commit 6c5f122

1 file changed

Lines changed: 24 additions & 10 deletions

File tree

tool/update-NEWS-github-release.rb

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,16 @@ def resolve_repo(name)
206206
{ repo: name, org: "minitest" }
207207
when "test-unit"
208208
{ repo: name, org: "test-unit" }
209+
when "RubyGems"
210+
{ repo: "rubygems", org: "rubygems" }
211+
when "bundler"
212+
{ repo: "rubygems", org: "rubygems", tag_prefix: "bundler-" }
209213
else
210214
{ repo: name, org: "ruby" }
211215
end
212216
end
213217

214-
def fetch_release_range(name, from_version, to_version, org, repo)
218+
def fetch_release_range(name, from_version, to_version, org, repo, tag_prefix: "")
215219
releases = []
216220
begin
217221
Octokit.releases("#{org}/#{repo}").each do |release|
@@ -222,12 +226,18 @@ def fetch_release_range(name, from_version, to_version, org, repo)
222226
return nil
223227
end
224228

225-
# Keep only version-like tags and sort ascending by semantic version
226-
releases = releases.select { |t| t =~ /^v\d/ || t =~ /^\d/ }
227-
releases = releases.sort_by { |t| Gem::Version.new(t.sub(/^v/, "").tr("_", ".")) }
229+
# Keep only this gem's version-like tags and sort ascending by semantic version
230+
prefix = Regexp.escape(tag_prefix)
231+
releases = releases.select { |t| t =~ /\A#{prefix}v?\d/ }
232+
releases = releases.sort_by { |t| Gem::Version.new(t.sub(/\A#{prefix}/, "").sub(/^v/, "").tr("_", ".")) }
233+
234+
start_index = releases.index("#{tag_prefix}v#{from_version}") || releases.index("#{tag_prefix}#{from_version}")
235+
end_index = releases.index("#{tag_prefix}v#{to_version}") || releases.index("#{tag_prefix}#{to_version}")
236+
237+
# If the "to" version is unreleased (e.g. 4.1.0.dev), include every released
238+
# tag after the baseline up to the latest one available.
239+
end_index ||= releases.length - 1 if to_version =~ /(?:\.|-)(?:dev|beta|alpha|rc|pre)/i
228240

229-
start_index = releases.index("v#{from_version}") || releases.index(from_version)
230-
end_index = releases.index("v#{to_version}") || releases.index(to_version)
231241
return nil unless start_index && end_index
232242

233243
range = releases[start_index + 1..end_index]
@@ -242,18 +252,19 @@ def collect_gem_updates(versions_from, versions_to)
242252
versions_to.each do |name, version|
243253
# Skip items which do not exist in the FROM map to reduce API calls
244254
next unless versions_from.key?(name)
245-
next if name == "RubyGems" || name == "bundler"
246255

247256
info = resolve_repo(name)
248257
org = info[:org]
249258
repo = info[:repo]
259+
tag_prefix = info[:tag_prefix] || ""
250260

251-
release_range = fetch_release_range(name, versions_from[name], version, org, repo)
261+
release_range = fetch_release_range(name, versions_from[name], version, org, repo, tag_prefix: tag_prefix)
252262
next unless release_range
253263

254264
footnote_links = release_range.map do |rel|
265+
tag = rel.sub(/\A#{Regexp.escape(tag_prefix)}/, "")
255266
{
256-
ref: "#{name}-#{rel}",
267+
ref: "#{name}-#{tag}",
257268
url: "https://github.com/#{org}/#{repo}/releases/tag/#{rel}",
258269
}
259270
end
@@ -264,15 +275,18 @@ def collect_gem_updates(versions_from, versions_to)
264275
from_version: versions_from[name],
265276
release_range: release_range,
266277
footnote_links: footnote_links,
278+
tag_prefix: tag_prefix,
267279
}
268280
end
269281

270282
results
271283
end
272284

273285
def format_release_diff(result)
286+
prefix = Regexp.escape(result[:tag_prefix] || "")
274287
links = result[:release_range].map do |rel|
275-
"[#{rel}][#{result[:name]}-#{rel}]"
288+
tag = rel.sub(/\A#{prefix}/, "")
289+
"[#{tag}][#{result[:name]}-#{tag}]"
276290
end
277291
" * #{result[:from_version]} to #{links.join(', ')}"
278292
end

0 commit comments

Comments
 (0)