From f684a59fa5f8dfe6c1498bdd35d08d1e1ab60e92 Mon Sep 17 00:00:00 2001 From: Dustin Rodrigues Date: Sun, 14 Jun 2020 20:49:52 -0400 Subject: [PATCH] bump-formula-pr: search for closed dupe PRs --- Library/Homebrew/dev-cmd/bump-formula-pr.rb | 22 ++++++++++++--------- Library/Homebrew/exceptions.rb | 2 +- Library/Homebrew/utils/github.rb | 6 ++---- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb index c3426f0ae3..a718d92077 100644 --- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb +++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb @@ -147,7 +147,6 @@ module Homebrew raise FormulaUnspecifiedError unless formula tap_full_name, origin_branch, previous_branch = use_correct_linux_tap(formula) - check_for_duplicate_pull_requests(formula, tap_full_name) requested_spec, formula_spec = if args.devel? devel_message = " (devel)" @@ -315,6 +314,8 @@ module Homebrew new_formula_version = formula_version(formula, requested_spec, new_contents) + check_for_duplicate_pull_requests(formula, tap_full_name, new_formula_version.to_s) + if !new_mirrors && !formula_spec.mirrors.empty? if args.force? opoo "#{formula}: Removing all mirrors because a --mirror= argument was not specified." @@ -468,23 +469,26 @@ module Homebrew end end - def fetch_pull_requests(formula, tap_full_name) - GitHub.issues_for_formula(formula.name, tap_full_name: tap_full_name).select do |pr| + def fetch_pull_requests(query, tap_full_name, state: nil) + GitHub.issues_for_formula(query, tap_full_name: tap_full_name, state: state).select do |pr| pr["html_url"].include?("/pull/") && - /(^|\s)#{Regexp.quote(formula.name)}(:|\s|$)/i =~ pr["title"] + /(^|\s)#{Regexp.quote(query)}(:|\s|$)/i =~ pr["title"] end rescue GitHub::RateLimitExceededError => e opoo e.message [] end - def check_for_duplicate_pull_requests(formula, tap_full_name) - pull_requests = fetch_pull_requests(formula, tap_full_name) - return unless pull_requests - return if pull_requests.empty? + def check_for_duplicate_pull_requests(formula, tap_full_name, version) + # check for open requests + pull_requests = fetch_pull_requests(formula.name, tap_full_name, state: "open") + + # if we haven't already found open requests, try for an exact match across all requests + pull_requests = fetch_pull_requests("#{formula.name} #{version}", tap_full_name) if pull_requests.blank? + return if pull_requests.blank? duplicates_message = <<~EOS - These open pull requests may be duplicates: + These pull requests may be duplicates: #{pull_requests.map { |pr| "#{pr["title"]} #{pr["html_url"]}" }.join("\n")} EOS error_message = "Duplicate PRs should not be opened. Use --force to override this error." diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 94bcc05245..ba47d036b7 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -360,7 +360,7 @@ class BuildError < RuntimeError end def fetch_issues - GitHub.issues_for_formula(formula.name, tap: formula.tap) + GitHub.issues_for_formula(formula.name, tap: formula.tap, state: "open") rescue GitHub::RateLimitExceededError => e opoo e.message [] diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 556089c091..121e66b351 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -293,10 +293,8 @@ module GitHub search("code", **qualifiers) end - def issues_for_formula(name, options = {}) - tap = options[:tap] || CoreTap.instance - tap_full_name = options[:tap_full_name] || tap.full_name - search_issues(name, state: "open", repo: tap_full_name, in: "title") + def issues_for_formula(name, tap: CoreTap.instance, tap_full_name: tap.full_name, state: nil) + search_issues(name, repo: tap_full_name, state: state, in: "title") end def user