diff --git a/Library/Homebrew/rubocops/cask/mixin/cask_help.rb b/Library/Homebrew/rubocops/cask/mixin/cask_help.rb index edea7f4919..a173e6e027 100644 --- a/Library/Homebrew/rubocops/cask/mixin/cask_help.rb +++ b/Library/Homebrew/rubocops/cask/mixin/cask_help.rb @@ -26,6 +26,8 @@ module RuboCop return unless block_node.cask_block? + @file_path = processed_source.file_path + cask_block = RuboCop::Cask::AST::CaskBlock.new(block_node, comments) on_cask(cask_block) end @@ -39,6 +41,13 @@ module RuboCop inner_nodes = block_contents.map(&:child_nodes).flatten.select(&:send_type?) inner_nodes.map { |n| RuboCop::Cask::AST::Stanza.new(n, comments) } end + + sig { returns(T.nilable(String)) } + def cask_tap + return unless (match_obj = @file_path.match(%r{/(homebrew-\w+)/})) + + match_obj[1] + end end end end diff --git a/Library/Homebrew/rubocops/cask/url.rb b/Library/Homebrew/rubocops/cask/url.rb index 79ed4cb869..b44e2be242 100644 --- a/Library/Homebrew/rubocops/cask/url.rb +++ b/Library/Homebrew/rubocops/cask/url.rb @@ -26,7 +26,12 @@ module RuboCop include UrlHelper def on_url_stanza(stanza) - return if stanza.stanza_node.block_type? + if stanza.stanza_node.block_type? + if cask_tap == "homebrew-cask" + add_offense(stanza.stanza_node, message: 'Do not use `url "..." do` blocks in Homebrew/homebrew-cask.') + end + return + end url_stanza = stanza.stanza_node.first_argument hash_node = stanza.stanza_node.last_argument diff --git a/Library/Homebrew/test/rubocops/cask/url_spec.rb b/Library/Homebrew/test/rubocops/cask/url_spec.rb index e984d82cb0..e842ad1ea8 100644 --- a/Library/Homebrew/test/rubocops/cask/url_spec.rb +++ b/Library/Homebrew/test/rubocops/cask/url_spec.rb @@ -3,6 +3,45 @@ require "rubocops/rubocop-cask" RSpec.describe RuboCop::Cop::Cask::Url, :config do + it "allows regular `url` blocks in homebrew-cask" do + expect_no_offenses <<~CASK, "/homebrew-cask/Casks/f/foo.rb" + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + end + CASK + end + + it "does not allow `url do` blocks in homebrew-cask" do + expect_offense <<~CASK, "/homebrew-cask/Casks/f/foo.rb" + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg" do |url| + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `url "..." do` blocks in Homebrew/homebrew-cask. + url + end + end + CASK + end + + it "allows regular `url` blocks in a non-homebrew-cask tap" do + expect_no_offenses <<~CASK, "/homebrew-tap/Casks/f/foo.rb" + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + end + CASK + end + + it "allows `url do` blocks in a non-homebrew-cask tap" do + expect_no_offenses <<~CASK, "/homebrew-tap/Casks/f/foo.rb" + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg" do |url| + url + end + end + CASK + end + it "accepts a `verified` value that does not start with a protocol" do expect_no_offenses <<~CASK cask "foo" do