100 lines
3.4 KiB
Ruby
Raw Normal View History

2021-01-20 01:26:12 -05:00
# typed: true
# frozen_string_literal: true
require "cli/parser"
2021-01-21 17:43:52 -05:00
require "release_notes"
2021-01-20 01:26:12 -05:00
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::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::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?
2021-01-21 17:43:52 -05:00
Version.new "#{latest_version.major.to_i + 1}.0.0"
2021-01-20 01:26:12 -05:00
elsif args.minor?
2021-01-21 17:43:52 -05:00
Version.new "#{latest_version.major}.#{latest_version.minor.to_i + 1}.0"
2021-01-20 01:26:12 -05:00
else
2021-01-21 17:43:52 -05:00
Version.new "#{latest_version.major}.#{latest_version.minor}.#{latest_version.patch.to_i + 1}"
2021-01-20 01:26:12 -05:00
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", markdown: true)
.lines
.reject { |l| l.include?(" (@Homebrew)") }
.map { |l| l.gsub(/ \(@[\w-]+\)$/, "") }
.sort
end
2021-01-20 01:26:12 -05:00
ohai "Creating draft release for version #{new_version}"
2021-01-21 17:43:52 -05:00
2021-01-20 01:26:12 -05:00
release_notes = if args.major? || args.minor?
2021-01-21 17:43:52 -05:00
"Release notes for this release can be found on the [Homebrew blog](https://brew.sh/blog/#{new_version}).\n"
2021-01-20 01:26:12 -05:00
else
2021-01-21 17:43:52 -05:00
""
2021-01-20 01:26:12 -05:00
end
2021-01-21 17:43:52 -05:00
release_notes += ReleaseNotes.generate_release_notes latest_version, "origin/HEAD", markdown: true
2021-01-20 01:26:12 -05:00
begin
2021-01-21 17:43:52 -05:00
release = GitHub.create_or_update_release "Homebrew", "brew", new_version, body: release_notes, draft: true
2021-01-20 01:26:12 -05:00
rescue *GitHub::API_ERRORS => e
odie "Unable to create release: #{e.message}!"
end
puts release["html_url"]
exec_browser release["html_url"]
end
end