Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow font install on linux #18874

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Library/Homebrew/cask/artifact/moved.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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"
27 changes: 23 additions & 4 deletions Library/Homebrew/cask/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,12 @@ 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 },
}.merge(DEFAULT_DIRS).freeze
DEFAULT_DIRS.freeze
end

sig { params(args: Homebrew::CLI::Args).returns(T.attached_class) }
Expand Down Expand Up @@ -197,6 +195,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)))
Expand All @@ -208,6 +208,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))
Expand All @@ -221,5 +231,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"
17 changes: 14 additions & 3 deletions Library/Homebrew/cask/installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ def fetch(quiet: nil, timeout: nil)
satisfy_cask_and_formula_dependencies
end

sig { void }
def stage
odebug "Cask::Installer#stage"

Expand All @@ -88,6 +89,7 @@ def stage
raise e
end

sig { void }
def install
start_time = Time.now
odebug "Cask::Installer#install"
Expand Down Expand Up @@ -134,6 +136,7 @@ def install
raise
end

sig { void }
def check_deprecate_disable
deprecate_disable_type = DeprecateDisable.type(@cask)
return if deprecate_disable_type.nil?
Expand All @@ -150,6 +153,7 @@ def check_deprecate_disable
end
end

sig { void }
def check_conflicts
return unless @cask.conflicts_with

Expand All @@ -166,6 +170,7 @@ def check_conflicts
end
end

sig { void }
def uninstall_existing_cask
return unless @cask.installed?

Expand Down Expand Up @@ -194,6 +199,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
Expand All @@ -211,6 +217,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"

Expand Down Expand Up @@ -240,7 +252,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"
Expand Down Expand Up @@ -299,6 +310,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?

Expand All @@ -314,6 +326,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

Expand Down Expand Up @@ -487,8 +500,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

Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/cask/quarantine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -266,3 +266,5 @@ def self.app_management_permissions_granted?(app:, command:)
end
end
end

require "extend/os/cask/quarantine"
5 changes: 5 additions & 0 deletions Library/Homebrew/extend/os/cask/artifact/moved.rb
Original file line number Diff line number Diff line change
@@ -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?
5 changes: 5 additions & 0 deletions Library/Homebrew/extend/os/cask/config.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# typed: strict
# frozen_string_literal: true

require "extend/os/mac/cask/config" if OS.mac?
require "extend/os/linux/cask/config" if OS.linux?
4 changes: 4 additions & 0 deletions Library/Homebrew/extend/os/cask/quarantine.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# typed: strict
# frozen_string_literal: true

require "extend/os/linux/cask/quarantine" if OS.linux?
23 changes: 23 additions & 0 deletions Library/Homebrew/extend/os/linux/cask/artifact/moved.rb
Original file line number Diff line number Diff line change
@@ -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)
50 changes: 50 additions & 0 deletions Library/Homebrew/extend/os/linux/cask/config.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# typed: strict
# frozen_string_literal: true

require "os/linux"

module OS
module Linux
module Cask
module Config
extend T::Helpers

requires_ancestor { ::Cask::Config }

DEFAULT_DIRS = T.let({
vst_plugindir: "~/.vst",
vst3_plugindir: "~/.vst3",
fontdir: "#{ENV.fetch("XDG_DATA_HOME", "~/.local/share")}/fonts",
appdir: nil,
keyboard_layoutdir: nil,
colorpickerdir: nil,
prefpanedir: nil,
qlplugindir: nil,
mdimporterdir: nil,
servicedir: nil,
dictionarydir: nil,
screen_saverdir: nil,
input_methoddir: nil,
internet_plugindir: nil,
audio_unit_plugindir: nil,
}.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

sig { returns(String) }
def fontdir
@fontdir ||= T.let("#{ENV.fetch("XDG_DATA_HOME", "~/.local/share")}/fonts", T.nilable(String))
end


end
end
end
end

Cask::Config.prepend(OS::Linux::Cask::Config)
4 changes: 3 additions & 1 deletion Library/Homebrew/extend/os/linux/cask/installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions Library/Homebrew/extend/os/linux/cask/quarantine.rb
Original file line number Diff line number Diff line change
@@ -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)
25 changes: 25 additions & 0 deletions Library/Homebrew/extend/os/mac/cask/artifact/moved.rb
Original file line number Diff line number Diff line change
@@ -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::Config)
46 changes: 46 additions & 0 deletions Library/Homebrew/extend/os/mac/cask/config.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# typed: strict
# frozen_string_literal: true

require "cask/macos"

module OS
module Mac
module Cask
module Config
extend T::Helpers

requires_ancestor { ::Cask::Config }

DEFAULT_DIRS = T.let(
{
appdir: "/Applications",
keyboard_layoutdir: "/Library/Keyboard Layouts",
colorpickerdir: "~/Library/ColorPickers",
prefpanedir: "~/Library/PreferencePanes",
qlplugindir: "~/Library/QuickLook",
mdimporterdir: "~/Library/Spotlight",
dictionarydir: "~/Library/Dictionaries",
fontdir: "~/Library/Fonts",
servicedir: "~/Library/Services",
input_methoddir: "~/Library/Input Methods",
internet_plugindir: "~/Library/Internet Plug-Ins",
audio_unit_plugindir: "~/Library/Audio/Plug-Ins/Components",
vst_plugindir: "~/Library/Audio/Plug-Ins/VST",
vst3_plugindir: "~/Library/Audio/Plug-Ins/VST3",
screen_saverdir: "~/Library/Screen Savers",
}.freeze,
T::Hash[Symbol, String],
)

sig { returns(T::Hash[Symbol, T.untyped]) }
def self.defaults
{
languages: LazyObject.new { ::OS::Mac.languages },
}.merge(DEFAULT_DIRS).freeze
end
end
end
end
end

Cask::Config.prepend(OS::Mac::Cask::Config)
2 changes: 1 addition & 1 deletion Library/Homebrew/extend/os/mac/readall.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading
Loading