Add ReleaseNotes module

This commit is contained in:
Rylan Polster 2021-01-21 17:43:52 -05:00
parent be02591cb6
commit e1f73e407a
No known key found for this signature in database
GPG Key ID: 46A744940CFF4D64
3 changed files with 47 additions and 33 deletions

View File

@ -2,6 +2,7 @@
# frozen_string_literal: true
require "cli/parser"
require "release_notes"
module Homebrew
extend T::Sig
@ -55,25 +56,9 @@ module Homebrew
odie "Ref #{ref} does not exist!"
end
output = Utils.popen_read(
"git", "-C", HOMEBREW_REPOSITORY, "log", "--pretty=format:'%s >> - %b%n'", "#{previous_tag}..#{end_ref}"
).lines.grep(/Merge pull request/)
output.map! do |s|
s.gsub(%r{.*Merge pull request #(\d+) from ([^/]+)/[^>]*(>>)*},
"https://github.com/Homebrew/brew/pull/\\1 (@\\2)")
end
if args.markdown?
output.map! do |s|
/(.*\d)+ \(@(.+)\) - (.*)/ =~ s
"- [#{Regexp.last_match(3)}](#{Regexp.last_match(1)}) (@#{Regexp.last_match(2)})"
end
end
release_notes = ReleaseNotes.generate_release_notes previous_tag, end_ref, markdown: T.must(args.markdown?)
$stderr.puts "Release notes between #{previous_tag} and #{end_ref}:"
if args.markdown? && args.named.first
puts "Release notes for major and minor releases can be found in the [Homebrew blog](https://brew.sh/blog/)."
end
puts output
puts release_notes
end
end

View File

@ -2,6 +2,7 @@
# frozen_string_literal: true
require "cli/parser"
require "release_notes"
module Homebrew
extend T::Sig
@ -59,31 +60,24 @@ module Homebrew
end
new_version = if args.major?
Version.new [latest_version.major.to_i + 1, 0, 0].join(".")
Version.new "#{latest_version.major.to_i + 1}.0.0"
elsif args.minor?
Version.new [latest_version.major, latest_version.minor.to_i + 1, 0].join(".")
Version.new "#{latest_version.major}.#{latest_version.minor.to_i + 1}.0"
else
Version.new [latest_version.major, latest_version.minor, latest_version.patch.to_i + 1].join(".")
Version.new "#{latest_version.major}.#{latest_version.minor}.#{latest_version.patch.to_i + 1}"
end.to_s
ohai "Creating draft release for version #{new_version}"
release_notes = if args.major? || args.minor?
["Release notes for this release can be found on the [Homebrew blog](https://brew.sh/blog/#{new_version})."]
"Release notes for this release can be found on the [Homebrew blog](https://brew.sh/blog/#{new_version}).\n"
else
[]
end
release_notes += Utils.popen_read(
"git", "-C", HOMEBREW_REPOSITORY, "log", "--pretty=format:'%s >> - %b%n'", "#{latest_version}..origin/HEAD"
).lines.grep(/Merge pull request/).map! do |s|
pr = s.gsub(%r{.*Merge pull request #(\d+) from ([^/]+)/[^>]*(>>)*},
"https://github.com/Homebrew/brew/pull/\\1 (@\\2)")
/(.*\d)+ \(@(.+)\) - (.*)/ =~ pr
"- [#{Regexp.last_match(3)}](#{Regexp.last_match(1)}) (@#{Regexp.last_match(2)})"
""
end
release_notes += ReleaseNotes.generate_release_notes latest_version, "origin/HEAD", markdown: true
begin
release = GitHub.create_or_update_release "Homebrew", "brew", new_version,
body: release_notes.join("\n"), draft: true
release = GitHub.create_or_update_release "Homebrew", "brew", new_version, body: release_notes, draft: true
rescue *GitHub::API_ERRORS => e
odie "Unable to create release: #{e.message}!"
end

View File

@ -0,0 +1,35 @@
# typed: true
# 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::Boolean)
.returns(String)
}
def generate_release_notes(start_ref, end_ref, markdown: false)
log_output = Utils.popen_read(
"git", "-C", HOMEBREW_REPOSITORY, "log", "--pretty=format:'%s >> - %b%n'", "#{start_ref}..#{end_ref}"
).lines.grep(/Merge pull request/)
log_output.map! do |s|
s.gsub(%r{.*Merge pull request #(\d+) from ([^/]+)/[^>]*(>>)*},
"https://github.com/Homebrew/brew/pull/\\1 (@\\2)")
end
if markdown
log_output.map! do |s|
/(.*\d)+ \(@(.+)\) - (.*)/ =~ s
"- [#{Regexp.last_match(3)}](#{Regexp.last_match(1)}) (@#{Regexp.last_match(2)})\n"
end
end
log_output.join
end
end