bump: skip PR checking when up to date

`brew bump` will check for PRs related to a package even if the
package version and livecheck version are the same. We're presumably
only interested in related PRs when the livecheck version differs, so
we can reduce GitHub API requests by skipping the check(s) when the
versions are equal. We use `bump` in `autobump` workflows, so this
should help with recent rate limiting issues (e.g., 3203 out of 3426
autobumped formulae were up to date in a recent run).

This also reworks the output for duplicate PRs, making it clear when
`bump` skipped checking PRs (as printing "none" would suggest that
PRs were checked) and only printing the "Maybe duplicate" information
when checked. This makes it a little easier to understand what `bump`
has done internally from the output.
This commit is contained in:
Sam Ford 2024-11-24 10:01:48 -05:00
parent 8d3056463d
commit a89457fcb9
No known key found for this signature in database
GPG Key ID: 7AF5CBEE1DD6F76D
3 changed files with 73 additions and 16 deletions

View File

@ -48,5 +48,12 @@ module Homebrew
def blank? def blank?
@general.blank? && @arm.blank? && @intel.blank? @general.blank? && @arm.blank? && @intel.blank?
end end
sig { params(other: T.untyped).returns(T::Boolean) }
def ==(other)
return false unless other.is_a?(BumpVersionParser)
(general == other.general) && (arm == other.arm) && (intel == other.intel)
end
end end
end end

View File

@ -277,8 +277,9 @@ module Homebrew
odebug "Error fetching pull requests for #{formula_or_cask} #{name}: #{e}" odebug "Error fetching pull requests for #{formula_or_cask} #{name}: #{e}"
nil nil
end end
return if pull_requests.blank?
pull_requests&.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }&.join(", ") pull_requests.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }.join(", ")
end end
sig { sig {
@ -373,13 +374,17 @@ module Homebrew
new_version.general.to_s new_version.general.to_s
end end
duplicate_pull_requests = unless args.no_pull_requests? if !args.no_pull_requests? && (new_version != current_version)
retrieve_pull_requests(formula_or_cask, name, version: pull_request_version) duplicate_pull_requests = retrieve_pull_requests(
end.presence formula_or_cask,
name,
version: pull_request_version,
)
maybe_duplicate_pull_requests = if !args.no_pull_requests? && duplicate_pull_requests.blank? maybe_duplicate_pull_requests = if duplicate_pull_requests.nil?
retrieve_pull_requests(formula_or_cask, name) retrieve_pull_requests(formula_or_cask, name)
end.presence end
end
VersionBumpInfo.new( VersionBumpInfo.new(
type:, type:,
@ -411,9 +416,7 @@ module Homebrew
repology_latest = version_info.repology_latest repology_latest = version_info.repology_latest
# Check if all versions are equal # Check if all versions are equal
versions_equal = [:arm, :intel, :general].all? do |key| versions_equal = (new_version == current_version)
current_version.send(key) == new_version.send(key)
end
title_name = ambiguous_cask ? "#{name} (cask)" : name title_name = ambiguous_cask ? "#{name} (cask)" : name
title = if (repology_latest == current_version.general || !repology_latest.is_a?(Version)) && versions_equal title = if (repology_latest == current_version.general || !repology_latest.is_a?(Version)) && versions_equal
@ -439,8 +442,8 @@ module Homebrew
end end
version_label = version_info.version_name version_label = version_info.version_name
duplicate_pull_requests = version_info.duplicate_pull_requests.presence duplicate_pull_requests = version_info.duplicate_pull_requests
maybe_duplicate_pull_requests = version_info.maybe_duplicate_pull_requests.presence maybe_duplicate_pull_requests = version_info.maybe_duplicate_pull_requests
ohai title ohai title
puts <<~EOS puts <<~EOS
@ -457,10 +460,22 @@ module Homebrew
#{outdated_synced_formulae.join(", ")}. #{outdated_synced_formulae.join(", ")}.
EOS EOS
end end
puts <<~EOS unless args.no_pull_requests? if !args.no_pull_requests? && !versions_equal
Duplicate pull requests: #{duplicate_pull_requests || "none"} if duplicate_pull_requests
Maybe duplicate pull requests: #{maybe_duplicate_pull_requests || "none"} duplicate_pull_requests_text = duplicate_pull_requests
EOS elsif maybe_duplicate_pull_requests
duplicate_pull_requests_text = "none"
maybe_duplicate_pull_requests_text = maybe_duplicate_pull_requests
else
duplicate_pull_requests_text = "none"
maybe_duplicate_pull_requests_text = "none"
end
puts "Duplicate pull requests: #{duplicate_pull_requests_text}"
if maybe_duplicate_pull_requests_text
puts "Maybe duplicate pull requests: #{maybe_duplicate_pull_requests_text}"
end
end
return unless args.open_pr? return unless args.open_pr?

View File

@ -69,4 +69,39 @@ RSpec.describe Homebrew::BumpVersionParser do
end end
end end
end end
describe "#==" do
let(:new_version) { described_class.new(general: general_version, arm: arm_version, intel: intel_version) }
context "when other object is not a `BumpVersionParser`" do
it "returns false" do
expect(new_version == Version.new("1.2.3")).to be(false)
end
end
context "when comparing objects with equal versions" do
it "returns true" do
same_version = described_class.new(general: general_version, arm: arm_version, intel: intel_version)
expect(new_version == same_version).to be(true)
end
end
context "when comparing objects with different versions" do
it "returns false" do
different_general_version = described_class.new(general: "3.2.1", arm: arm_version, intel: intel_version)
different_arm_version = described_class.new(general: general_version, arm: "4.3.2", intel: intel_version)
different_intel_version = described_class.new(general: general_version, arm: arm_version, intel: "5.4.3")
different_general_arm_versions = described_class.new(general: "3.2.1", arm: "4.3.2", intel: intel_version)
different_arm_intel_versions = described_class.new(general: general_version, arm: "4.3.2", intel: "5.4.3")
different_general_intel_versions = described_class.new(general: "3.2.1", arm: arm_version, intel: "5.4.3")
expect(new_version == different_general_version).to be(false)
expect(new_version == different_arm_version).to be(false)
expect(new_version == different_intel_version).to be(false)
expect(new_version == different_general_arm_versions).to be(false)
expect(new_version == different_arm_intel_versions).to be(false)
expect(new_version == different_general_intel_versions).to be(false)
end
end
end
end end