diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb index 619bc49feb..b55cfb10f9 100644 --- a/Library/Homebrew/cmd/list.rb +++ b/Library/Homebrew/cmd/list.rb @@ -7,6 +7,7 @@ require "formula" require "cli/parser" require "cask/list" require "system_command" +require "tab" module Homebrew module Cmd @@ -36,6 +37,11 @@ module Homebrew switch "--pinned", description: "List only pinned formulae, or only the specified (pinned) " \ "formulae if are provided. See also `pin`, `unpin`." + switch "--installed-on-request", + description: "List the formulae installed on request." + switch "--installed-as-dependency", + description: "List the formulae installed as dependencies." + # passed through to ls switch "-1", description: "Force output to be one entry per line. " \ @@ -54,11 +60,18 @@ module Homebrew conflicts "--pinned", "--cask" conflicts "--multiple", "--cask" conflicts "--pinned", "--multiple" + ["--installed-on-request", "--installed-as-dependency"].each do |flag| + conflicts "--cask", flag + conflicts "--versions", flag + conflicts "--pinned", flag + end ["-1", "-l", "-r", "-t"].each do |flag| conflicts "--versions", flag conflicts "--pinned", flag end - ["--versions", "--pinned", "-l", "-r", "-t"].each do |flag| + ["--versions", "--pinned", + "---installed-on-request", "--installed-as-dependency", + "-l", "-r", "-t"].each do |flag| conflicts "--full-name", flag end @@ -91,6 +104,28 @@ module Homebrew elsif args.versions? filtered_list unless args.cask? list_casks if args.cask? || (!args.formula? && !args.multiple? && args.no_named?) + elsif args.installed_on_request? || args.installed_as_dependency? + unless args.no_named? + raise UsageError, + "Cannot use `--installed-on-request` or " \ + "`--installed-as-dependency` with formula arguments." + end + + Formula.installed.sort.each do |formula| + tab = Tab.for_formula(formula) + + if args.installed_on_request? && args.installed_as_dependency? + statuses = [] + statuses << "installed on request" if tab.installed_on_request + statuses << "installed as dependency" if tab.installed_as_dependency + next if statuses.empty? + + puts "#{formula.name}: #{statuses.join(", ")}" + elsif (args.installed_on_request? && tab.installed_on_request) || + (args.installed_as_dependency? && tab.installed_as_dependency) + puts formula.name + end + end elsif args.no_named? ENV["CLICOLOR"] = nil diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/list.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/list.rbi index 30f707efbb..5e9ea56337 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/list.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/list.rbi @@ -25,6 +25,12 @@ class Homebrew::Cmd::List::Args < Homebrew::CLI::Args sig { returns(T::Boolean) } def full_name?; end + sig { returns(T::Boolean) } + def installed_as_dependency?; end + + sig { returns(T::Boolean) } + def installed_on_request?; end + sig { returns(T::Boolean) } def l?; end diff --git a/Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb b/Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb index e12cadbb49..c160203735 100644 --- a/Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb +++ b/Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb @@ -19,8 +19,10 @@ RSpec.describe Tapioca::Compilers::Args do describe "#args_table" do it "returns a mapping of list args to default values" do expect(compiler.args_table(list_parser).keys).to contain_exactly( - :"1?", :cask?, :casks?, :d?, :debug?, :formula?, :formulae?, :full_name?, :h?, :help?, :l?, :multiple?, - :pinned?, :q?, :quiet?, :r?, :t?, :v?, :verbose?, :versions? + :"1?", :cask?, :casks?, :d?, :debug?, :formula?, :formulae?, + :full_name?, :h?, :help?, :installed_as_dependency?, + :installed_on_request?, :l?, :multiple?, :pinned?, + :q?, :quiet?, :r?, :t?, :v?, :verbose?, :versions? ) end diff --git a/completions/bash/brew b/completions/bash/brew index a49d1553e8..967363f593 100644 --- a/completions/bash/brew +++ b/completions/bash/brew @@ -1422,6 +1422,8 @@ _brew_list() { --formula --full-name --help + --installed-as-dependency + --installed-on-request --multiple --pinned --quiet @@ -1524,6 +1526,8 @@ _brew_ls() { --formula --full-name --help + --installed-as-dependency + --installed-on-request --multiple --pinned --quiet diff --git a/completions/fish/brew.fish b/completions/fish/brew.fish index 50517e001f..e8ab276a78 100644 --- a/completions/fish/brew.fish +++ b/completions/fish/brew.fish @@ -997,6 +997,8 @@ __fish_brew_complete_arg 'list' -l debug -d 'Display any debugging information' __fish_brew_complete_arg 'list' -l formula -d 'List only formulae, or treat all named arguments as formulae' __fish_brew_complete_arg 'list' -l full-name -d 'Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output' __fish_brew_complete_arg 'list' -l help -d 'Show this message' +__fish_brew_complete_arg 'list' -l installed-as-dependency -d 'List the formulae installed as dependencies' +__fish_brew_complete_arg 'list' -l installed-on-request -d 'List the formulae installed on request' __fish_brew_complete_arg 'list' -l multiple -d 'Only show formulae with multiple versions installed' __fish_brew_complete_arg 'list' -l pinned -d 'List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`' __fish_brew_complete_arg 'list' -l quiet -d 'Make some output more quiet' @@ -1063,6 +1065,8 @@ __fish_brew_complete_arg 'ls' -l debug -d 'Display any debugging information' __fish_brew_complete_arg 'ls' -l formula -d 'List only formulae, or treat all named arguments as formulae' __fish_brew_complete_arg 'ls' -l full-name -d 'Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output' __fish_brew_complete_arg 'ls' -l help -d 'Show this message' +__fish_brew_complete_arg 'ls' -l installed-as-dependency -d 'List the formulae installed as dependencies' +__fish_brew_complete_arg 'ls' -l installed-on-request -d 'List the formulae installed on request' __fish_brew_complete_arg 'ls' -l multiple -d 'Only show formulae with multiple versions installed' __fish_brew_complete_arg 'ls' -l pinned -d 'List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`' __fish_brew_complete_arg 'ls' -l quiet -d 'Make some output more quiet' diff --git a/completions/zsh/_brew b/completions/zsh/_brew index 754ca3f7d2..1253d2becb 100644 --- a/completions/zsh/_brew +++ b/completions/zsh/_brew @@ -1234,13 +1234,15 @@ _brew_linkage() { _brew_list() { _arguments \ '--debug[Display any debugging information]' \ - '(--versions --pinned --l --r --t)--full-name[Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output]' \ + '(--versions --pinned ---installed-on-request --installed-as-dependency --l --r --t)--full-name[Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output]' \ '--help[Show this message]' \ + '(--cask --versions --pinned --full-name)--installed-as-dependency[List the formulae installed as dependencies]' \ + '(--cask --versions --pinned)--installed-on-request[List the formulae installed on request]' \ '(--cask --pinned)--multiple[Only show formulae with multiple versions installed]' \ - '(--cask --multiple --1 --l --r --t --full-name)--pinned[List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`]' \ + '(--cask --multiple --installed-on-request --installed-as-dependency --1 --l --r --t --full-name)--pinned[List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`]' \ '--quiet[Make some output more quiet]' \ '--verbose[Make some output more verbose]' \ - '(--1 --l --r --t --full-name)--versions[Show the version number for installed formulae, or only the specified formulae if formula are provided]' \ + '(--installed-on-request --installed-as-dependency --1 --l --r --t --full-name)--versions[Show the version number for installed formulae, or only the specified formulae if formula are provided]' \ '-1[Force output to be one entry per line. This is the default when output is not to a terminal]' \ '-l[List formulae and/or casks in long format. Has no effect when a formula or cask name is passed as an argument]' \ '-r[Reverse the order of the formulae and/or casks sort to list the oldest entries first. Has no effect when a formula or cask name is passed as an argument]' \ @@ -1249,7 +1251,7 @@ _brew_list() { '(--cask)--formula[List only formulae, or treat all named arguments as formulae]' \ '*::installed_formula:__brew_installed_formulae' \ - installed_cask \ - '(--formula --pinned --multiple)--cask[List only casks, or treat all named arguments as casks]' \ + '(--formula --pinned --multiple --installed-on-request --installed-as-dependency)--cask[List only casks, or treat all named arguments as casks]' \ '*::installed_cask:__brew_installed_casks' } @@ -1315,13 +1317,15 @@ _brew_log() { _brew_ls() { _arguments \ '--debug[Display any debugging information]' \ - '(--versions --pinned --l --r --t)--full-name[Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output]' \ + '(--versions --pinned ---installed-on-request --installed-as-dependency --l --r --t)--full-name[Print formulae with fully-qualified names. Unless `--full-name`, `--versions` or `--pinned` are passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) which produces the actual output]' \ '--help[Show this message]' \ + '(--cask --versions --pinned --full-name)--installed-as-dependency[List the formulae installed as dependencies]' \ + '(--cask --versions --pinned)--installed-on-request[List the formulae installed on request]' \ '(--cask --pinned)--multiple[Only show formulae with multiple versions installed]' \ - '(--cask --multiple --1 --l --r --t --full-name)--pinned[List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`]' \ + '(--cask --multiple --installed-on-request --installed-as-dependency --1 --l --r --t --full-name)--pinned[List only pinned formulae, or only the specified (pinned) formulae if formula are provided. See also `pin`, `unpin`]' \ '--quiet[Make some output more quiet]' \ '--verbose[Make some output more verbose]' \ - '(--1 --l --r --t --full-name)--versions[Show the version number for installed formulae, or only the specified formulae if formula are provided]' \ + '(--installed-on-request --installed-as-dependency --1 --l --r --t --full-name)--versions[Show the version number for installed formulae, or only the specified formulae if formula are provided]' \ '-1[Force output to be one entry per line. This is the default when output is not to a terminal]' \ '-l[List formulae and/or casks in long format. Has no effect when a formula or cask name is passed as an argument]' \ '-r[Reverse the order of the formulae and/or casks sort to list the oldest entries first. Has no effect when a formula or cask name is passed as an argument]' \ @@ -1330,7 +1334,7 @@ _brew_ls() { '(--cask)--formula[List only formulae, or treat all named arguments as formulae]' \ '*::installed_formula:__brew_installed_formulae' \ - installed_cask \ - '(--formula --pinned --multiple)--cask[List only casks, or treat all named arguments as casks]' \ + '(--formula --pinned --multiple --installed-on-request --installed-as-dependency)--cask[List only casks, or treat all named arguments as casks]' \ '*::installed_cask:__brew_installed_casks' } diff --git a/docs/Manpage.md b/docs/Manpage.md index 7978b22cf6..dedea4a587 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -749,6 +749,14 @@ paths within its current keg. If *`cask`* is provided, list its artifacts. : List only pinned formulae, or only the specified (pinned) formulae if *`formula`* are provided. See also `pin`, `unpin`. +`--installed-on-request` + +: List the formulae installed on request. + +`--installed-as-dependency` + +: List the formulae installed as dependencies. + `-1` : Force output to be one entry per line. This is the default when output is not diff --git a/manpages/brew.1 b/manpages/brew.1 index 6cd41fcf67..c4fbadc865 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -470,6 +470,12 @@ Only show formulae with multiple versions installed\. \fB\-\-pinned\fP List only pinned formulae, or only the specified (pinned) formulae if \fIformula\fP are provided\. See also \fBpin\fP, \fBunpin\fP\&\. .TP +\fB\-\-installed\-on\-request\fP +List the formulae installed on request\. +.TP +\fB\-\-installed\-as\-dependency\fP +List the formulae installed as dependencies\. +.TP \fB\-1\fP Force output to be one entry per line\. This is the default when output is not to a terminal\. .TP