From cb234336127e9707b84cdb1ad2030186675c0ce1 Mon Sep 17 00:00:00 2001
From: Sean Molenaar <SMillerDev@users.noreply.github.com>
Date: Sat, 23 Nov 2024 21:03:29 +0000
Subject: [PATCH] feat: only block cask install on Linux

---
 Library/Homebrew/cask/installer.rb            |  9 +++++++
 Library/Homebrew/extend/os/cask/installer.rb  |  4 +++
 .../extend/os/linux/cask/installer.rb         | 23 ++++++++++++++++
 .../Homebrew/extend/os/linux/cli/parser.rb    | 12 ++-------
 Library/Homebrew/test/cli/parser_spec.rb      | 26 +++++++------------
 5 files changed, 47 insertions(+), 27 deletions(-)
 create mode 100644 Library/Homebrew/extend/os/cask/installer.rb
 create mode 100644 Library/Homebrew/extend/os/linux/cask/installer.rb

diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb
index 0874fceb32a4a..a0cdf8b74a644 100644
--- a/Library/Homebrew/cask/installer.rb
+++ b/Library/Homebrew/cask/installer.rb
@@ -280,11 +280,18 @@ def install_artifacts(predecessor: nil)
       end
     end
 
+    sig { void }
     def check_requirements
+      check_stanza_os_requirements
       check_macos_requirements
       check_arch_requirements
     end
 
+    sig { void }
+    def check_stanza_os_requirements
+      nil
+    end
+
     def check_macos_requirements
       return unless @cask.depends_on.macos
       return if @cask.depends_on.macos.satisfied?
@@ -710,3 +717,5 @@ def load_cask_from_source_api!
     end
   end
 end
+
+require "extend/os/cask/installer"
diff --git a/Library/Homebrew/extend/os/cask/installer.rb b/Library/Homebrew/extend/os/cask/installer.rb
new file mode 100644
index 0000000000000..a7a6e0c277d9e
--- /dev/null
+++ b/Library/Homebrew/extend/os/cask/installer.rb
@@ -0,0 +1,4 @@
+# typed: strict
+# frozen_string_literal: true
+
+require "extend/os/linux/cask/installer" if OS.linux?
diff --git a/Library/Homebrew/extend/os/linux/cask/installer.rb b/Library/Homebrew/extend/os/linux/cask/installer.rb
new file mode 100644
index 0000000000000..536a08b1f5590
--- /dev/null
+++ b/Library/Homebrew/extend/os/linux/cask/installer.rb
@@ -0,0 +1,23 @@
+# typed: strict
+# frozen_string_literal: true
+
+module OS
+  module Linux
+    module Cask
+      module Installer
+        private
+
+        extend T::Helpers
+
+        requires_ancestor { ::Cask::Installer }
+
+        sig { void }
+        def check_stanza_os_requirements
+          raise ::Cask::CaskError, "macOS is required for this software."
+        end
+      end
+    end
+  end
+end
+
+Cask::Installer.prepend(OS::Linux::Cask::Installer)
diff --git a/Library/Homebrew/extend/os/linux/cli/parser.rb b/Library/Homebrew/extend/os/linux/cli/parser.rb
index feb4eb2aabffe..056c1abbf2d70 100644
--- a/Library/Homebrew/extend/os/linux/cli/parser.rb
+++ b/Library/Homebrew/extend/os/linux/cli/parser.rb
@@ -11,17 +11,9 @@ module Parser
 
         sig { void }
         def set_default_options
-          args.set_arg(:formula?, true)
-        end
+          return if args.only_formula_or_cask == :cask
 
-        sig { void }
-        def validate_options
-          return unless args.respond_to?(:cask?)
-          return unless T.unsafe(self).args.cask?
-
-          # NOTE: We don't raise an error here because we don't want
-          #       to print the help page or a stack trace.
-          odie "Invalid `--cask` usage: Casks do not work on Linux"
+          args.set_arg(:formula?, true)
         end
       end
     end
diff --git a/Library/Homebrew/test/cli/parser_spec.rb b/Library/Homebrew/test/cli/parser_spec.rb
index fec9fa061def3..d4d5edb786c16 100644
--- a/Library/Homebrew/test/cli/parser_spec.rb
+++ b/Library/Homebrew/test/cli/parser_spec.rb
@@ -574,13 +574,6 @@
         end
       end
 
-      it "throws an error when defined" do
-        expect { parser.parse(["--cask"]) }
-          .to output("Error: Invalid `--cask` usage: Casks do not work on Linux\n").to_stderr
-          .and not_to_output.to_stdout
-          .and raise_exception SystemExit
-      end
-
       # Developers want to be able to use `audit` and `bump`
       # commands for formulae and casks on Linux.
       it "succeeds for developer commands" do
@@ -599,18 +592,9 @@
         end
       end
 
-      it "throws an error when --cask defined" do
-        expect { parser.parse(["--cask"]) }
-          .to output("Error: Invalid `--cask` usage: Casks do not work on Linux\n").to_stderr
-          .and not_to_output.to_stdout
-          .and raise_exception SystemExit
-      end
-
       it "throws an error when both defined" do
         expect { parser.parse(["--cask", "--formula"]) }
-          .to output("Error: Invalid `--cask` usage: Casks do not work on Linux\n").to_stderr
-          .and not_to_output.to_stdout
-          .and raise_exception SystemExit
+          .to raise_exception Homebrew::CLI::OptionConflictError
       end
     end
   end
@@ -629,5 +613,13 @@
       args = parser.parse([])
       expect(args.formula?).to be(true)
     end
+
+    it "does not set --formula to true when --cask" do
+      parser = described_class.new(Cmd) do
+        switch "--cask"
+      end
+      args = parser.parse([])
+      expect(args.respond_to?(:formula?)).to be(false)
+    end
   end
 end