Mike McQuaid 08c96df947
release_notes: refactor/cleanup.
This was failing for me locally so I've made some fixes:
- remove the `markdown` flag (as it's the only path now)
- refactor the generation to not use intermediate variables
- discard more weird cases rather than erroring
- exclude @Homebrew changes (e.g. from bots) because we don't care about
  these in the release notes
2021-06-21 14:25:01 +01:00

100 lines
3.3 KiB
Ruby
Executable File

# typed: true
# frozen_string_literal: true
require "cli/parser"
require "release_notes"
module Homebrew
extend T::Sig
module_function
sig { returns(CLI::Parser) }
def release_args
Homebrew::CLI::Parser.new do
description <<~EOS
Create a new draft Homebrew/brew release with the appropriate version number and release notes.
By default, `brew release` will bump the patch version number. Pass
`--major` or `--minor` to bump the major or minor version numbers, respectively.
The command will fail if the previous major or minor release was made less than
one month ago.
Requires write access to the Homebrew/brew repository.
EOS
switch "--major",
description: "Create a major release."
switch "--minor",
description: "Create a minor release."
conflicts "--major", "--minor"
named_args :none
end
end
def release
args = release_args.parse
safe_system "git", "-C", HOMEBREW_REPOSITORY, "fetch", "origin" if Homebrew::EnvConfig.no_auto_update?
begin
latest_release = GitHub.get_latest_release "Homebrew", "brew"
rescue GitHub::API::HTTPNotFoundError
odie "No existing releases found!"
end
latest_version = Version.new latest_release["tag_name"]
if args.major? || args.minor?
one_month_ago = Date.today << 1
latest_major_minor_release = begin
GitHub.get_release "Homebrew", "brew", "#{latest_version.major_minor}.0"
rescue GitHub::API::HTTPNotFoundError
nil
end
if latest_major_minor_release.blank?
opoo "Unable to determine the release date of the latest major/minor release."
elsif Date.parse(latest_major_minor_release["published_at"]) > one_month_ago
odie "The latest major/minor release was less than one month ago."
end
end
new_version = if args.major?
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"
else
Version.new "#{latest_version.major}.#{latest_version.minor}.#{latest_version.patch.to_i + 1}"
end.to_s
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
end
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}).\n"
else
""
end
release_notes += ReleaseNotes.generate_release_notes latest_version, "origin/HEAD"
begin
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
puts release["html_url"]
exec_browser release["html_url"]
end
end