diff --git a/Library/Homebrew/dev-cmd/release-notes.rb b/Library/Homebrew/dev-cmd/release-notes.rb index 53df526193..b77b265456 100644 --- a/Library/Homebrew/dev-cmd/release-notes.rb +++ b/Library/Homebrew/dev-cmd/release-notes.rb @@ -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 diff --git a/Library/Homebrew/dev-cmd/release.rb b/Library/Homebrew/dev-cmd/release.rb index 0863c4ab09..a283474281 100755 --- a/Library/Homebrew/dev-cmd/release.rb +++ b/Library/Homebrew/dev-cmd/release.rb @@ -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 diff --git a/Library/Homebrew/release_notes.rb b/Library/Homebrew/release_notes.rb new file mode 100644 index 0000000000..9ae0d6fc4a --- /dev/null +++ b/Library/Homebrew/release_notes.rb @@ -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