Port Homebrew::DevCmd::Release
This commit is contained in:
parent
6d362ccb3b
commit
177bab38c7
@ -1,100 +1,99 @@
|
|||||||
# typed: true
|
# typed: strict
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "abstract_command"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module_function
|
module DevCmd
|
||||||
|
class Release < AbstractCommand
|
||||||
|
cmd_args do
|
||||||
|
description <<~EOS
|
||||||
|
Create a new draft Homebrew/brew release with the appropriate version number and release notes.
|
||||||
|
|
||||||
sig { returns(CLI::Parser) }
|
By default, `brew release` will bump the patch version number. Pass
|
||||||
def release_args
|
`--major` or `--minor` to bump the major or minor version numbers, respectively.
|
||||||
Homebrew::CLI::Parser.new do
|
The command will fail if the previous major or minor release was made less than
|
||||||
description <<~EOS
|
one month ago.
|
||||||
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
|
*Note:* Requires write access to the Homebrew/brew repository.
|
||||||
`--major` or `--minor` to bump the major or minor version numbers, respectively.
|
EOS
|
||||||
The command will fail if the previous major or minor release was made less than
|
switch "--major",
|
||||||
one month ago.
|
description: "Create a major release."
|
||||||
|
switch "--minor",
|
||||||
|
description: "Create a minor release."
|
||||||
|
conflicts "--major", "--minor"
|
||||||
|
|
||||||
*Note:* Requires write access to the Homebrew/brew repository.
|
named_args :none
|
||||||
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
|
end
|
||||||
|
|
||||||
if latest_major_minor_release.blank?
|
sig { override.void }
|
||||||
opoo "Unable to determine the release date of the latest major/minor release."
|
def run
|
||||||
elsif Date.parse(latest_major_minor_release["published_at"]) > one_month_ago
|
safe_system "git", "-C", HOMEBREW_REPOSITORY, "fetch", "origin" if Homebrew::EnvConfig.no_auto_update?
|
||||||
odie "The latest major/minor release was less than one month ago."
|
|
||||||
|
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 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.filter_map do |line|
|
||||||
|
next unless (match = line.match(/^\* (.*) by @[\w-]+ in (.*)$/))
|
||||||
|
|
||||||
|
"- [#{match[1]}](#{match[2]})"
|
||||||
|
end.sort
|
||||||
|
puts blog_post_notes
|
||||||
|
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 += 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
|
||||||
|
rescue *GitHub::API::ERRORS => e
|
||||||
|
odie "Unable to create release: #{e.message}!"
|
||||||
|
end
|
||||||
|
|
||||||
|
puts release["html_url"]
|
||||||
|
exec_browser release["html_url"]
|
||||||
end
|
end
|
||||||
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 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.filter_map do |line|
|
|
||||||
next unless (match = line.match(/^\* (.*) by @[\w-]+ in (.*)$/))
|
|
||||||
|
|
||||||
"- [#{match[1]}](#{match[2]})"
|
|
||||||
end.sort
|
|
||||||
puts blog_post_notes
|
|
||||||
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 += 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
|
|
||||||
rescue *GitHub::API::ERRORS => e
|
|
||||||
odie "Unable to create release: #{e.message}!"
|
|
||||||
end
|
|
||||||
|
|
||||||
puts release["html_url"]
|
|
||||||
exec_browser release["html_url"]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "cmd/shared_examples/args_parse"
|
require "cmd/shared_examples/args_parse"
|
||||||
|
require "dev-cmd/release"
|
||||||
|
|
||||||
RSpec.describe "brew release" do
|
RSpec.describe Homebrew::DevCmd::Release do
|
||||||
it_behaves_like "parseable arguments"
|
it_behaves_like "parseable arguments"
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user