Use GitHub API to generate release notes
This commit is contained in:
parent
92749f9c52
commit
4f1bbf003a
@ -2,7 +2,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
require "release_notes"
|
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
@ -70,12 +69,15 @@ module Homebrew
|
|||||||
if args.major? || args.minor?
|
if args.major? || args.minor?
|
||||||
latest_major_minor_version = "#{latest_version.major}.#{latest_version.minor.to_i}.0"
|
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:"
|
ohai "Release notes since #{latest_major_minor_version} for #{new_version} blog post:"
|
||||||
# release notes without username suffix or dependabot bumps
|
# release notes without usernames, new contributors, or extra lines
|
||||||
puts ReleaseNotes.generate_release_notes(latest_major_minor_version, "origin/HEAD")
|
blog_post_notes = GitHub.generate_release_notes("Homebrew", "brew", new_version,
|
||||||
.lines
|
previous_tag: latest_major_minor_version)["body"]
|
||||||
.reject { |l| l.include?(" (@Homebrew)") }
|
blog_post_notes = blog_post_notes.lines.map do |line|
|
||||||
.map { |l| l.gsub(/ \(@[\w-]+\)$/, "") }
|
next unless (match = line.match(/^\* (.*) by @[\w-]+ in (.*)$/))
|
||||||
.sort
|
|
||||||
|
"- [#{match[1]}](#{match[2]})"
|
||||||
|
end.compact.sort
|
||||||
|
puts blog_post_notes
|
||||||
end
|
end
|
||||||
|
|
||||||
ohai "Creating draft release for version #{new_version}"
|
ohai "Creating draft release for version #{new_version}"
|
||||||
@ -85,7 +87,8 @@ module Homebrew
|
|||||||
else
|
else
|
||||||
""
|
""
|
||||||
end
|
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
|
begin
|
||||||
release = GitHub.create_or_update_release "Homebrew", "brew", new_version, body: release_notes, draft: true
|
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)
|
API.open_rest(url, request_method: :GET)
|
||||||
end
|
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)
|
def create_or_update_release(user, repo, tag, id: nil, name: nil, body: nil, draft: false)
|
||||||
url = "#{API_URL}/repos/#{user}/#{repo}/releases"
|
url = "#{API_URL}/repos/#{user}/#{repo}/releases"
|
||||||
method = if id
|
method = if id
|
||||||
|
Loading…
x
Reference in New Issue
Block a user