Skip to content

Commit 76c471f

Browse files
committed
bump: print skip status, message(s), and errors
`brew livecheck` surfaces the skip reason or message in its output (e.g., "deprecated", "skipped - Legacy version") but `brew bump` effectively ignores the `:status` and `:messages` values from `Livecheck::SkipConditions` and only prints "skipped" instead. Sometimes the reason can be inferred from parenthetical annotations (e.g., "(deprecated)" after the current version) but explicit output like "skipped - deprecated" is easier to read when skimming. Omitting a skip message from a `livecheck` block is only done to produce a predictable "skipped" string that can be used for comparison but we can handle that in a more robust way. A related issue we're now facing is that deprecated packages are producing an "unable to get versions" message rather than "skipped". This adds noise and makes it more challenging to identify real livecheck failures in bump output. This addresses these issues by modifying bump to print the skip `:status` and `:messages` values in the output. The way I've handled this, bump will also print error messages. In the process, this adds a `message?` method to check whether a value is a message string, replacing existing conditions that insufficiently check whether a value is a message using strict comparisons like `x != "skipped"` or `x != "unable to get versions"` and ignoring the possibility of error strings. This is still an imperfect way of identifying message strings but it should be an improvement over the status quo. In the future, it may be better to store message strings as something other than a `Cask::DSL::Version` object, so we can distinguish messages from versions without targeting a specific string pattern.
1 parent 2316400 commit 76c471f

2 files changed

Lines changed: 54 additions & 21 deletions

File tree

Library/Homebrew/dev-cmd/bump.rb

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,12 @@ def livecheck_result(formula_or_cask)
278278
)
279279

280280
if skip_info.present?
281-
return "#{skip_info[:status]}" \
282-
"#{" - #{skip_info[:messages].join("; ")}" if skip_info[:messages].present?}"
281+
skip_status = skip_info[:status]
282+
skip_messages = skip_info[:messages]
283+
skip_message = skip_messages.join("; ") if skip_messages.present?
284+
return "error: #{skip_message}" if skip_status == "error" && skip_message
285+
286+
return "skipped - #{skip_message || skip_status}"
283287
end
284288

285289
version_info = Livecheck.latest_version(
@@ -369,10 +373,9 @@ def retrieve_versions_by_arch(formula_or_cask:, repositories:, name:)
369373
new_version_value = if (livecheck_latest_is_a_version &&
370374
Livecheck::LivecheckVersion.create(formula_or_cask, livecheck_latest) >=
371375
Livecheck::LivecheckVersion.create(formula_or_cask, current_version_value)) ||
372-
current_version_value == "latest"
376+
current_version_value == "latest" ||
377+
message?(livecheck_latest)
373378
livecheck_latest
374-
elsif livecheck_latest.is_a?(String) && livecheck_latest.start_with?("skipped")
375-
"skipped"
376379
elsif repology_latest_is_a_version &&
377380
!formula_or_cask_has_livecheck &&
378381
repology_latest > current_version_value &&
@@ -433,21 +436,18 @@ def retrieve_versions_by_arch(formula_or_cask:, repositories:, name:)
433436
!newer_than_upstream.all? { |_k, v| v == true }
434437
pull_request_version = nil
435438
if (new_version_arm = new_version.arm) &&
436-
(new_version_arm != "unable to get versions") &&
437-
(new_version_arm != "skipped") &&
439+
!message?(new_version_arm) &&
438440
(new_version_arm != current_version.arm)
439441
# We use the ARM version for the pull request version even if there
440442
# are multiple arch versions to be consistent with the behavior of
441443
# bump-cask-pr.
442444
pull_request_version = new_version_arm.to_s
443445
elsif (new_version_intel = new_version.intel) &&
444-
(new_version_intel != "unable to get versions") &&
445-
(new_version_intel != "skipped") &&
446+
!message?(new_version_intel) &&
446447
(new_version_intel != current_version.intel)
447448
pull_request_version = new_version_intel.to_s
448449
elsif (new_version_general = new_version.general) &&
449-
(new_version_general != "unable to get versions") &&
450-
(new_version_general != "skipped") &&
450+
!message?(new_version_general) &&
451451
(new_version_general != current_version.general)
452452
pull_request_version = new_version_general.to_s
453453
end
@@ -631,8 +631,7 @@ def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, a
631631
end
632632

633633
if !args.no_pull_requests? &&
634-
(new_version.general != "unable to get versions") &&
635-
(new_version.general != "skipped") &&
634+
!message?(new_version.general) &&
636635
!versions_equal &&
637636
!all_newer_than_upstream
638637
if duplicate_pull_requests
@@ -652,8 +651,7 @@ def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, a
652651
end
653652

654653
if !args.open_pr? ||
655-
(new_version.general == "unable to get versions") ||
656-
(new_version.general == "skipped") ||
654+
message?(new_version.general) ||
657655
all_newer_than_upstream
658656
return
659657
end
@@ -678,15 +676,13 @@ def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, a
678676
version_args = []
679677
if multiple_versions[:current] && multiple_versions[:new]
680678
if (new_version_arm = new_version.arm) &&
681-
new_version_arm != "unable to get versions" &&
682-
new_version_arm != "skipped" &&
679+
!message?(new_version_arm) &&
683680
current_version.arm &&
684681
new_version_arm > current_version.arm
685682
version_args << "--version-arm=#{new_version_arm}"
686683
end
687684
if (new_version_intel = new_version.intel) &&
688-
new_version_intel != "unable to get versions" &&
689-
new_version_intel != "skipped" &&
685+
!message?(new_version_intel) &&
690686
current_version.intel &&
691687
new_version_intel > current_version.intel
692688
version_args << "--version-intel=#{new_version_intel}"
@@ -745,8 +741,7 @@ def compare_versions(current_version, new_version, formula_or_cask)
745741
end
746742

747743
new_version_value = new_version.send(type)
748-
if new_version_value.is_a?(String) &&
749-
new_version_value.match?(LIVECHECK_MESSAGE_REGEX)
744+
if message?(new_version_value)
750745
# Store a string, so we can easily tell when a value is a message
751746
# rather than a version
752747
new_versions[type] = new_version_value.to_s
@@ -803,6 +798,13 @@ def compare_versions(current_version, new_version, formula_or_cask)
803798
{ multiple_versions:, newer_than_upstream: }
804799
end
805800

801+
sig { params(value: T.nilable(T.any(Version, Cask::DSL::Version, String))).returns(T::Boolean) }
802+
def message?(value)
803+
return false if !value.is_a?(Cask::DSL::Version) && !value.is_a?(String)
804+
805+
value.match?(LIVECHECK_MESSAGE_REGEX)
806+
end
807+
806808
sig {
807809
params(
808810
formula: Formula,

Library/Homebrew/test/dev-cmd/bump_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,35 @@
152152
})
153153
end
154154
end
155+
156+
describe "::message?" do
157+
let(:version) { Version.new("1.2.3") }
158+
let(:cask_version) { Cask::DSL::Version.new("1.2.3,4") }
159+
let(:message_strings) do
160+
[
161+
"error: message",
162+
"skipped",
163+
"skipped - deprecated",
164+
"unable to get versions",
165+
"unable to get throttled versions",
166+
]
167+
end
168+
169+
it "returns false when value is not a `Cask::DSL::Version` or string" do
170+
expect(bump.send(:message?, version)).to be(false)
171+
expect(bump.send(:message?, nil)).to be(false)
172+
end
173+
174+
it "returns false when `Cask::DSL::Version` or string is not a message" do
175+
expect(bump.send(:message?, cask_version)).to be(false)
176+
expect(bump.send(:message?, "Not a message string")).to be(false)
177+
end
178+
179+
it "returns true when `Cask::DSL::Version` or string is a message" do
180+
message_strings.each do |message_string|
181+
expect(bump.send(:message?, Cask::DSL::Version.new(message_string))).to be(true)
182+
expect(bump.send(:message?, message_string)).to be(true)
183+
end
184+
end
185+
end
155186
end

0 commit comments

Comments
 (0)