From 198387ff2aec126308be45f5db35d443f62be753 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Wed, 4 Dec 2024 22:49:14 +0100 Subject: [PATCH] feat: allow font install on linux --- Library/Homebrew/cask/artifact/moved.rb | 6 +++- Library/Homebrew/cask/config.rb | 25 ++++++++++++-- Library/Homebrew/cask/installer.rb | 16 +++++++-- Library/Homebrew/cask/quarantine.rb | 2 ++ .../Homebrew/extend/os/cask/artifact/moved.rb | 5 +++ Library/Homebrew/extend/os/cask/config.rb | 4 +++ Library/Homebrew/extend/os/cask/quarantine.rb | 4 +++ .../extend/os/linux/cask/artifact/moved.rb | 23 +++++++++++++ .../Homebrew/extend/os/linux/cask/config.rb | 34 +++++++++++++++++++ .../extend/os/linux/cask/installer.rb | 4 ++- .../extend/os/linux/cask/quarantine.rb | 26 ++++++++++++++ .../extend/os/mac/cask/artifact/moved.rb | 25 ++++++++++++++ Library/Homebrew/extend/os/mac/readall.rb | 2 +- Library/Homebrew/os/linux.rb | 12 +++++++ Library/Homebrew/os/mac.rb | 1 + 15 files changed, 181 insertions(+), 8 deletions(-) create mode 100644 Library/Homebrew/extend/os/cask/artifact/moved.rb create mode 100644 Library/Homebrew/extend/os/cask/config.rb create mode 100644 Library/Homebrew/extend/os/cask/quarantine.rb create mode 100644 Library/Homebrew/extend/os/linux/cask/artifact/moved.rb create mode 100644 Library/Homebrew/extend/os/linux/cask/config.rb create mode 100644 Library/Homebrew/extend/os/linux/cask/quarantine.rb create mode 100644 Library/Homebrew/extend/os/mac/cask/artifact/moved.rb diff --git a/Library/Homebrew/cask/artifact/moved.rb b/Library/Homebrew/cask/artifact/moved.rb index d3c5331639b95f..b80e0a6ef7538c 100644 --- a/Library/Homebrew/cask/artifact/moved.rb +++ b/Library/Homebrew/cask/artifact/moved.rb @@ -180,7 +180,7 @@ def move_back(skip: false, force: false, adopt: false, command: nil, **options) 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 @@ def delete(target, force: false, successor: nil, command: nil, **_) 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 ae8c2539fb0aa3..92826bf7901864 100644 --- a/Library/Homebrew/cask/config.rb +++ b/Library/Homebrew/cask/config.rb @@ -30,13 +30,13 @@ class Config vst3_plugindir: "~/Library/Audio/Plug-Ins/VST3", screen_saverdir: "~/Library/Screen Savers", }.freeze, - T::Hash[Symbol, String], + T::Hash[Symbol, T.nilable(String)], ) sig { returns(T::Hash[Symbol, T.untyped]) } def self.defaults { - languages: LazyObject.new { MacOS.languages }, + languages: LazyObject.new { ::OS::Mac.languages }, }.merge(DEFAULT_DIRS).freeze end @@ -197,6 +197,8 @@ def languages=(languages) end DEFAULT_DIRS.each_key do |dir| + next if dir == :fontdir + define_method(dir) do T.bind(self, Config) explicit.fetch(dir, env.fetch(dir, default.fetch(dir))) @@ -208,6 +210,16 @@ def languages=(languages) end end + sig { returns(T.any(String, Pathname)) } + def fontdir + get_dir_path(:fontdir) + end + + sig { params(path: String).returns(Pathname) } + def fontdir=(path) + explicit[:fontdir] = Pathname(path).expand_path + end + sig { params(other: Config).returns(T.self_type) } def merge(other) self.class.new(explicit: other.explicit.merge(explicit)) @@ -221,5 +233,14 @@ def to_json(*options) explicit:, }.to_json(*options) end + + private + + sig { params(dir: Symbol).returns(T.any(String, Pathname)) } + def get_dir_path(dir) + T.cast(explicit.fetch(dir, env.fetch(dir, default.fetch(dir))), T.any(String, Pathname)) + end end end + +require "extend/os/cask/config" diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index f826211a8e07bc..e9bbdc497d93d2 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -76,6 +76,7 @@ def fetch(quiet: nil, timeout: nil) satisfy_cask_and_formula_dependencies end + sig { void } def stage odebug "Cask::Installer#stage" @@ -88,6 +89,7 @@ def stage raise e end + sig { void } def install start_time = Time.now odebug "Cask::Installer#install" @@ -152,6 +154,7 @@ def check_deprecate_disable end end + sig { void } def check_conflicts return unless @cask.conflicts_with @@ -168,6 +171,7 @@ def check_conflicts end end + sig { void } def uninstall_existing_cask return unless @cask.installed? @@ -196,6 +200,7 @@ def download(quiet: nil, timeout: nil) timeout:) end + sig { void } def verify_has_sha odebug "Checking cask has checksum" return if @cask.sha256 != :no_check @@ -213,6 +218,12 @@ def primary_container 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 @@ def extract_primary_container(to: @cask.staged_path) 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 @@ def check_macos_requirements 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 @@ def check_arch_requirements "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 @@ def finalize_upgrade 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 4a36a5128edac7..ae680b0d2321a6 100644 --- a/Library/Homebrew/cask/quarantine.rb +++ b/Library/Homebrew/cask/quarantine.rb @@ -266,3 +266,5 @@ def self.app_management_permissions_granted?(app:, command:) 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 00000000000000..98d49e5904cbc1 --- /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 00000000000000..cc7f21e1bd741d --- /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 00000000000000..31671b65e5d352 --- /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 00000000000000..3f6c420b474a92 --- /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 00000000000000..b47d045e842e23 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/config.rb @@ -0,0 +1,34 @@ +# typed: strict +# frozen_string_literal: true + +require "os/linux" + +module OS + module Linux + module Cask + module Config + extend T::Helpers + + requires_ancestor { ::Cask::Config } + + module ClassMethods + DEFAULT_DIRS = T.let({ + vst_plugindir: "~/.vst", + vst3_plugindir: "~/.vst3", + fontdir: "#{ENV.fetch("XDG_DATA_HOME", "~/.local/share")}/fonts", + }.freeze, T::Hash[Symbol, T.nilable(String)]) + + sig { returns(T::Hash[Symbol, T.untyped]) } + def self.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) +Cask::Config.prepend(OS::Linux::Cask::Config) diff --git a/Library/Homebrew/extend/os/linux/cask/installer.rb b/Library/Homebrew/extend/os/linux/cask/installer.rb index 536a08b1f5590e..635f40bf39070d 100644 --- a/Library/Homebrew/extend/os/linux/cask/installer.rb +++ b/Library/Homebrew/extend/os/linux/cask/installer.rb @@ -13,7 +13,9 @@ module Installer sig { void } def check_stanza_os_requirements - raise ::Cask::CaskError, "macOS is required for this software." + raise ::Cask::CaskError, "macOS is required for this software." unless artifacts.reject do |k| + k.is_a?(::Cask::Artifact::Font) + end.empty? end 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 00000000000000..0fbed2ac4d2244 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/quarantine.rb @@ -0,0 +1,26 @@ +# 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 + end + + sig { returns(T::Boolean) } + def self.available? + false + end + 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 00000000000000..700557e564b423 --- /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 69a4bd2727e0ad..ec2deb1d48da8a 100644 --- a/Library/Homebrew/extend/os/mac/readall.rb +++ b/Library/Homebrew/extend/os/mac/readall.rb @@ -20,7 +20,7 @@ def valid_casks?(tap, os_name: nil, arch: ::Hardware::CPU.type) 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 e8f48328437070..4345e9a1f12e53 100644 --- a/Library/Homebrew/os/linux.rb +++ b/Library/Homebrew/os/linux.rb @@ -13,6 +13,8 @@ module Linux 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 @@ def self.wsl_version 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 dbb3ef64639120..c59bb0e50cd1b1 100644 --- a/Library/Homebrew/os/mac.rb +++ b/Library/Homebrew/os/mac.rb @@ -69,6 +69,7 @@ def self.preferred_perl_version end end + sig { returns(T::Array[String]) } def self.languages return @languages if @languages