Use GitHub API to generate release notes
This commit is contained in:
parent
92749f9c52
commit
4f1bbf003a
@ -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
|
||||
|
@ -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
|
@ -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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user