mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
116 lines
3.0 KiB
Ruby
116 lines
3.0 KiB
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
require "fileutils"
|
|
|
|
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
|