| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | require 'dependable' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # A dependency on another Homebrew formula. | 
					
						
							|  |  |  | class Dependency | 
					
						
							|  |  |  |   include Dependable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   attr_reader :name, :tags | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   attr_accessor :env_proc | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 16:08:50 -05:00
										 |  |  |   def initialize(name, tags=[]) | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |     @name = name | 
					
						
							| 
									
										
										
										
											2013-05-06 16:08:50 -05:00
										 |  |  |     @tags = tags | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def to_s | 
					
						
							|  |  |  |     name | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def ==(other) | 
					
						
							|  |  |  |     name == other.name | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def eql?(other) | 
					
						
							| 
									
										
										
										
											2013-05-25 14:25:24 -05:00
										 |  |  |     instance_of?(other.class) && hash == other.hash | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def hash | 
					
						
							|  |  |  |     name.hash | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def to_formula | 
					
						
							|  |  |  |     f = Formula.factory(name) | 
					
						
							|  |  |  |     # Add this dependency's options to the formula's build args | 
					
						
							|  |  |  |     f.build.args = f.build.args.concat(options) | 
					
						
							|  |  |  |     f | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def installed? | 
					
						
							|  |  |  |     to_formula.installed? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def requested? | 
					
						
							|  |  |  |     ARGV.formulae.include?(to_formula) rescue false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 19:40:10 -06:00
										 |  |  |   def satisfied? | 
					
						
							|  |  |  |     installed? && missing_options.empty? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def missing_options | 
					
						
							| 
									
										
										
										
											2013-01-21 10:33:56 +01:00
										 |  |  |     options - Tab.for_formula(to_formula).used_options - to_formula.build.implicit_options | 
					
						
							| 
									
										
										
										
											2013-01-27 19:40:10 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   def universal! | 
					
						
							|  |  |  |     tags << 'universal' if to_formula.build.has_option? 'universal' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   def modify_build_environment | 
					
						
							|  |  |  |     env_proc.call unless env_proc.nil? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-07 20:36:13 -05:00
										 |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class}: #{name.inspect} #{tags.inspect}>" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |   class << self | 
					
						
							|  |  |  |     # Expand the dependencies of dependent recursively, optionally yielding | 
					
						
							|  |  |  |     # [dependent, dep] pairs to allow callers to apply arbitrary filters to | 
					
						
							|  |  |  |     # the list. | 
					
						
							|  |  |  |     # The default filter, which is applied when a block is not given, omits | 
					
						
							|  |  |  |     # optionals and recommendeds based on what the dependent has asked for. | 
					
						
							|  |  |  |     def expand(dependent, &block) | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |       deps = dependent.deps.map do |dep| | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |         if prune?(dependent, dep, &block) | 
					
						
							|  |  |  |           next | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           expand(dep.to_formula, &block) << dep | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |       end.flatten.compact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       merge_repeats(deps) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def prune?(dependent, dep, &block) | 
					
						
							|  |  |  |       catch(:prune) do | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |         if block_given? | 
					
						
							|  |  |  |           yield dependent, dep | 
					
						
							|  |  |  |         elsif dep.optional? || dep.recommended? | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |           prune unless dependent.build.with?(dep.name) | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     # Used to prune dependencies when calling expand with a block. | 
					
						
							|  |  |  |     def prune | 
					
						
							|  |  |  |       throw(:prune, true) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def merge_repeats(deps) | 
					
						
							|  |  |  |       grouped = deps.group_by(&:name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       deps.uniq.map do |dep| | 
					
						
							| 
									
										
										
										
											2013-06-08 19:44:02 -05:00
										 |  |  |         dep.class.new(dep.name, grouped.fetch(dep.name).map(&:tags).flatten) | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | end |