Skip to content

Commit 466f675

Browse files
hsbtclaude
andcommitted
Handle network failures in NEWS.md updater
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) <noreply@anthropic.com>
1 parent 13df62b commit 466f675

1 file changed

Lines changed: 22 additions & 5 deletions

File tree

tool/update-NEWS-github-release.rb

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
# Build a gem=>version map from stdgems.org stdgems.json for a given Ruby version (e.g., "3.4")
2222
def fetch_default_gems_versions(ruby_version)
2323
uri = URI.parse("https://stdgems.org/stdgems.json")
24-
json = JSON.parse(Net::HTTP.get(uri))
24+
body = http_get(uri)
25+
json = JSON.parse(body)
2526
gems = json["gems"] || []
2627

2728
map = {}
@@ -92,13 +93,24 @@ def fetch_versions_to_from_news(arg)
9293
if arg.downcase == "news"
9394
body = read_local_news_md
9495
else
95-
uri = URI.parse(arg)
96-
body = Net::HTTP.get(uri)
96+
body = http_get(URI.parse(arg))
9797
end
9898

9999
parse_stdlib_versions_from_news(body)
100100
end
101101

102+
# Fetch a URL with a clear abort message on network or HTTP failures.
103+
# Used for sources whose absence makes the rest of the script meaningless.
104+
def http_get(uri)
105+
res = Net::HTTP.get_response(uri)
106+
unless res.is_a?(Net::HTTPSuccess)
107+
abort "error: #{uri} returned HTTP #{res.code} #{res.message}"
108+
end
109+
res.body
110+
rescue SystemCallError, SocketError, IOError, Net::HTTPError => e
111+
abort "error: failed to fetch #{uri}: #{e.class}: #{e.message}"
112+
end
113+
102114
def read_local_news_md
103115
news_path = File.join(__dir__, "..", "NEWS.md")
104116
unless File.exist?(news_path)
@@ -159,8 +171,13 @@ def resolve_repo(name)
159171

160172
def fetch_release_range(name, from_version, to_version, org, repo)
161173
releases = []
162-
Octokit.releases("#{org}/#{repo}").each do |release|
163-
releases << release.tag_name
174+
begin
175+
Octokit.releases("#{org}/#{repo}").each do |release|
176+
releases << release.tag_name
177+
end
178+
rescue Octokit::Error, Faraday::Error => e
179+
warn "warning: skipping #{name} (#{org}/#{repo}): #{e.class}: #{e.message}"
180+
return nil
164181
end
165182

166183
# Keep only version-like tags and sort ascending by semantic version

0 commit comments

Comments
 (0)