| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  | require "delegate" | 
					
						
							| 
									
										
										
										
											2013-01-07 14:06:34 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  | class Dependencies < DelegateClass(Array) | 
					
						
							|  |  |  |   def initialize(*args) | 
					
						
							|  |  |  |     super(args) | 
					
						
							| 
									
										
										
										
											2013-01-07 14:06:34 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   alias eql? == | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def optional | 
					
						
							|  |  |  |     select(&:optional?) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def recommended | 
					
						
							|  |  |  |     select(&:recommended?) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def build | 
					
						
							|  |  |  |     select(&:build?) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def required | 
					
						
							|  |  |  |     select(&:required?) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def default | 
					
						
							|  |  |  |     build + required + recommended | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-02-13 16:31:12 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-20 22:29:23 -06:00
										 |  |  |   def inspect | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |     "#<#{self.class.name}: #{to_a}>" | 
					
						
							| 
									
										
										
										
											2014-11-20 22:29:23 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-10-24 18:17:43 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  | class Requirements < DelegateClass(Set) | 
					
						
							|  |  |  |   def initialize(*args) | 
					
						
							|  |  |  |     super(Set.new(args)) | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def <<(other) | 
					
						
							| 
									
										
										
										
											2016-09-20 22:03:08 +02:00
										 |  |  |     if other.is_a?(Comparable) | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |       grep(other.class) do |req| | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  |         return self if req > other | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |         delete(req) | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  |     self | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class.name}: {#{to_a.join(", ")}}>" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-07-03 14:50:57 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							|  |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def argv_includes_ignores(argv) | 
					
						
							|  |  |  |     includes = [] | 
					
						
							|  |  |  |     ignores = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if argv.include? "--include-build" | 
					
						
							|  |  |  |       includes << "build?" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       ignores << "build?" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if argv.include? "--include-test" | 
					
						
							|  |  |  |       includes << "test?" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       ignores << "test?" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if argv.include? "--include-optional" | 
					
						
							|  |  |  |       includes << "optional?" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       ignores << "optional?" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ignores << "recommended?" if ARGV.include? "--skip-recommended" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [includes, ignores] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def recursive_includes(klass, formula, includes, ignores) | 
					
						
							|  |  |  |     type = if klass == Dependency | 
					
						
							|  |  |  |       :dependencies | 
					
						
							|  |  |  |     elsif klass == Requirement | 
					
						
							|  |  |  |       :requirements | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       raise ArgumentError, "Invalid class argument: #{klass}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     formula.send("recursive_#{type}") do |dependent, dep| | 
					
						
							|  |  |  |       if dep.recommended? | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |         klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep) | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  |       elsif dep.test? | 
					
						
							|  |  |  |         if includes.include?("test?") | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |           Dependency.keep_but_prune_recursive_deps if type == :dependencies | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |           klass.prune | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       elsif dep.optional? | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |         klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep) | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  |       elsif dep.build? | 
					
						
							|  |  |  |         klass.prune unless includes.include?("build?") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # If a tap isn't installed, we can't find the dependencies of one | 
					
						
							|  |  |  |       # its formulae, and an exception will be thrown if we try. | 
					
						
							|  |  |  |       if type == :dependencies && | 
					
						
							|  |  |  |          dep.is_a?(TapDependency) && | 
					
						
							|  |  |  |          !dep.tap.installed? | 
					
						
							|  |  |  |         Dependency.keep_but_prune_recursive_deps | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def reject_ignores(dependables, ignores, includes) | 
					
						
							|  |  |  |     dependables.reject do |dep| | 
					
						
							|  |  |  |       next false unless ignores.any? { |ignore| dep.send(ignore) } | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  |       includes.none? { |include| dep.send(include) } | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |