Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/deps: add --os and --arch #17122

Merged
merged 1 commit into from
Apr 22, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 75 additions & 63 deletions Library/Homebrew/cmd/deps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@
"debugging the `--installed`/`--eval-all` display mode."
switch "--HEAD",
description: "Show dependencies for HEAD version instead of stable version."
flag "--os=",
description: "Show dependencies for the given operating system."
flag "--arch=",
description: "Show dependencies for the given CPU architecture."
Comment on lines +69 to +72
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tangential: Do we list supported operating systems and architectures in the docs anywhere? If not, that might be a good thing to add at some point since this pattern is showing up in a few commands.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it is documented. Closest may be on_* docs - https://docs.brew.sh/Formula-Cookbook#handling-different-system-configurations

Supported architectures at least show up if unsupported one is passed in, e.g.

Error: New arch must be :arm or :intel

switch "--formula", "--formulae",
description: "Treat all named arguments as formulae."
switch "--cask", "--casks",
Expand All @@ -82,85 +86,93 @@

sig { override.void }
def run
raise UsageError, "`brew deps --os=all` is not supported" if args.os == "all"
raise UsageError, "`brew deps --arch=all` is not supported" if args.arch == "all"

os, arch = T.must(args.os_arch_combinations.first)
all = args.eval_all?

Formulary.enable_factory_cache!
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I double-checked to make sure that the caching strategy supports multiple platforms.


recursive = !args.direct?
installed = args.installed? || dependents(args.named.to_formulae_and_casks).all?(&:any_version_installed?)

@use_runtime_dependencies = installed && recursive &&
!args.tree? &&
!args.graph? &&
!args.HEAD? &&
!args.include_build? &&
!args.include_test? &&
!args.include_optional? &&
!args.skip_recommended? &&
!args.missing?

if args.tree? || args.graph?
dependents = if args.named.present?
sorted_dependents(args.named.to_formulae_and_casks)
elsif args.installed?
case args.only_formula_or_cask
SimulateSystem.with(os:, arch:) do
recursive = !args.direct?
installed = args.installed? || dependents(args.named.to_formulae_and_casks).all?(&:any_version_installed?)

@use_runtime_dependencies = installed && recursive &&
!args.tree? &&
!args.graph? &&
!args.HEAD? &&
!args.include_build? &&
!args.include_test? &&
!args.include_optional? &&
!args.skip_recommended? &&
!args.missing? &&
args.os.nil? &&
args.arch.nil?

if args.tree? || args.graph?
dependents = if args.named.present?
sorted_dependents(args.named.to_formulae_and_casks)
elsif args.installed?
case args.only_formula_or_cask
when :formula
sorted_dependents(Formula.installed)
when :cask
sorted_dependents(Cask::Caskroom.casks)
else
sorted_dependents(Formula.installed + Cask::Caskroom.casks)
end
else
raise FormulaUnspecifiedError
end

if args.graph?
dot_code = dot_code(dependents, recursive:)
if args.dot?

Check warning on line 131 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L131

Added line #L131 was not covered by tests
puts dot_code
else
exec_browser "https://dreampuf.github.io/GraphvizOnline/##{ERB::Util.url_encode(dot_code)}"
end
return

Check warning on line 136 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L136

Added line #L136 was not covered by tests
end

puts_deps_tree(dependents, recursive:)
return

Check warning on line 140 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L139-L140

Added lines #L139 - L140 were not covered by tests
elsif all
puts_deps(sorted_dependents(
Formula.all(eval_all: args.eval_all?) + Cask::Cask.all(eval_all: args.eval_all?),
), recursive:)
return

Check warning on line 145 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L145

Added line #L145 was not covered by tests
elsif !args.no_named? && args.for_each?
puts_deps(sorted_dependents(args.named.to_formulae_and_casks), recursive:)
return

Check warning on line 148 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L148

Added line #L148 was not covered by tests
end

if args.no_named?
raise FormulaUnspecifiedError unless args.installed?

sorted_dependents_formulae_and_casks = case args.only_formula_or_cask

Check warning on line 154 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L154

Added line #L154 was not covered by tests
when :formula
sorted_dependents(Formula.installed)
when :cask
sorted_dependents(Cask::Caskroom.casks)
else
sorted_dependents(Formula.installed + Cask::Caskroom.casks)
end
else
raise FormulaUnspecifiedError
end

if args.graph?
dot_code = dot_code(dependents, recursive:)
if args.dot?
puts dot_code
else
exec_browser "https://dreampuf.github.io/GraphvizOnline/##{ERB::Util.url_encode(dot_code)}"
end
puts_deps(sorted_dependents_formulae_and_casks, recursive:)

Check warning on line 162 in Library/Homebrew/cmd/deps.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cmd/deps.rb#L162

Added line #L162 was not covered by tests
return
end

puts_deps_tree(dependents, recursive:)
return
elsif all
puts_deps(sorted_dependents(
Formula.all(eval_all: args.eval_all?) + Cask::Cask.all(eval_all: args.eval_all?),
), recursive:)
return
elsif !args.no_named? && args.for_each?
puts_deps(sorted_dependents(args.named.to_formulae_and_casks), recursive:)
return
end

if args.no_named?
raise FormulaUnspecifiedError unless args.installed?
dependents = dependents(args.named.to_formulae_and_casks)
check_head_spec(dependents) if args.HEAD?

sorted_dependents_formulae_and_casks = case args.only_formula_or_cask
when :formula
sorted_dependents(Formula.installed)
when :cask
sorted_dependents(Cask::Caskroom.casks)
else
sorted_dependents(Formula.installed + Cask::Caskroom.casks)
end
puts_deps(sorted_dependents_formulae_and_casks, recursive:)
return
all_deps = deps_for_dependents(dependents, recursive:, &(args.union? ? :| : :&))
condense_requirements(all_deps)
all_deps.map! { |d| dep_display_name(d) }
all_deps.uniq!
all_deps.sort! unless args.topological?
puts all_deps
end

dependents = dependents(args.named.to_formulae_and_casks)
check_head_spec(dependents) if args.HEAD?

all_deps = deps_for_dependents(dependents, recursive:, &(args.union? ? :| : :&))
condense_requirements(all_deps)
all_deps.map! { |d| dep_display_name(d) }
all_deps.uniq!
all_deps.sort! unless args.topological?
puts all_deps
end

private
Expand Down