116 lines
3.0 KiB
Ruby
Raw Normal View History

# 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