mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
114 lines
3.0 KiB
Ruby
114 lines
3.0 KiB
Ruby
![]() |
# typed: strict
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
module Homebrew
|
||
|
module Aliases
|
||
|
class Alias
|
||
|
sig { returns(String) }
|
||
|
attr_accessor :name
|
||
|
|
||
|
sig { returns(T.nilable(String)) }
|
||
|
attr_accessor :command
|
||
|
|
||
|
sig { params(name: String, command: T.nilable(String)).void }
|
||
|
def initialize(name, command = nil)
|
||
|
@name = T.let(name.strip, String)
|
||
|
@command = T.let(nil, T.nilable(String))
|
||
|
@script = T.let(nil, T.nilable(Pathname))
|
||
|
@symlink = T.let(nil, T.nilable(Pathname))
|
||
|
|
||
|
@command = if command&.start_with?("!", "%")
|
||
|
command[1..]
|
||
|
elsif command
|
||
|
"brew #{command}"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
sig { returns(T::Boolean) }
|
||
|
def reserved?
|
||
|
RESERVED.include? name
|
||
|
end
|
||
|
|
||
|
sig { returns(T::Boolean) }
|
||
|
def cmd_exists?
|
||
|
path = which("brew-#{name}.rb") || which("brew-#{name}")
|
||
|
!path.nil? && path.realpath.parent != HOMEBREW_ALIASES
|
||
|
end
|
||
|
|
||
|
sig { returns(Pathname) }
|
||
|
def script
|
||
|
@script ||= Pathname.new("#{HOMEBREW_ALIASES}/#{name.gsub(/\W/, "_")}")
|
||
|
end
|
||
|
|
||
|
sig { returns(Pathname) }
|
||
|
def symlink
|
||
|
@symlink ||= Pathname.new("#{HOMEBREW_PREFIX}/bin/brew-#{name}")
|
||
|
end
|
||
|
|
||
|
sig { returns(T::Boolean) }
|
||
|
def valid_symlink?
|
||
|
symlink.realpath.parent == HOMEBREW_ALIASES.realpath
|
||
|
rescue NameError
|
||
|
false
|
||
|
end
|
||
|
|
||
|
sig { void }
|
||
|
def link
|
||
|
FileUtils.rm symlink if File.symlink? symlink
|
||
|
FileUtils.ln_s script, symlink
|
||
|
end
|
||
|
|
||
|
sig { params(opts: T::Hash[Symbol, T::Boolean]).void }
|
||
|
def write(opts = {})
|
||
|
odie "'#{name}' is a reserved command. Sorry." if reserved?
|
||
|
odie "'brew #{name}' already exists. Sorry." if cmd_exists?
|
||
|
|
||
|
return if !opts[:override] && script.exist?
|
||
|
|
||
|
content = if command
|
||
|
<<~EOS
|
||
|
#: * `#{name}` [args...]
|
||
|
#: `brew #{name}` is an alias for `#{command}`
|
||
|
#{command} $*
|
||
|
EOS
|
||
|
else
|
||
|
<<~EOS
|
||
|
#
|
||
|
# This is a Homebrew alias script. It'll be called when the user
|
||
|
# types `brew #{name}`. Any remaining arguments are passed to
|
||
|
# this script. You can retrieve those with $*, or only the first
|
||
|
# one with $1. Please keep your script on one line.
|
||
|
|
||
|
# TODO Replace the line below with your script
|
||
|
echo "Hello I'm brew alias "#{name}" and my args are:" $1
|
||
|
EOS
|
||
|
end
|
||
|
|
||
|
script.open("w") do |f|
|
||
|
f.write <<~EOS
|
||
|
#! #{`which bash`.chomp}
|
||
|
# alias: brew #{name}
|
||
|
#{content}
|
||
|
EOS
|
||
|
end
|
||
|
script.chmod 0744
|
||
|
link
|
||
|
end
|
||
|
|
||
|
sig { void }
|
||
|
def remove
|
||
|
odie "'brew #{name}' is not aliased to anything." if !symlink.exist? || !valid_symlink?
|
||
|
|
||
|
script.unlink
|
||
|
symlink.unlink
|
||
|
end
|
||
|
|
||
|
sig { void }
|
||
|
def edit
|
||
|
write(override: false)
|
||
|
exec_editor script.to_s
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|