Port Homebrew::DevCmd::PrAutomerge
This commit is contained in:
parent
d15f99514c
commit
972e853ec0
@ -1,87 +1,86 @@
|
||||
# typed: true
|
||||
# typed: strict
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "abstract_command"
|
||||
require "cli/parser"
|
||||
require "utils/github"
|
||||
|
||||
module Homebrew
|
||||
module_function
|
||||
module DevCmd
|
||||
class PrAutomerge < AbstractCommand
|
||||
cmd_args do
|
||||
description <<~EOS
|
||||
Find pull requests that can be automatically merged using `brew pr-publish`.
|
||||
EOS
|
||||
flag "--tap=",
|
||||
description: "Target tap repository (default: `homebrew/core`)."
|
||||
flag "--workflow=",
|
||||
description: "Workflow file to use with `brew pr-publish`."
|
||||
flag "--with-label=",
|
||||
description: "Pull requests must have this label."
|
||||
comma_array "--without-labels",
|
||||
description: "Pull requests must not have these labels (default: " \
|
||||
"`do not merge`, `new formula`, `automerge-skip`, " \
|
||||
"`pre-release`, `CI-published-bottle-commits`)."
|
||||
switch "--without-approval",
|
||||
description: "Pull requests do not require approval to be merged."
|
||||
switch "--publish",
|
||||
description: "Run `brew pr-publish` on matching pull requests."
|
||||
switch "--autosquash",
|
||||
description: "Instruct `brew pr-publish` to automatically reformat and reword commits " \
|
||||
"in the pull request to the preferred format."
|
||||
switch "--no-autosquash",
|
||||
description: "Instruct `brew pr-publish` to skip automatically reformatting and rewording commits " \
|
||||
"in the pull request to the preferred format.",
|
||||
disable: true, # odisabled: remove this switch with 4.3.0
|
||||
hidden: true
|
||||
switch "--ignore-failures",
|
||||
description: "Include pull requests that have failing status checks."
|
||||
|
||||
sig { returns(CLI::Parser) }
|
||||
def pr_automerge_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
description <<~EOS
|
||||
Find pull requests that can be automatically merged using `brew pr-publish`.
|
||||
EOS
|
||||
flag "--tap=",
|
||||
description: "Target tap repository (default: `homebrew/core`)."
|
||||
flag "--workflow=",
|
||||
description: "Workflow file to use with `brew pr-publish`."
|
||||
flag "--with-label=",
|
||||
description: "Pull requests must have this label."
|
||||
comma_array "--without-labels",
|
||||
description: "Pull requests must not have these labels (default: " \
|
||||
"`do not merge`, `new formula`, `automerge-skip`, " \
|
||||
"`pre-release`, `CI-published-bottle-commits`)."
|
||||
switch "--without-approval",
|
||||
description: "Pull requests do not require approval to be merged."
|
||||
switch "--publish",
|
||||
description: "Run `brew pr-publish` on matching pull requests."
|
||||
switch "--autosquash",
|
||||
description: "Instruct `brew pr-publish` to automatically reformat and reword commits " \
|
||||
"in the pull request to the preferred format."
|
||||
switch "--no-autosquash",
|
||||
description: "Instruct `brew pr-publish` to skip automatically reformatting and rewording commits " \
|
||||
"in the pull request to the preferred format.",
|
||||
disable: true, # odisabled: remove this switch with 4.3.0
|
||||
hidden: true
|
||||
switch "--ignore-failures",
|
||||
description: "Include pull requests that have failing status checks."
|
||||
named_args :none
|
||||
end
|
||||
|
||||
named_args :none
|
||||
end
|
||||
end
|
||||
sig { override.void }
|
||||
def run
|
||||
without_labels = args.without_labels || [
|
||||
"do not merge",
|
||||
"new formula",
|
||||
"automerge-skip",
|
||||
"pre-release",
|
||||
"CI-published-bottle-commits",
|
||||
]
|
||||
tap = Tap.fetch(args.tap || CoreTap.instance.name)
|
||||
|
||||
def pr_automerge
|
||||
args = pr_automerge_args.parse
|
||||
query = "is:pr is:open repo:#{tap.full_name} draft:false"
|
||||
query += args.ignore_failures? ? " -status:pending" : " status:success"
|
||||
query += " review:approved" unless args.without_approval?
|
||||
query += " label:\"#{args.with_label}\"" if args.with_label
|
||||
without_labels.each { |label| query += " -label:\"#{label}\"" }
|
||||
odebug "Searching: #{query}"
|
||||
|
||||
without_labels = args.without_labels || [
|
||||
"do not merge",
|
||||
"new formula",
|
||||
"automerge-skip",
|
||||
"pre-release",
|
||||
"CI-published-bottle-commits",
|
||||
]
|
||||
tap = Tap.fetch(args.tap || CoreTap.instance.name)
|
||||
prs = GitHub.search_issues query
|
||||
if prs.blank?
|
||||
ohai "No matching pull requests!"
|
||||
return
|
||||
end
|
||||
|
||||
query = "is:pr is:open repo:#{tap.full_name} draft:false"
|
||||
query += args.ignore_failures? ? " -status:pending" : " status:success"
|
||||
query += " review:approved" unless args.without_approval?
|
||||
query += " label:\"#{args.with_label}\"" if args.with_label
|
||||
without_labels&.each { |label| query += " -label:\"#{label}\"" }
|
||||
odebug "Searching: #{query}"
|
||||
ohai "#{prs.count} matching pull #{Utils.pluralize("request", prs.count)}:"
|
||||
pr_urls = []
|
||||
prs.each do |pr|
|
||||
puts "#{tap.full_name unless tap.core_tap?}##{pr["number"]}: #{pr["title"]}"
|
||||
pr_urls << pr["html_url"]
|
||||
end
|
||||
|
||||
prs = GitHub.search_issues query
|
||||
if prs.blank?
|
||||
ohai "No matching pull requests!"
|
||||
return
|
||||
end
|
||||
|
||||
ohai "#{prs.count} matching pull #{Utils.pluralize("request", prs.count)}:"
|
||||
pr_urls = []
|
||||
prs.each do |pr|
|
||||
puts "#{tap.full_name unless tap.core_tap?}##{pr["number"]}: #{pr["title"]}"
|
||||
pr_urls << pr["html_url"]
|
||||
end
|
||||
|
||||
publish_args = ["pr-publish"]
|
||||
publish_args << "--tap=#{tap}" if tap
|
||||
publish_args << "--workflow=#{args.workflow}" if args.workflow
|
||||
publish_args << "--autosquash" if args.autosquash?
|
||||
if args.publish?
|
||||
safe_system HOMEBREW_BREW_FILE, *publish_args, *pr_urls
|
||||
else
|
||||
ohai "Now run:", " brew #{publish_args.join " "} \\\n #{pr_urls.join " \\\n "}"
|
||||
publish_args = ["pr-publish"]
|
||||
publish_args << "--tap=#{tap}" if tap
|
||||
publish_args << "--workflow=#{args.workflow}" if args.workflow
|
||||
publish_args << "--autosquash" if args.autosquash?
|
||||
if args.publish?
|
||||
safe_system HOMEBREW_BREW_FILE, *publish_args, *pr_urls
|
||||
else
|
||||
ohai "Now run:", " brew #{publish_args.join " "} \\\n #{pr_urls.join " \\\n "}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "cmd/shared_examples/args_parse"
|
||||
require "dev-cmd/pr-automerge"
|
||||
|
||||
RSpec.describe "brew pr-automerge" do
|
||||
RSpec.describe Homebrew::DevCmd::PrAutomerge do
|
||||
it_behaves_like "parseable arguments"
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user