From 852e228558a9438487138278d03879a9637e34b2 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Sun, 19 Jan 2025 16:15:19 +0000 Subject: [PATCH] feat: allow cask binaries on linux --- Library/Homebrew/cask/artifact/symlinked.rb | 12 +++----- Library/Homebrew/extend/on_system.rbi | 8 +++++ .../extend/os/cask/artifact/symlinked.rb | 5 ++++ .../os/linux/cask/artifact/symlinked.rb | 26 ++++++++++++++++ .../extend/os/linux/cask/installer.rb | 3 ++ .../extend/os/mac/cask/artifact/symlinked.rb | 30 +++++++++++++++++++ 6 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 Library/Homebrew/extend/os/cask/artifact/symlinked.rb create mode 100644 Library/Homebrew/extend/os/linux/cask/artifact/symlinked.rb create mode 100644 Library/Homebrew/extend/os/mac/cask/artifact/symlinked.rb diff --git a/Library/Homebrew/cask/artifact/symlinked.rb b/Library/Homebrew/cask/artifact/symlinked.rb index 170ecc5367465..a9d3ff07085ca 100644 --- a/Library/Homebrew/cask/artifact/symlinked.rb +++ b/Library/Homebrew/cask/artifact/symlinked.rb @@ -72,14 +72,10 @@ def unlink(command: nil, **) Utils.gain_permissions_remove(target, command:) end - def create_filesystem_link(command: nil) - Utils.gain_permissions_mkpath(target.dirname, command:) - - command.run! "/bin/ln", args: ["-h", "-f", "-s", "--", source, target], - sudo: !target.dirname.writable? - - add_altname_metadata(source, target.basename, command:) - end + sig { params(command: T.class_of(SystemCommand)).void } + def create_filesystem_link(command:); end end end end + +require "extend/os/cask/artifact/symlinked" diff --git a/Library/Homebrew/extend/on_system.rbi b/Library/Homebrew/extend/on_system.rbi index 15534bb4b4dbc..18159d98df1d9 100644 --- a/Library/Homebrew/extend/on_system.rbi +++ b/Library/Homebrew/extend/on_system.rbi @@ -4,3 +4,11 @@ module OnSystem::MacOSOnly sig { params(arm: T.nilable(String), intel: T.nilable(String)).returns(T.nilable(String)) } def on_arch_conditional(arm: nil, intel: nil); end end + +module OnSystem::MacOSAndLinux + sig { params(macos: T.nilable(String), linux: T.nilable(String)).returns(T.nilable(String)) } + def on_system_conditional(macos: nil, linux: nil); end + + sig { params(arm: T.nilable(String), intel: T.nilable(String)).returns(T.nilable(String)) } + def on_arch_conditional(arm: nil, intel: nil); end +end diff --git a/Library/Homebrew/extend/os/cask/artifact/symlinked.rb b/Library/Homebrew/extend/os/cask/artifact/symlinked.rb new file mode 100644 index 0000000000000..e9df4618bd5e9 --- /dev/null +++ b/Library/Homebrew/extend/os/cask/artifact/symlinked.rb @@ -0,0 +1,5 @@ +# typed: strict +# frozen_string_literal: true + +require "extend/os/mac/cask/artifact/symlinked" if OS.mac? +require "extend/os/linux/cask/artifact/symlinked" if OS.linux? diff --git a/Library/Homebrew/extend/os/linux/cask/artifact/symlinked.rb b/Library/Homebrew/extend/os/linux/cask/artifact/symlinked.rb new file mode 100644 index 0000000000000..3d8d78f597b12 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/cask/artifact/symlinked.rb @@ -0,0 +1,26 @@ +# typed: strict +# frozen_string_literal: true + +module OS + module Linux + module Cask + module Artifact + module Symlinked + extend T::Helpers + + requires_ancestor { ::Cask::Artifact::Symlinked } + + sig { params(command: T.class_of(SystemCommand)).void } + def create_filesystem_link(command) + ::Cask::Utils.gain_permissions_mkpath(target.dirname, command:) + + command.run! "/bin/ln", args: ["--no-dereference", "--force", "--symbolic", source, target], + sudo: !target.dirname.writable? + end + end + end + end + end +end + +Cask::Artifact::Symlinked.prepend(OS::Linux::Cask::Artifact::Symlinked) diff --git a/Library/Homebrew/extend/os/linux/cask/installer.rb b/Library/Homebrew/extend/os/linux/cask/installer.rb index 76ac45eb7f15b..5add7aae64bc3 100644 --- a/Library/Homebrew/extend/os/linux/cask/installer.rb +++ b/Library/Homebrew/extend/os/linux/cask/installer.rb @@ -15,6 +15,9 @@ module Installer def check_stanza_os_requirements return if artifacts.all?(::Cask::Artifact::Font) + install_artifacts = artifacts.reject { |artifact| artifact.instance_of?(::Cask::Artifact::Zap) } + return if install_artifacts.all?(::Cask::Artifact::Binary) + raise ::Cask::CaskError, "macOS is required for this software." end end diff --git a/Library/Homebrew/extend/os/mac/cask/artifact/symlinked.rb b/Library/Homebrew/extend/os/mac/cask/artifact/symlinked.rb new file mode 100644 index 0000000000000..90dbe68c64846 --- /dev/null +++ b/Library/Homebrew/extend/os/mac/cask/artifact/symlinked.rb @@ -0,0 +1,30 @@ +# typed: strict +# frozen_string_literal: true + +require "cask/macos" + +module OS + module Mac + module Cask + module Artifact + module Symlinked + extend T::Helpers + + requires_ancestor { ::Cask::Artifact::Symlinked } + + sig { params(command: T.class_of(SystemCommand)).void } + def create_filesystem_link(command) + ::Cask::Utils.gain_permissions_mkpath(target.dirname, command:) + + command.run! "/bin/ln", args: ["-h", "-f", "-s", "--", source, target], + sudo: !target.dirname.writable? + + add_altname_metadata(source, target.basename, command:) + end + end + end + end + end +end + +Cask::Artifact::Symlinked.prepend(OS::Mac::Cask::Artifact::Symlinked)