From 2b6057616578acf0b4aaa408f715aa38c619d2f1 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Sun, 4 Feb 2024 14:13:06 +0100 Subject: [PATCH 1/3] rubocops/cask: add a cop for specific numbered shared file list files --- .../rubocops/cask/shared_filelist_glob.rb | 36 +++++++++++++++++++ Library/Homebrew/rubocops/rubocop-cask.rb | 1 + .../cask/shared_filelist_glob_spec.rb | 24 +++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 Library/Homebrew/rubocops/cask/shared_filelist_glob.rb create mode 100644 Library/Homebrew/test/rubocops/cask/shared_filelist_glob_spec.rb diff --git a/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb new file mode 100644 index 0000000000..27760781ed --- /dev/null +++ b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb @@ -0,0 +1,36 @@ +# typed: true +# frozen_string_literal: true + +module RuboCop + module Cop + module Cask + class SharedFilelistGlob < Base + extend AutoCorrector + + def on_send(node) + return unless node.method_name == :zap + + node.each_descendant(:pair).each do |pair| + symbols = pair.children.select(&:sym_type?).map(&:value) + next unless symbols.include?(:trash) + + pair.each_descendant(:array).each do |array| + + regex = /sfl\d"$/ + + array.children.each do |item| + next unless item.source.match?(regex) + + corrected_item = item.source.sub(/sfl\d"$/, "sfl*\"") + + add_offense(item, message: "Use a glob (*) instead of a specific version (ie. sfl2) for trashing Shared File List paths") do |corrector| + corrector.replace(item, corrected_item) + end + end + end + end + end + end + end + end +end diff --git a/Library/Homebrew/rubocops/rubocop-cask.rb b/Library/Homebrew/rubocops/rubocop-cask.rb index 572db73393..44abad52f9 100644 --- a/Library/Homebrew/rubocops/rubocop-cask.rb +++ b/Library/Homebrew/rubocops/rubocop-cask.rb @@ -18,6 +18,7 @@ require_relative "cask/discontinued" require_relative "cask/homepage_url_trailing_slash" require_relative "cask/no_overrides" require_relative "cask/on_system_conditionals" +require_relative "cask/shared_filelist_glob" require_relative "cask/stanza_order" require_relative "cask/stanza_grouping" require_relative "cask/uninstall_methods_order" diff --git a/Library/Homebrew/test/rubocops/cask/shared_filelist_glob_spec.rb b/Library/Homebrew/test/rubocops/cask/shared_filelist_glob_spec.rb new file mode 100644 index 0000000000..cc375563d3 --- /dev/null +++ b/Library/Homebrew/test/rubocops/cask/shared_filelist_glob_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require "rubocops/rubocop-cask" + +describe RuboCop::Cop::Cask::SharedFilelistGlob, :config do + it "reports an offense when a zap trash array includes an .sfl2 or .sfl3 file" do + expect_offense(<<~CASK) + cask "foo" do + url "https://example.com/foo.zip" + + zap trash: ["~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/org.mozilla.firefox.sfl2"] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use a glob (*) instead of a specific version (ie. sfl2) for trashing Shared File List paths + end + CASK + + expect_correction(<<~CASK) + cask "foo" do + url "https://example.com/foo.zip" + + zap trash: ["~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/org.mozilla.firefox.sfl*"] + end + CASK + end +end From 60914a3f4fab2fed8ab95446ec9d0c8fc5b2cb3b Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Sun, 4 Feb 2024 14:34:30 +0100 Subject: [PATCH 2/3] rubocops/cask: fix style --- .../Homebrew/rubocops/cask/shared_filelist_glob.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb index 27760781ed..170d3e1e5f 100644 --- a/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb +++ b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb @@ -8,22 +8,23 @@ module RuboCop extend AutoCorrector def on_send(node) - return unless node.method_name == :zap + return if node.method_name != :zap node.each_descendant(:pair).each do |pair| symbols = pair.children.select(&:sym_type?).map(&:value) next unless symbols.include?(:trash) pair.each_descendant(:array).each do |array| - regex = /sfl\d"$/ + message = "Use a glob (*) instead of a specific version (ie. sfl2) for trashing Shared File List paths" array.children.each do |item| - next unless item.source.match?(regex) + next unless item.source.match?(regex) - corrected_item = item.source.sub(/sfl\d"$/, "sfl*\"") + corrected_item = item.source.sub(/sfl\d"$/, "sfl*\"") - add_offense(item, message: "Use a glob (*) instead of a specific version (ie. sfl2) for trashing Shared File List paths") do |corrector| + add_offense(item, + message: message) do |corrector| corrector.replace(item, corrected_item) end end From bbebd3deecd5308fdeb0fd70d8d6864ee388ebc9 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Thu, 8 Feb 2024 07:03:51 +0000 Subject: [PATCH 3/3] Update shared_filelist_glob.rb Co-authored-by: Kevin --- Library/Homebrew/rubocops/cask/shared_filelist_glob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb index 170d3e1e5f..8f2e4abbac 100644 --- a/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb +++ b/Library/Homebrew/rubocops/cask/shared_filelist_glob.rb @@ -15,7 +15,7 @@ module RuboCop next unless symbols.include?(:trash) pair.each_descendant(:array).each do |array| - regex = /sfl\d"$/ + regex = /\.sfl\d"$/ message = "Use a glob (*) instead of a specific version (ie. sfl2) for trashing Shared File List paths" array.children.each do |item|