From 4f1bbf003ad1ad3523cdc59a04d49e0973d05090 Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Mon, 4 Oct 2021 17:43:35 -0400 Subject: [PATCH] Use GitHub API to generate release notes --- Library/Homebrew/dev-cmd/release.rb | 19 +++++++------ Library/Homebrew/release_notes.rb | 30 --------------------- Library/Homebrew/test/release_notes_spec.rb | 28 ------------------- Library/Homebrew/utils/github.rb | 7 +++++ 4 files changed, 18 insertions(+), 66 deletions(-) delete mode 100644 Library/Homebrew/release_notes.rb delete mode 100644 Library/Homebrew/test/release_notes_spec.rb diff --git a/Library/Homebrew/dev-cmd/release.rb b/Library/Homebrew/dev-cmd/release.rb index 2c22ff7aa3..e7e87a4486 100755 --- a/Library/Homebrew/dev-cmd/release.rb +++ b/Library/Homebrew/dev-cmd/release.rb @@ -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 diff --git a/Library/Homebrew/release_notes.rb b/Library/Homebrew/release_notes.rb deleted file mode 100644 index a5446fd1fd..0000000000 --- a/Library/Homebrew/release_notes.rb +++ /dev/null @@ -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 #(?\d+) from (?[^/]+)/[^>]*>> - (?.*)}) - 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 diff --git a/Library/Homebrew/test/release_notes_spec.rb b/Library/Homebrew/test/release_notes_spec.rb deleted file mode 100644 index f61fdf47ca..0000000000 --- a/Library/Homebrew/test/release_notes_spec.rb +++ /dev/null @@ -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 diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 5015686b57..ef3fa379bd 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -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