utils/github: add create_bump_pr

This commit is contained in:
Seeker 2020-09-04 06:18:34 -07:00
parent 2314ddf9f5
commit 51d167c122
2 changed files with 97 additions and 73 deletions

View File

@ -340,64 +340,19 @@ module Homebrew
run_audit(formula, alias_rename, old_contents, args: args)
formula.path.parent.cd do
_, base_branch = origin_branch.split("/")
branch = "bump-#{formula.name}-#{new_formula_version}"
git_dir = Utils.popen_read("git rev-parse --git-dir").chomp
shallow = !git_dir.empty? && File.exist?("#{git_dir}/shallow")
changed_files = [formula.path]
changed_files += alias_rename if alias_rename.present?
if args.dry_run? || (args.write? && !args.commit?)
ohai "try to fork repository with GitHub API" unless args.no_fork?
ohai "git fetch --unshallow origin" if shallow
ohai "git add #{alias_rename.first} #{alias_rename.last}" if alias_rename.present?
ohai "git checkout --no-track -b #{branch} #{origin_branch}"
ohai "git commit --no-edit --verbose --message='#{formula.name} " \
"#{new_formula_version}' -- #{changed_files.join(" ")}"
ohai "git push --set-upstream $HUB_REMOTE #{branch}:#{branch}"
ohai "git checkout --quiet #{previous_branch}"
ohai "create pull request with GitHub API (base branch: #{base_branch})"
else
safe_system "git", "fetch", "--unshallow", "origin" if shallow && !args.commit?
safe_system "git", "add", *alias_rename if alias_rename.present?
safe_system "git", "checkout", "--no-track", "-b", branch, origin_branch unless args.commit?
safe_system "git", "commit", "--no-edit", "--verbose",
"--message=#{formula.name} #{new_formula_version}",
"--", *changed_files
return if args.commit?
remote_url, username = determine_remote_and_username(formula, tap_full_name, old_contents, args: args)
safe_system "git", "push", "--set-upstream", remote_url, "#{branch}:#{branch}"
safe_system "git", "checkout", "--quiet", previous_branch
pr_message = <<~EOS
Created with `brew bump-formula-pr`.
EOS
user_message = args.message
if user_message
pr_message += <<~EOS
---
#{user_message}
EOS
end
pr_title = "#{formula.name} #{new_formula_version}"
begin
url = GitHub.create_pull_request(tap_full_name, pr_title,
"#{username}:#{branch}", base_branch, pr_message)["html_url"]
if args.no_browse?
puts url
else
exec_browser url
end
rescue *GitHub.api_errors => e
odie "Unable to open pull request: #{e.message}!"
end
end
end
pr_info = {
sourcefile_path: formula.path,
old_contents: old_contents,
additional_files: alias_rename,
origin_branch: origin_branch,
branch_name: "bump-#{formula.name}-#{new_formula_version}",
commit_message: "#{formula.name} #{new_formula_version}",
previous_branch: previous_branch,
tap: formula.tap,
tap_full_name: tap_full_name,
pr_message: "Created with `brew bump-formula-pr`.",
}
GitHub.create_bump_pr(pr_info, args: args)
end
def determine_formula_from_url(url)
@ -507,19 +462,4 @@ module Homebrew
FileUtils.mv alias_rename.last, alias_rename.first if alias_rename.present?
odie "`brew audit` failed!"
end
def determine_remote_and_username(formula, tap_full_name, old_contents, args:)
if args.no_fork?
remote_url = Utils.popen_read("git remote get-url --push origin").chomp
username = formula.tap.user
[remote_url, username]
else
begin
GitHub.forked_repo_info!(tap_full_name)
rescue *GitHub.api_errors => e
formula.path.atomic_write(old_contents)
odie "Unable to fork: #{e.message}!"
end
end
end
end

View File

@ -630,4 +630,88 @@ module GitHub
username = response.fetch("owner").fetch("login")
[remote_url, username]
end
def create_bump_pr(info, args:)
sourcefile_path = info[:sourcefile_path]
old_contents = info[:old_contents]
additional_files = info[:additional_files] || []
origin_branch = info[:origin_branch]
branch = info[:branch_name]
commit_message = info[:commit_message]
previous_branch = info[:previous_branch]
tap = info[:tap]
tap_full_name = info[:tap_full_name]
pr_message = info[:pr_message]
sourcefile_path.parent.cd do
_, base_branch = origin_branch.split("/")
git_dir = Utils.popen_read("git rev-parse --git-dir").chomp
shallow = !git_dir.empty? && File.exist?("#{git_dir}/shallow")
changed_files = [sourcefile_path]
changed_files += additional_files if additional_files.present?
if args.dry_run? || (args.write? && !args.commit?)
ohai "try to fork repository with GitHub API" unless args.no_fork?
ohai "git fetch --unshallow origin" if shallow
ohai "git add #{changed_files.join(" ")}"
ohai "git checkout --no-track -b #{branch} #{origin_branch}"
ohai "git commit --no-edit --verbose --message='#{commit_message}'" \
" -- #{changed_files.join(" ")}"
ohai "git push --set-upstream $HUB_REMOTE #{branch}:#{branch}"
ohai "git checkout --quiet #{previous_branch}"
ohai "create pull request with GitHub API (base branch: #{base_branch})"
else
unless args.commit?
if args.no_fork?
remote_url = Utils.popen_read("git remote get-url --push origin").chomp
username = tap.user
else
begin
remote_url, username = GitHub.forked_repo_info!(tap_full_name)
rescue *GitHub.api_errors => e
sourcefile_path.atomic_write(old_contents)
odie "Unable to fork: #{e.message}!"
end
end
safe_system "git", "fetch", "--unshallow", "origin" if shallow
end
safe_system "git", "add", *changed_files
safe_system "git", "checkout", "--no-track", "-b", branch, origin_branch unless args.commit?
safe_system "git", "commit", "--no-edit", "--verbose",
"--message=#{commit_message}",
"--", *changed_files
return if args.commit?
safe_system "git", "push", "--set-upstream", remote_url, "#{branch}:#{branch}"
safe_system "git", "checkout", "--quiet", previous_branch
pr_message = <<~EOS
#{pr_message}
EOS
user_message = args.message
if user_message
pr_message += <<~EOS
---
#{user_message}
EOS
end
begin
url = GitHub.create_pull_request(tap_full_name, commit_message,
"#{username}:#{branch}", base_branch, pr_message)["html_url"]
if args.no_browse?
puts url
else
exec_browser url
end
rescue *GitHub.api_errors => e
odie "Unable to open pull request: #{e.message}!"
end
end
end
end
end