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
 | 
