| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-26 11:03:08 -07:00
										 |  |  | # `brew uses foo bar` returns formulae that use both foo and bar | 
					
						
							|  |  |  | # If you want the union, run the command twice and concatenate the results. | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | # The intersection is harder to achieve with shell tools. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-04 00:07:27 -04:00
										 |  |  | require "formula" | 
					
						
							|  |  |  | require "cli/parser" | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  | require "cask/caskroom" | 
					
						
							| 
									
										
										
										
											2020-07-31 11:35:45 -04:00
										 |  |  | require "dependencies_helpers" | 
					
						
							| 
									
										
										
										
											2019-09-04 00:07:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 22:41:47 -05:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-07-23 02:00:44 +02:00
										 |  |  |   extend DependenciesHelpers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |   def uses_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							|  |  |  |       usage_banner <<~EOS | 
					
						
							| 
									
										
										
										
											2019-01-30 21:32:35 +00:00
										 |  |  |         `uses` [<options>] <formula> | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 08:08:13 -07:00
										 |  |  |         Show formulae that specify <formula> as a dependency (i.e. show dependents | 
					
						
							|  |  |  |         of <formula>). When given multiple formula arguments, show the intersection | 
					
						
							|  |  |  |         of formulae that use <formula>. By default, `uses` shows all formulae that | 
					
						
							|  |  |  |         specify <formula> as a required or recommended dependency for their stable builds. | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       EOS | 
					
						
							|  |  |  |       switch "--recursive", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Resolve more than one level of dependencies." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--installed", | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |              description: "Only list formulae that are currently installed." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--include-build", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Include all formulae that specify <formula> as `:build` type dependency." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--include-test", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Include all formulae that specify <formula> as `:test` type dependency." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--include-optional", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Include all formulae that specify <formula> as `:optional` type dependency." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--skip-recommended", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Skip all formulae that specify <formula> as `:recommended` type dependency." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--devel", | 
					
						
							| 
									
										
										
										
											2019-08-06 14:22:24 -04:00
										 |  |  |              description: "Show usage of <formula> by development builds." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |       switch "--HEAD", | 
					
						
							| 
									
										
										
										
											2019-08-06 14:22:24 -04:00
										 |  |  |              description: "Show usage of <formula> by HEAD builds." | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-29 19:39:41 +00:00
										 |  |  |       conflicts "--devel", "--HEAD" | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       min_named :formula | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   def uses | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  |     args = uses_args.parse | 
					
						
							| 
									
										
										
										
											2018-11-11 19:03:08 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 08:08:13 -07:00
										 |  |  |     odeprecated "brew uses --devel" if args.devel? | 
					
						
							|  |  |  |     odeprecated "brew uses --HEAD" if args.HEAD? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-05 20:34:50 +00:00
										 |  |  |     Formulary.enable_factory_cache! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-17 15:06:24 +01:00
										 |  |  |     used_formulae_missing = false | 
					
						
							|  |  |  |     used_formulae = begin | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       args.formulae | 
					
						
							| 
									
										
										
										
											2017-04-17 15:06:24 +01:00
										 |  |  |     rescue FormulaUnavailableError => e | 
					
						
							|  |  |  |       opoo e | 
					
						
							|  |  |  |       used_formulae_missing = true | 
					
						
							|  |  |  |       # If the formula doesn't exist: fake the needed formula object name. | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       args.named.map { |name| OpenStruct.new name: name, full_name: name } | 
					
						
							| 
									
										
										
										
											2017-04-17 15:06:24 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 12:49:46 +00:00
										 |  |  |     use_runtime_dependents = args.installed? && | 
					
						
							| 
									
										
										
										
											2020-07-31 10:46:02 -07:00
										 |  |  |                              !used_formulae_missing && | 
					
						
							| 
									
										
										
										
											2019-11-27 12:49:46 +00:00
										 |  |  |                              !args.include_build? && | 
					
						
							|  |  |  |                              !args.include_test? && | 
					
						
							|  |  |  |                              !args.include_optional? && | 
					
						
							|  |  |  |                              !args.skip_recommended? | 
					
						
							| 
									
										
										
										
											2018-03-24 16:55:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 10:46:02 -07:00
										 |  |  |     uses = intersection_of_dependents(use_runtime_dependents, used_formulae, args: args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return if uses.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     puts Formatter.columns(uses.map(&:full_name).sort) | 
					
						
							|  |  |  |     odie "Missing formulae should not have dependents!" if used_formulae_missing | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def intersection_of_dependents(use_runtime_dependents, used_formulae, args:) | 
					
						
							| 
									
										
										
										
											2020-08-01 11:55:40 -04:00
										 |  |  |     recursive = args.recursive? | 
					
						
							|  |  |  |     includes, ignores = args_includes_ignores(args) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 10:46:02 -07:00
										 |  |  |     if use_runtime_dependents | 
					
						
							| 
									
										
										
										
											2019-11-05 20:34:50 +00:00
										 |  |  |       used_formulae.map(&:runtime_installed_formula_dependents) | 
					
						
							|  |  |  |                    .reduce(&:&) | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  |                    .select(&:any_version_installed?) + | 
					
						
							| 
									
										
										
										
											2020-08-01 11:55:40 -04:00
										 |  |  |         select_used_dependents(dependents(Cask::Caskroom.casks), used_formulae, recursive, includes, ignores) | 
					
						
							| 
									
										
										
										
											2019-11-05 20:34:50 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  |       deps = if args.installed? | 
					
						
							|  |  |  |         dependents(Formula.installed + Cask::Caskroom.casks) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         dependents(Formula.to_a + Cask::Cask.to_a) | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-01 11:55:40 -04:00
										 |  |  |       select_used_dependents(deps, used_formulae, recursive, includes, ignores) | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-01 11:55:40 -04:00
										 |  |  |   def select_used_dependents(dependents, used_formulae, recursive, includes, ignores) | 
					
						
							| 
									
										
										
										
											2020-07-30 12:59:01 -04:00
										 |  |  |     dependents.select do |d| | 
					
						
							|  |  |  |       deps = if recursive | 
					
						
							|  |  |  |         recursive_includes(Dependency, d, includes, ignores) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         reject_ignores(d.deps, ignores, includes) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       used_formulae.all? do |ff| | 
					
						
							|  |  |  |         deps.any? do |dep| | 
					
						
							|  |  |  |           match = begin | 
					
						
							|  |  |  |             dep.to_formula.full_name == ff.full_name if dep.name.include?("/") | 
					
						
							|  |  |  |           rescue | 
					
						
							|  |  |  |             nil | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           next match unless match.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           dep.name == ff.name | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       rescue FormulaUnavailableError | 
					
						
							|  |  |  |         # Silently ignore this case as we don't care about things used in | 
					
						
							|  |  |  |         # taps that aren't currently tapped. | 
					
						
							|  |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | end |