From 2b6057616578acf0b4aaa408f715aa38c619d2f1 Mon Sep 17 00:00:00 2001 From: Bevan Kay Date: Sun, 4 Feb 2024 14:13:06 +0100 Subject: [PATCH] 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