diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index cc2f277e02..4032bb9dab 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -50,6 +50,69 @@ module Homebrew def passthrough options_only - CLI::Parser.global_options.values.map(&:first).flatten end + + def downcased_unique_named + # Only lowercase names, not paths, bottle filenames or URLs + @downcased_unique_named ||= remaining.map do |arg| + if arg.include?("/") || arg.end_with?(".tar.gz") || File.exist?(arg) + arg + else + arg.downcase + end + end.uniq + end + + def kegs + require "keg" + require "formula" + require "missing_formula" + + @kegs ||= downcased_unique_named.map do |name| + raise UsageError if name.empty? + + rack = Formulary.to_rack(name.downcase) + + dirs = rack.directory? ? rack.subdirs : [] + + if dirs.empty? + if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall")) + $stderr.puts reason + end + raise NoSuchKegError, rack.basename + end + + linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename + opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + + begin + if opt_prefix.symlink? && opt_prefix.directory? + Keg.new(opt_prefix.resolved_path) + elsif linked_keg_ref.symlink? && linked_keg_ref.directory? + Keg.new(linked_keg_ref.resolved_path) + elsif dirs.length == 1 + Keg.new(dirs.first) + else + f = if name.include?("/") || File.exist?(name) + Formulary.factory(name) + else + Formulary.from_rack(rack) + end + + unless (prefix = f.installed_prefix).directory? + raise MultipleVersionsInstalledError, rack.basename + end + + Keg.new(prefix) + end + rescue FormulaUnavailableError + raise <<~EOS + Multiple kegs installed to #{rack} + However we don't know which one you refer to. + Please delete (with rm -rf!) all but one and then try again. + EOS + end + end + end end end end diff --git a/Library/Homebrew/cmd/link.rb b/Library/Homebrew/cmd/link.rb index 4b45ca98ac..1697be6a6e 100644 --- a/Library/Homebrew/cmd/link.rb +++ b/Library/Homebrew/cmd/link.rb @@ -38,7 +38,7 @@ module Homebrew mode.overwrite = true if args.overwrite? mode.dry_run = true if args.dry_run? - ARGV.kegs.each do |keg| + Homebrew.args.kegs.each do |keg| keg_only = Formulary.keg_only?(keg.rack) if keg.linked? diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb index a6cd43d331..8c3004aff8 100644 --- a/Library/Homebrew/cmd/list.rb +++ b/Library/Homebrew/cmd/list.rb @@ -73,9 +73,9 @@ module Homebrew safe_system "ls", *Homebrew.args.passthrough << HOMEBREW_CELLAR end elsif args.verbose? || !$stdout.tty? - system_command! "find", args: ARGV.kegs.map(&:to_s) + %w[-not -type d -print], print_stdout: true + system_command! "find", args: Homebrew.args.kegs.map(&:to_s) + %w[-not -type d -print], print_stdout: true else - ARGV.kegs.each { |keg| PrettyListing.new keg } + Homebrew.args.kegs.each { |keg| PrettyListing.new keg } end end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 6604665548..a508f94d92 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -38,7 +38,7 @@ module Homebrew [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - ARGV.kegs.group_by(&:rack) + Homebrew.args.kegs.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) diff --git a/Library/Homebrew/cmd/unlink.rb b/Library/Homebrew/cmd/unlink.rb index 2e16ead6cb..98f9b3b26c 100644 --- a/Library/Homebrew/cmd/unlink.rb +++ b/Library/Homebrew/cmd/unlink.rb @@ -31,7 +31,7 @@ module Homebrew mode = OpenStruct.new mode.dry_run = true if args.dry_run? - ARGV.kegs.each do |keg| + Homebrew.args.kegs.each do |keg| if mode.dry_run puts "Would remove:" keg.unlink(mode) diff --git a/Library/Homebrew/dev-cmd/linkage.rb b/Library/Homebrew/dev-cmd/linkage.rb index cce1eb8bdb..64420fab60 100644 --- a/Library/Homebrew/dev-cmd/linkage.rb +++ b/Library/Homebrew/dev-cmd/linkage.rb @@ -33,10 +33,10 @@ module Homebrew linkage_args.parse CacheStoreDatabase.use(:linkage) do |db| - kegs = if ARGV.kegs.empty? + kegs = if Homebrew.args.kegs.empty? Formula.installed.map(&:opt_or_installed_prefix_keg).reject(&:nil?) else - ARGV.kegs + Homebrew.args.kegs end kegs.each do |keg| ohai "Checking #{keg.name} linkage" if kegs.size > 1 diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb index b312579b44..3d5a6d5e5e 100644 --- a/Library/Homebrew/extend/ARGV.rb +++ b/Library/Homebrew/extend/ARGV.rb @@ -39,58 +39,6 @@ module HomebrewArgvExtension downcased_unique_named.grep HOMEBREW_CASK_TAP_CASK_REGEX end - def kegs - require "keg" - require "formula" - require "missing_formula" - # TODO: use @instance variable to ||= cache when moving to CLI::Parser - downcased_unique_named.map do |name| - raise UsageError if name.empty? - - rack = Formulary.to_rack(name.downcase) - - dirs = rack.directory? ? rack.subdirs : [] - - if dirs.empty? - if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall")) - $stderr.puts reason - end - raise NoSuchKegError, rack.basename - end - - linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename - opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" - - begin - if opt_prefix.symlink? && opt_prefix.directory? - Keg.new(opt_prefix.resolved_path) - elsif linked_keg_ref.symlink? && linked_keg_ref.directory? - Keg.new(linked_keg_ref.resolved_path) - elsif dirs.length == 1 - Keg.new(dirs.first) - else - f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) - end - - unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename - end - - Keg.new(prefix) - end - rescue FormulaUnavailableError - raise <<~EOS - Multiple kegs installed to #{rack} - However we don't know which one you refer to. - Please delete (with rm -rf!) all but one and then try again. - EOS - end - end - end - def value(name) arg_prefix = "--#{name}=" flag_with_value = find { |arg| arg.start_with?(arg_prefix) } diff --git a/Library/Homebrew/test/ARGV_spec.rb b/Library/Homebrew/test/ARGV_spec.rb index 868240a1c3..b8ccd4d831 100644 --- a/Library/Homebrew/test/ARGV_spec.rb +++ b/Library/Homebrew/test/ARGV_spec.rb @@ -27,27 +27,6 @@ describe HomebrewArgvExtension do end end - describe "#kegs" do - context "when there are matching Kegs" do - before do - keg = HOMEBREW_CELLAR + "mxcl/10.0" - keg.mkpath - end - - it "returns an array of Kegs" do - expect(subject.kegs.length).to eq 1 - end - end - - context "when there are no matching Kegs" do - let(:argv) { [] } - - it "returns an empty array" do - expect(subject.kegs).to be_empty - end - end - end - describe "#named" do let(:argv) { ["foo", "--debug", "-v"] } diff --git a/Library/Homebrew/test/cli/parser_spec.rb b/Library/Homebrew/test/cli/parser_spec.rb index 5d5171f57b..8a326d52a7 100644 --- a/Library/Homebrew/test/cli/parser_spec.rb +++ b/Library/Homebrew/test/cli/parser_spec.rb @@ -235,5 +235,22 @@ describe Homebrew::CLI::Parser do parser.parse(["--foo", "--bar=value", "-v", "-s", "a", "b", "cdefg"]) expect(Homebrew.args.passthrough).to eq %w[--foo --bar=value -s] end + + context "kegs" do + before do + keg = HOMEBREW_CELLAR + "mxcl/10.0" + keg.mkpath + end + + it "when there are matching kegs returns an array of Kegs" do + parser.parse(["mxcl"]) + expect(Homebrew.args.kegs.length).to eq 1 + end + + it "when there are no matching kegs returns an array of Kegs" do + parser.parse([]) + expect(Homebrew.args.kegs).to be_empty + end + end end end