Use GitHub API to generate release notes

This commit is contained in:
Rylan Polster 2021-10-04 17:43:35 -04:00
parent 92749f9c52
commit 4f1bbf003a
No known key found for this signature in database
GPG Key ID: 46A744940CFF4D64
4 changed files with 18 additions and 66 deletions

View File

@ -2,7 +2,6 @@
# frozen_string_literal: true
require "cli/parser"
require "release_notes"
module Homebrew
extend T::Sig
@ -70,12 +69,15 @@ module Homebrew
if args.major? || args.minor?
latest_major_minor_version = "#{latest_version.major}.#{latest_version.minor.to_i}.0"
ohai "Release notes since #{latest_major_minor_version} for #{new_version} blog post:"
# release notes without username suffix or dependabot bumps
puts ReleaseNotes.generate_release_notes(latest_major_minor_version, "origin/HEAD")
.lines
.reject { |l| l.include?(" (@Homebrew)") }
.map { |l| l.gsub(/ \(@[\w-]+\)$/, "") }
.sort
# release notes without usernames, new contributors, or extra lines
blog_post_notes = GitHub.generate_release_notes("Homebrew", "brew", new_version,
previous_tag: latest_major_minor_version)["body"]
blog_post_notes = blog_post_notes.lines.map do |line|
next unless (match = line.match(/^\* (.*) by @[\w-]+ in (.*)$/))
"- [#{match[1]}](#{match[2]})"
end.compact.sort
puts blog_post_notes
end
ohai "Creating draft release for version #{new_version}"
@ -85,7 +87,8 @@ module Homebrew
else
""
end
release_notes += ReleaseNotes.generate_release_notes latest_version, "origin/HEAD"
release_notes += GitHub.generate_release_notes("Homebrew", "brew", new_version,
previous_tag: latest_version)["body"]
begin
release = GitHub.create_or_update_release "Homebrew", "brew", new_version, body: release_notes, draft: true

View File

@ -1,30 +0,0 @@
# typed: strict
# frozen_string_literal: true
# Helper functions for generating release notes.
#
# @api private
module ReleaseNotes
extend T::Sig
module_function
sig {
params(start_ref: T.any(String, Version), end_ref: T.any(String, Version), markdown: T.nilable(T::Boolean))
.returns(String)
}
def generate_release_notes(start_ref, end_ref, markdown: false)
Utils.safe_popen_read(
"git", "-C", HOMEBREW_REPOSITORY, "log", "--pretty=format:'%s >> - %b%n'", "#{start_ref}..#{end_ref}"
).lines.map do |s|
matches = s.match(%r{.*Merge pull request #(?<pr>\d+) from (?<user>[^/]+)/[^>]*>> - (?<body>.*)})
next if matches.blank?
next if matches[:user] == "Homebrew"
body = matches[:body].presence
body ||= s.gsub(/.*(Merge pull request .*) >> - .*/, "\\1").chomp
"- [#{body}](https://github.com/Homebrew/brew/pull/#{matches[:pr]}) (@#{matches[:user]})\n"
end.compact.join
end
end

View File

@ -1,28 +0,0 @@
# typed: false
# frozen_string_literal: true
require "release_notes"
describe ReleaseNotes do
before do
HOMEBREW_REPOSITORY.cd do
system "git", "init"
system "git", "commit", "--allow-empty", "-m", "Initial commit"
system "git", "tag", "release-notes-testing"
system "git", "commit", "--allow-empty", "-m", "Merge pull request #1 from Homebrew/fix", "-m", "Do something"
system "git", "commit", "--allow-empty", "-m", "make a change"
system "git", "commit", "--allow-empty", "-m", "Merge pull request #2 from User/fix", "-m", "Do something else"
system "git", "commit", "--allow-empty", "-m", "another change"
system "git", "commit", "--allow-empty", "-m", "Merge pull request #3 from User/another_change"
end
end
describe ".generate_release_notes" do
it "generates markdown release notes" do
expect(described_class.generate_release_notes("release-notes-testing", "HEAD")).to eq <<~NOTES
- [Merge pull request #3 from User/another_change](https://github.com/Homebrew/brew/pull/3) (@User)
- [Do something else](https://github.com/Homebrew/brew/pull/2) (@User)
NOTES
end
end
end

View File

@ -225,6 +225,13 @@ module GitHub
API.open_rest(url, request_method: :GET)
end
def generate_release_notes(user, repo, tag, previous_tag: nil)
url = "#{API_URL}/repos/#{user}/#{repo}/releases/generate-notes"
data = { tag_name: tag }
data[:previous_tag_name] = previous_tag if previous_tag.present?
API.open_rest(url, data: data, request_method: :POST, scopes: CREATE_ISSUE_FORK_OR_PR_SCOPES)
end
def create_or_update_release(user, repo, tag, id: nil, name: nil, body: nil, draft: false)
url = "#{API_URL}/repos/#{user}/#{repo}/releases"
method = if id