diff --git a/Library/Homebrew/cask/artifact/moved.rb b/Library/Homebrew/cask/artifact/moved.rb index d3c5331639..b80e0a6ef7 100644 --- a/Library/Homebrew/cask/artifact/moved.rb +++ b/Library/Homebrew/cask/artifact/moved.rb @@ -180,7 +180,7 @@ module Cask def delete(target, force: false, successor: nil, command: nil, **_) ohai "Removing #{self.class.english_name} '#{target}'" - raise CaskError, "Cannot remove undeletable #{self.class.english_name}." if MacOS.undeletable?(target) + raise CaskError, "Cannot remove undeletable #{self.class.english_name}." if undeletable?(target) return unless Utils.path_occupied?(target) @@ -196,6 +196,10 @@ module Cask Utils.gain_permissions_remove(target, command:) end end + + def undeletable?(target); end end end end + +require "extend/os/cask/artifact/moved" diff --git a/Library/Homebrew/cask/config.rb b/Library/Homebrew/cask/config.rb index ae8c2539fb..aa0d76dfb3 100644 --- a/Library/Homebrew/cask/config.rb +++ b/Library/Homebrew/cask/config.rb @@ -33,10 +33,10 @@ module Cask T::Hash[Symbol, String], ) - sig { returns(T::Hash[Symbol, T.untyped]) } + sig { returns(T::Hash[Symbol, String]) } def self.defaults { - languages: LazyObject.new { MacOS.languages }, + languages: LazyObject.new { ::OS::Mac.languages }, }.merge(DEFAULT_DIRS).freeze end @@ -223,3 +223,5 @@ module Cask end end end + +require "extend/os/cask/config" diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index f826211a8e..e9bbdc497d 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -76,6 +76,7 @@ module Cask satisfy_cask_and_formula_dependencies end + sig { void } def stage odebug "Cask::Installer#stage" @@ -88,6 +89,7 @@ module Cask raise e end + sig { void } def install start_time = Time.now odebug "Cask::Installer#install" @@ -152,6 +154,7 @@ on_request: true) end end + sig { void } def check_conflicts return unless @cask.conflicts_with @@ -168,6 +171,7 @@ on_request: true) end end + sig { void } def uninstall_existing_cask return unless @cask.installed? @@ -196,6 +200,7 @@ on_request: true) timeout:) end + sig { void } def verify_has_sha odebug "Checking cask has checksum" return if @cask.sha256 != :no_check @@ -213,6 +218,12 @@ on_request: true) end end + sig { returns(ArtifactSet) } + def artifacts + @cask.artifacts + end + + sig { params(to: Pathname).void } def extract_primary_container(to: @cask.staged_path) odebug "Extracting primary container" @@ -242,7 +253,6 @@ on_request: true) sig { params(predecessor: T.nilable(Cask)).void } def install_artifacts(predecessor: nil) - artifacts = @cask.artifacts already_installed_artifacts = [] odebug "Installing artifacts" @@ -301,6 +311,7 @@ on_request: true) raise CaskError, @cask.depends_on.macos.message(type: :cask) end + sig { void } def check_arch_requirements return if @cask.depends_on.arch.nil? @@ -316,6 +327,7 @@ on_request: true) "but you are running #{@current_arch}." end + sig { returns(T::Array[T.untyped]) } def cask_and_formula_dependencies return @cask_and_formula_dependencies if @cask_and_formula_dependencies @@ -489,8 +501,6 @@ on_request: true) sig { params(clear: T::Boolean, successor: T.nilable(Cask)).void } def uninstall_artifacts(clear: false, successor: nil) - artifacts = @cask.artifacts - odebug "Uninstalling artifacts" odebug "#{::Utils.pluralize("artifact", artifacts.length, include_count: true)} defined", artifacts diff --git a/Library/Homebrew/cask/quarantine.rb b/Library/Homebrew/cask/quarantine.rb index 4a36a5128e..ae680b0d23 100644 --- a/Library/Homebrew/cask/quarantine.rb +++ b/Library/Homebrew/cask/quarantine.rb @@ -266,3 +266,5 @@ module Cask end end end + +require "extend/os/cask/quarantine" diff --git a/Library/Homebrew/extend/os/cask/artifact/moved.rb b/Library/Homebrew/extend/os/cask/artifact/moved.rb new file mode 100644 index 0000000000..98d49e5904 --- /dev/null +++ b/Library/Homebrew/extend/os/cask/artifact/moved.rb @@ -0,0 +1,5 @@ +# typed: strict +# frozen_string_literal: true + +require "extend/os/mac/cask/artifact/moved" if OS.mac? +require "extend/os/linux/cask/artifact/moved" if OS.linux? diff --git a/Library/Homebrew/extend/os/cask/config.rb b/Library/Homebrew/extend/os/cask/config.rb new file mode 100644 index 0000000000..cc7f21e1bd --- /dev/null +++ b/Library/Homebrew/extend/os/cask/config.rb @@ -0,0 +1,4 @@ +# typed: strict +# frozen_string_literal: true + +require "extend/os/linux/cask/config" if OS.linux? diff --git a/Library/Homebrew/extend/os/cask/quarantine.rb b/Library/Homebrew/extend/os/cask/quarantine.rb new file mode 100644 index 0000000000..31671b65e5 --- /dev/null +++ b/Library/Homebrew/extend/os/cask/quarantine.rb @@ -0,0 +1,4 @@ +# typed: strict +# frozen_string_literal: true + +require "extend/os/linux/cask/quarantine" if OS.linux? diff --git a/Library/Homebrew/extend/os/linux/cask/artifact/moved.rb b/Library/Homebrew/extend/os/linux/cask/artifact/moved.rb new file mode 100644 index 0000000000..3f6c420b47 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/artifact/moved.rb @@ -0,0 +1,23 @@ +# typed: strict +# frozen_string_literal: true + +module OS + module Linux + module Cask + module Artifact + module Moved + extend T::Helpers + + requires_ancestor { ::Cask::Artifact::Moved } + + sig { params(target: Pathname).returns(T::Boolean) } + def undeletable?(target) + !target.parent.writable? + end + end + end + end + end +end + +Cask::Artifact::Moved.prepend(OS::Linux::Cask::Config) diff --git a/Library/Homebrew/extend/os/linux/cask/config.rb b/Library/Homebrew/extend/os/linux/cask/config.rb new file mode 100644 index 0000000000..756cc7bae1 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/config.rb @@ -0,0 +1,30 @@ +# typed: strict +# frozen_string_literal: true + +require "os/linux" + +module OS + module Linux + module Cask + module Config + module ClassMethods + DEFAULT_DIRS = T.let({ + vst_plugindir: "~/.vst", + vst3_plugindir: "~/.vst3", + fontdir: "#{ENV.fetch("XDG_DATA_HOME", "~/.local/share")}/fonts", + appdir: "~/.config/apps", + }.freeze, T::Hash[Symbol, String]) + + sig { returns(T::Hash[Symbol, String]) } + def defaults + { + languages: LazyObject.new { Linux.languages }, + }.merge(DEFAULT_DIRS).freeze + end + end + end + end + end +end + +Cask::Config.singleton_class.prepend(OS::Linux::Cask::Config::ClassMethods) diff --git a/Library/Homebrew/extend/os/linux/cask/installer.rb b/Library/Homebrew/extend/os/linux/cask/installer.rb index 536a08b1f5..76ac45eb7f 100644 --- a/Library/Homebrew/extend/os/linux/cask/installer.rb +++ b/Library/Homebrew/extend/os/linux/cask/installer.rb @@ -13,6 +13,8 @@ module OS sig { void } def check_stanza_os_requirements + return if artifacts.all?(::Cask::Artifact::Font) + raise ::Cask::CaskError, "macOS is required for this software." end end diff --git a/Library/Homebrew/extend/os/linux/cask/quarantine.rb b/Library/Homebrew/extend/os/linux/cask/quarantine.rb new file mode 100644 index 0000000000..62d981ee3d --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/quarantine.rb @@ -0,0 +1,22 @@ +# typed: strict +# frozen_string_literal: true + +module OS + module Linux + module Cask + module Quarantine + extend T::Helpers + + requires_ancestor { ::Cask::Quarantine } + + sig { returns(Symbol) } + def self.check_quarantine_support = :linux + + sig { returns(T::Boolean) } + def self.available? = false + end + end + end +end + +Cask::Quarantine.prepend(OS::Linux::Cask::Quarantine) diff --git a/Library/Homebrew/extend/os/mac/cask/artifact/moved.rb b/Library/Homebrew/extend/os/mac/cask/artifact/moved.rb new file mode 100644 index 0000000000..700557e564 --- /dev/null +++ b/Library/Homebrew/extend/os/mac/cask/artifact/moved.rb @@ -0,0 +1,25 @@ +# typed: strict +# frozen_string_literal: true + +require "cask/macos" + +module OS + module Mac + module Cask + module Artifact + module Moved + extend T::Helpers + + requires_ancestor { ::Cask::Artifact::Moved } + + sig { params(target: Pathname).returns(T::Boolean) } + def undeletable?(target) + MacOS.undeletable?(target) + end + end + end + end + end +end + +Cask::Artifact::Moved.prepend(OS::Mac::Cask::Artifact::Moved) diff --git a/Library/Homebrew/extend/os/mac/readall.rb b/Library/Homebrew/extend/os/mac/readall.rb index 853654a24e..23f71e403c 100644 --- a/Library/Homebrew/extend/os/mac/readall.rb +++ b/Library/Homebrew/extend/os/mac/readall.rb @@ -20,7 +20,7 @@ module OS success = T.let(true, T::Boolean) tap.cask_files.each do |file| - cask = Cask::CaskLoader.load(file) + cask = ::Cask::CaskLoader.load(file) # Fine to have missing URLs for unsupported macOS macos_req = cask.depends_on.macos diff --git a/Library/Homebrew/os/linux.rb b/Library/Homebrew/os/linux.rb index e8f4832843..4345e9a1f1 100644 --- a/Library/Homebrew/os/linux.rb +++ b/Library/Homebrew/os/linux.rb @@ -13,6 +13,8 @@ module OS raise "Loaded OS::Linux on macOS!" if OS.mac? # rubocop:enable Homebrew/MoveToExtendOS + @languages = T.let([], T::Array[String]) + # Get the OS version. # # @api internal @@ -56,5 +58,15 @@ module OS Version::NULL end end + + sig { returns(T::Array[String]) } + def self.languages + return @languages if @languages.present? + + os_langs = Utils.popen_read("localectl", "list-locales") + os_langs = os_langs.scan(/[^ \n"(),]+/).map { |item| item.split(".").first.tr("_", "-") } + + @languages = os_langs + end end end diff --git a/Library/Homebrew/os/mac.rb b/Library/Homebrew/os/mac.rb index dbb3ef6463..c59bb0e50c 100644 --- a/Library/Homebrew/os/mac.rb +++ b/Library/Homebrew/os/mac.rb @@ -69,6 +69,7 @@ module OS end end + sig { returns(T::Array[String]) } def self.languages return @languages if @languages