85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "hbc/artifact/abstract_artifact"
 | |
| 
 | |
| module Hbc
 | |
|   module Artifact
 | |
|     class Installer < AbstractArtifact
 | |
|       VALID_KEYS = Set.new [
 | |
|         :manual,
 | |
|         :script,
 | |
|       ]
 | |
| 
 | |
|       module ManualInstaller
 | |
|         def install_phase(**)
 | |
|           puts <<~EOS
 | |
|             To complete the installation of Cask #{cask}, you must also
 | |
|             run the installer at
 | |
| 
 | |
|               '#{path}'
 | |
|           EOS
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       module ScriptInstaller
 | |
|         def install_phase(command: nil, **_)
 | |
|           ohai "Running #{self.class.dsl_key} script '#{path.relative_path_from(cask.staged_path)}'"
 | |
|           FileUtils.chmod "+x", path unless path.executable?
 | |
|           command.run(path, **args, path: PATH.new(HOMEBREW_PREFIX/"bin", HOMEBREW_PREFIX/"sbin", ENV["PATH"]))
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def self.from_args(cask, **args)
 | |
|         raise CaskInvalidError.new(cask, "'installer' stanza requires an argument.") if args.empty?
 | |
| 
 | |
|         if args.key?(:script) && !args[:script].respond_to?(:key?)
 | |
|           if args.key?(:executable)
 | |
|             raise CaskInvalidError.new(cask, "'installer' stanza gave arguments for both :script and :executable.")
 | |
|           end
 | |
| 
 | |
|           args[:executable] = args[:script]
 | |
|           args.delete(:script)
 | |
|           args = { script: args }
 | |
|         end
 | |
| 
 | |
|         unless args.keys.count == 1
 | |
|           raise CaskInvalidError.new(cask, "invalid 'installer' stanza: Only one of #{VALID_KEYS.inspect} is permitted.")
 | |
|         end
 | |
| 
 | |
|         args.extend(HashValidator).assert_valid_keys(*VALID_KEYS)
 | |
|         new(cask, **args)
 | |
|       end
 | |
| 
 | |
|       attr_reader :path, :args
 | |
| 
 | |
|       def initialize(cask, **args)
 | |
|         super(cask)
 | |
| 
 | |
|         if args.key?(:manual)
 | |
|           @path = cask.staged_path.join(args[:manual])
 | |
|           @args = []
 | |
|           extend(ManualInstaller)
 | |
|           return
 | |
|         end
 | |
| 
 | |
|         path, @args = self.class.read_script_arguments(
 | |
|           args[:script], self.class.dsl_key.to_s, { must_succeed: true, sudo: false }, print_stdout: true
 | |
|         )
 | |
|         raise CaskInvalidError.new(cask, "#{self.class.dsl_key} missing executable") if path.nil?
 | |
| 
 | |
|         path = Pathname(path)
 | |
|         @path = path.absolute? ? path : cask.staged_path.join(path)
 | |
|         extend(ScriptInstaller)
 | |
|       end
 | |
| 
 | |
|       def summarize
 | |
|         path.relative_path_from(cask.staged_path).to_s
 | |
|       end
 | |
| 
 | |
|       def to_h
 | |
|         { path: path.relative_path_from(cask.staged_path).to_s }.tap do |h|
 | |
|           h[:args] = args unless is_a?(ManualInstaller)
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | 
