From 7be2b943cbcfebde23223ac6ba8ce4397454e55a Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 30 Jul 2020 12:59:01 -0400 Subject: [PATCH 1/2] uses: Print cask uses --- Library/Homebrew/cmd/deps.rb | 10 ----- Library/Homebrew/cmd/uses.rb | 67 +++++++++++++++++++------------- Library/Homebrew/dependencies.rb | 11 ++++++ 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/Library/Homebrew/cmd/deps.rb b/Library/Homebrew/cmd/deps.rb index 1f67439108..1c3b5ed722 100644 --- a/Library/Homebrew/cmd/deps.rb +++ b/Library/Homebrew/cmd/deps.rb @@ -110,16 +110,6 @@ module Homebrew puts all_deps end - def dependents(formulae_or_casks) - formulae_or_casks.map do |formula_or_cask| - if formula_or_cask.is_a?(Formula) - formula_or_cask - else - CaskDependent.new(formula_or_cask) - end - end - end - def sorted_dependents(formulae_or_casks) dependents(formulae_or_casks).sort_by(&:name) end diff --git a/Library/Homebrew/cmd/uses.rb b/Library/Homebrew/cmd/uses.rb index db8a89c20d..7b2d47975c 100644 --- a/Library/Homebrew/cmd/uses.rb +++ b/Library/Homebrew/cmd/uses.rb @@ -6,6 +6,7 @@ require "formula" require "cli/parser" +require "cask/caskroom" module Homebrew extend DependenciesHelpers @@ -71,36 +72,16 @@ module Homebrew uses = if use_runtime_dependents && !used_formulae_missing used_formulae.map(&:runtime_installed_formula_dependents) .reduce(&:&) - .select(&:any_version_installed?) + .select(&:any_version_installed?) + + select_used_dependents(dependents(Cask::Caskroom.casks), used_formulae) else - formulae = args.installed? ? Formula.installed : Formula - recursive = args.recursive? - includes, ignores = argv_includes_ignores(ARGV) - - formulae.select do |f| - deps = if recursive - recursive_includes(Dependency, f, includes, ignores) - else - reject_ignores(f.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 + deps = if args.installed? + dependents(Formula.installed + Cask::Caskroom.casks) + else + dependents(Formula.to_a + Cask::Cask.to_a) end + + select_used_dependents(deps, used_formulae) end return if uses.empty? @@ -108,4 +89,34 @@ module Homebrew puts Formatter.columns(uses.map(&:full_name).sort) odie "Missing formulae should not have dependents!" if used_formulae_missing end + + def select_used_dependents(dependents, used_formulae) + recursive = args.recursive? + includes, ignores = argv_includes_ignores(ARGV) + + 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 end diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index ceac7f54e5..74ffac37fa 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "delegate" +require "cask_dependent" class Dependencies < DelegateClass(Array) def initialize(*args) @@ -122,4 +123,14 @@ module DependenciesHelpers includes.none? { |include| dep.send(include) } end end + + def dependents(formulae_or_casks) + formulae_or_casks.map do |formula_or_cask| + if formula_or_cask.is_a?(Formula) + formula_or_cask + else + CaskDependent.new(formula_or_cask) + end + end + end end From e05538a7d9f50c821b5605deff534beed85b8a04 Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 31 Jul 2020 11:35:45 -0400 Subject: [PATCH 2/2] Create DependenciesHelpers file, add tests --- Library/Homebrew/cmd/deps.rb | 1 + Library/Homebrew/cmd/uses.rb | 1 + Library/Homebrew/dependencies.rb | 78 ------------------ Library/Homebrew/dependencies_helpers.rb | 82 +++++++++++++++++++ .../test/dependencies_helpers_spec.rb | 47 +++++++++++ 5 files changed, 131 insertions(+), 78 deletions(-) create mode 100644 Library/Homebrew/dependencies_helpers.rb create mode 100644 Library/Homebrew/test/dependencies_helpers_spec.rb diff --git a/Library/Homebrew/cmd/deps.rb b/Library/Homebrew/cmd/deps.rb index 1c3b5ed722..204c802997 100644 --- a/Library/Homebrew/cmd/deps.rb +++ b/Library/Homebrew/cmd/deps.rb @@ -4,6 +4,7 @@ require "formula" require "ostruct" require "cli/parser" require "cask/caskroom" +require "dependencies_helpers" module Homebrew extend DependenciesHelpers diff --git a/Library/Homebrew/cmd/uses.rb b/Library/Homebrew/cmd/uses.rb index 7b2d47975c..62ad182c46 100644 --- a/Library/Homebrew/cmd/uses.rb +++ b/Library/Homebrew/cmd/uses.rb @@ -7,6 +7,7 @@ require "formula" require "cli/parser" require "cask/caskroom" +require "dependencies_helpers" module Homebrew extend DependenciesHelpers diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index 74ffac37fa..476d1b53ec 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -56,81 +56,3 @@ class Requirements < DelegateClass(Set) "#<#{self.class.name}: {#{to_a.join(", ")}}>" end end - -module DependenciesHelpers - 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 args.skip_recommended? - - [includes, ignores] - end - - def recursive_includes(klass, root_dependent, includes, ignores) - type = if klass == Dependency - :dependencies - elsif klass == Requirement - :requirements - else - raise ArgumentError, "Invalid class argument: #{klass}" - end - - root_dependent.send("recursive_#{type}") do |dependent, dep| - if dep.recommended? - klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep) - elsif dep.optional? - klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep) - elsif dep.build? || dep.test? - keep = false - keep ||= dep.test? && includes.include?("test?") && dependent == formula - keep ||= dep.build? && includes.include?("build?") - klass.prune unless keep - end - - # If a tap isn't installed, we can't find the dependencies of one of - # 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) } - - includes.none? { |include| dep.send(include) } - end - end - - def dependents(formulae_or_casks) - formulae_or_casks.map do |formula_or_cask| - if formula_or_cask.is_a?(Formula) - formula_or_cask - else - CaskDependent.new(formula_or_cask) - end - end - end -end diff --git a/Library/Homebrew/dependencies_helpers.rb b/Library/Homebrew/dependencies_helpers.rb new file mode 100644 index 0000000000..e435e33412 --- /dev/null +++ b/Library/Homebrew/dependencies_helpers.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require "cask_dependent" + +module DependenciesHelpers + 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 args.skip_recommended? + + [includes, ignores] + end + + def recursive_includes(klass, root_dependent, includes, ignores) + type = if klass == Dependency + :dependencies + elsif klass == Requirement + :requirements + else + raise ArgumentError, "Invalid class argument: #{klass}" + end + + root_dependent.send("recursive_#{type}") do |dependent, dep| + if dep.recommended? + klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep) + elsif dep.optional? + klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep) + elsif dep.build? || dep.test? + keep = false + keep ||= dep.test? && includes.include?("test?") && dependent == formula + keep ||= dep.build? && includes.include?("build?") + klass.prune unless keep + end + + # If a tap isn't installed, we can't find the dependencies of one of + # 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) } + + includes.none? { |include| dep.send(include) } + end + end + + def dependents(formulae_or_casks) + formulae_or_casks.map do |formula_or_cask| + if formula_or_cask.is_a?(Formula) + formula_or_cask + else + CaskDependent.new(formula_or_cask) + end + end + end + module_function :dependents +end diff --git a/Library/Homebrew/test/dependencies_helpers_spec.rb b/Library/Homebrew/test/dependencies_helpers_spec.rb new file mode 100644 index 0000000000..4686084bce --- /dev/null +++ b/Library/Homebrew/test/dependencies_helpers_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require "dependencies_helpers" + +describe DependenciesHelpers do + specify "#dependents" do + foo = formula "foo" do + url "foo" + version "1.0" + end + + foo_cask = Cask::CaskLoader.load(+<<-RUBY) + cask "foo_cask" do + end + RUBY + + bar = formula "bar" do + url "bar-url" + version "1.0" + end + + bar_cask = Cask::CaskLoader.load(+<<-RUBY) + cask "bar-cask" do + end + RUBY + + methods = [ + :name, + :full_name, + :runtime_dependencies, + :deps, + :requirements, + :recursive_dependencies, + :recursive_requirements, + :any_version_installed?, + ] + + dependents = described_class.dependents([foo, foo_cask, bar, bar_cask]) + + dependents.each do |dependent| + methods.each do |method| + expect(dependent.respond_to?(method)) + .to be true + end + end + end +end