From 4a6644650aff1b6113e1149ddc5dac4db07c06a6 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Mon, 30 Sep 2024 22:22:41 +1000 Subject: [PATCH 1/5] cask/audit: audit deprecate/disable reasons --- Library/Homebrew/cask/audit.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb index 9929e14008191..0bc9292a80d39 100644 --- a/Library/Homebrew/cask/audit.rb +++ b/Library/Homebrew/cask/audit.rb @@ -946,6 +946,12 @@ def audit_cask_path add_error "Cask should be located in '#{expected_path}'" end + sig { void } + def audit_deprecate_disable + error = SharedAudits.check_deprecate_disable_reason(cask) + add_error error if error + end + sig { params( url_to_check: T.any(String, URL), From 5a39e1f238d60a41c14ac0ac5b78e147ccc30618 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Mon, 30 Sep 2024 22:22:41 +1000 Subject: [PATCH 2/5] test/cask/audit_spec: audit deprecate/disable reasons --- Library/Homebrew/test/cask/audit_spec.rb | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Library/Homebrew/test/cask/audit_spec.rb b/Library/Homebrew/test/cask/audit_spec.rb index b6a96511b64d6..800d1fa51d48a 100644 --- a/Library/Homebrew/test/cask/audit_spec.rb +++ b/Library/Homebrew/test/cask/audit_spec.rb @@ -1142,5 +1142,52 @@ def tmp_cask(name, text) it { is_expected.to error_with(/a homepage stanza is required/) } end end + + describe "checking deprecate/disable" do + let(:only) { ["deprecate_disable"] } + let(:cask_token) { "deprecated-cask" } + + context "when deprecate/disable is used with a valid reason" do + let(:cask) do + tmp_cask cask_token.to_s, <<~RUBY + cask '#{cask_token}' do + version "1.0" + sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" + url "https://brew.sh/foo.zip" + name "Audit" + desc "Cask Auditor" + homepage "https://brew.sh/" + app "Audit.app" + deprecate! date: "2021-01-01", because: :foobar + end + RUBY + end + + it "fails" do + expect(run).to error_with(/foobar is not a valid deprecate! or disable! reason/) + end + end + + context "when deprecate/disable is used with an invalid reason" do + let(:cask) do + tmp_cask cask_token.to_s, <<~RUBY + cask '#{cask_token}' do + version "1.0" + sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" + url "https://brew.sh/foo.zip" + name "Audit" + desc "Cask Auditor" + homepage "https://brew.sh/" + app "Audit.app" + disable! date: "2021-01-01", because: :discontinued + end + RUBY + end + + it "passes" do + expect(run).to pass + end + end + end end end From 905322dc0deb719ae69430051810c8142e8c2a9c Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Mon, 30 Sep 2024 23:11:00 +1000 Subject: [PATCH 3/5] formula_auditor: audit deprecate/disable reasons --- Library/Homebrew/formula_auditor.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Library/Homebrew/formula_auditor.rb b/Library/Homebrew/formula_auditor.rb index db48a0ec3ebf4..ff23f1f9dd541 100644 --- a/Library/Homebrew/formula_auditor.rb +++ b/Library/Homebrew/formula_auditor.rb @@ -963,6 +963,11 @@ def audit_prefix_has_contents EOS end + def audit_deprecate_disable + error = SharedAudits.check_deprecate_disable_reason(formula) + problem error if error + end + def quote_dep(dep) dep.is_a?(Symbol) ? dep.inspect : "'#{dep}'" end From 1c5bfa3d80fad8abd98165bf17c4ea326666a682 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Mon, 30 Sep 2024 23:11:00 +1000 Subject: [PATCH 4/5] test/formula_auditor_spec: audit deprecate/disable reasons --- Library/Homebrew/test/formula_auditor_spec.rb | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Library/Homebrew/test/formula_auditor_spec.rb b/Library/Homebrew/test/formula_auditor_spec.rb index 6889b7ed954cc..8b363aebd24e1 100644 --- a/Library/Homebrew/test/formula_auditor_spec.rb +++ b/Library/Homebrew/test/formula_auditor_spec.rb @@ -1312,4 +1312,35 @@ class FooAT11 < Formula .to match("Formula foo should also have a conflict declared with bar") end end + + describe "#audit_deprecate_disable" do + specify "it warns when deprecate/disable reason is invalid" do + fa = formula_auditor "foo", <<~RUBY + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + + deprecate! date: "2021-01-01", because: :foobar + end + RUBY + + mkdir_p fa.formula.prefix + fa.audit_deprecate_disable + expect(fa.problems.first[:message]) + .to match("foobar is not a valid deprecate! or disable! reason") + end + + specify "it does not warn when deprecate/disable reason is valid" do + fa = formula_auditor "foo", <<~RUBY + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + + deprecate! date: "2021-01-01", because: :repo_archived + end + RUBY + + mkdir_p fa.formula.prefix + fa.audit_deprecate_disable + expect(fa.problems).to be_empty + end + end end From 53e8739d242041769868596179546adc179c7760 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Mon, 30 Sep 2024 23:11:00 +1000 Subject: [PATCH 5/5] utils/shared_audits: audit deprecate/disable reasons --- Library/Homebrew/utils/shared_audits.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Library/Homebrew/utils/shared_audits.rb b/Library/Homebrew/utils/shared_audits.rb index 1c0d574ab5c72..4dc494aca2674 100644 --- a/Library/Homebrew/utils/shared_audits.rb +++ b/Library/Homebrew/utils/shared_audits.rb @@ -193,4 +193,20 @@ def self.github_tag_from_url(url) def self.gitlab_tag_from_url(url) url[%r{^https://gitlab\.com/(?:\w[\w.-]*/){2,}-/archive/([^/]+)/}, 1] end + + sig { params(formula_or_cask: T.any(Formula, Cask::Cask)).returns(T.nilable(String)) } + def self.check_deprecate_disable_reason(formula_or_cask) + return if !formula_or_cask.deprecated? && !formula_or_cask.disabled? + + reason = formula_or_cask.deprecated? ? formula_or_cask.deprecation_reason : formula_or_cask.disable_reason + return unless reason.is_a?(Symbol) + + reasons = if formula_or_cask.is_a?(Formula) + DeprecateDisable::FORMULA_DEPRECATE_DISABLE_REASONS + else + DeprecateDisable::CASK_DEPRECATE_DISABLE_REASONS + end + + "#{reason} is not a valid deprecate! or disable! reason" unless reasons.include?(reason) + end end