125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "rubygems"
 | |
| 
 | |
| class Hbc::DSL::DependsOn
 | |
|   VALID_KEYS = Set.new [
 | |
|                          :formula,
 | |
|                          :cask,
 | |
|                          :macos,
 | |
|                          :arch,
 | |
|                          :x11,
 | |
|                          :java,
 | |
|                        ].freeze
 | |
| 
 | |
|   VALID_ARCHES = {
 | |
|                    intel:    { type: :intel, bits: [32, 64] },
 | |
|                    ppc:      { type: :ppc,   bits: [32, 64] },
 | |
|                    # specific
 | |
|                    i386:     { type: :intel, bits: 32 },
 | |
|                    x86_64:   { type: :intel, bits: 64 },
 | |
|                    ppc_7400: { type: :ppc,   bits: 32 },
 | |
|                    ppc_64:   { type: :ppc,   bits: 64 },
 | |
|                  }.freeze
 | |
| 
 | |
|   # Intentionally undocumented: catch variant spellings.
 | |
|   ARCH_SYNONYMS = {
 | |
|                     x86_32:   :i386,
 | |
|                     x8632:    :i386,
 | |
|                     x8664:    :x86_64,
 | |
|                     intel_32: :i386,
 | |
|                     intel32:  :i386,
 | |
|                     intel_64: :x86_64,
 | |
|                     intel64:  :x86_64,
 | |
|                     amd_64:   :x86_64,
 | |
|                     amd64:    :x86_64,
 | |
|                     ppc7400:  :ppc_7400,
 | |
|                     ppc_32:   :ppc_7400,
 | |
|                     ppc32:    :ppc_7400,
 | |
|                     ppc64:    :ppc_64,
 | |
|                   }.freeze
 | |
| 
 | |
|   attr_accessor :java
 | |
|   attr_accessor :pairs
 | |
|   attr_reader :arch, :cask, :formula, :macos, :x11
 | |
| 
 | |
|   def initialize
 | |
|     @pairs ||= {}
 | |
|   end
 | |
| 
 | |
|   def load(pairs = {})
 | |
|     pairs.each do |key, value|
 | |
|       raise "invalid depends_on key: '#{key.inspect}'" unless VALID_KEYS.include?(key)
 | |
|       writer_method = "#{key}=".to_sym
 | |
|       @pairs[key] = send(writer_method, value)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.coerce_os_release(arg)
 | |
|     @macos_symbols ||= MacOS::Version::SYMBOLS
 | |
|     @inverted_macos_symbols ||= @macos_symbols.invert
 | |
| 
 | |
|     begin
 | |
|       if arg.is_a?(Symbol)
 | |
|         Gem::Version.new(@macos_symbols.fetch(arg))
 | |
|       elsif arg =~ %r{^\s*:?([a-z]\S+)\s*$}i
 | |
|         Gem::Version.new(@macos_symbols.fetch(Regexp.last_match[1].downcase.to_sym))
 | |
|       elsif @inverted_macos_symbols.key?(arg)
 | |
|         Gem::Version.new(arg)
 | |
|       else
 | |
|         raise
 | |
|       end
 | |
|     rescue StandardError
 | |
|       raise "invalid 'depends_on macos' value: #{arg.inspect}"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def formula=(*arg)
 | |
|     @formula ||= []
 | |
|     @formula.concat(Array(*arg))
 | |
|   end
 | |
| 
 | |
|   def cask=(*arg)
 | |
|     @cask ||= []
 | |
|     @cask.concat(Array(*arg))
 | |
|   end
 | |
| 
 | |
|   def macos=(*arg)
 | |
|     @macos ||= []
 | |
|     macos = if arg.count == 1 && arg.first =~ %r{^\s*(<|>|[=<>]=)\s*(\S+)\s*$}
 | |
|               raise "'depends_on macos' comparison expressions cannot be combined" unless @macos.empty?
 | |
|               operator = Regexp.last_match[1].to_sym
 | |
|               release = self.class.coerce_os_release(Regexp.last_match[2])
 | |
|               [[operator, release]]
 | |
|             else
 | |
|               raise "'depends_on macos' comparison expressions cannot be combined" if @macos.first.is_a?(Symbol)
 | |
|               Array(*arg).map { |elt|
 | |
|                 self.class.coerce_os_release(elt)
 | |
|               }.sort
 | |
|             end
 | |
|     @macos.concat(macos)
 | |
|   end
 | |
| 
 | |
|   def arch=(*arg)
 | |
|     @arch ||= []
 | |
|     arches = Array(*arg).map { |elt|
 | |
|       elt = elt.to_s.downcase.sub(%r{^:}, "").tr("-", "_").to_sym
 | |
|       ARCH_SYNONYMS.key?(elt) ? ARCH_SYNONYMS[elt] : elt
 | |
|     }
 | |
|     invalid_arches = arches - VALID_ARCHES.keys
 | |
|     raise "invalid 'depends_on arch' values: #{invalid_arches.inspect}" unless invalid_arches.empty?
 | |
|     @arch.concat(arches.map { |arch| VALID_ARCHES[arch] })
 | |
|   end
 | |
| 
 | |
|   def x11=(arg)
 | |
|     raise "invalid 'depends_on x11' value: #{arg.inspect}" unless [true, false].include?(arg)
 | |
|     @x11 = arg
 | |
|   end
 | |
| 
 | |
|   def to_yaml
 | |
|     @pairs.to_yaml
 | |
|   end
 | |
| 
 | |
|   def to_s
 | |
|     @pairs.inspect
 | |
|   end
 | |
| end
 | 
