cli: fix options handling.

Fix breaking options on taps again (second time in two weeks, sob).

To avoid doing this again: also add a test for this case (that I've
verified would have caught these cases).
This commit is contained in:
Mike McQuaid 2020-05-07 10:33:02 +01:00
parent 954c833de2
commit c91f397605
No known key found for this signature in database
GPG Key ID: 48A898132FD8EE70
3 changed files with 42 additions and 23 deletions

View File

@ -13,6 +13,10 @@ module Homebrew
@processed_options = [] @processed_options = []
# Can set these because they will be overwritten by freeze_named_args!
# (whereas other values below will only be overwritten if passed).
self[:named_args] = argv.reject { |arg| arg.start_with?("-") }
# Set values needed before Parser#parse has been run. # Set values needed before Parser#parse has been run.
return unless set_default_args return unless set_default_args
@ -22,15 +26,24 @@ module Homebrew
self[:HEAD?] = argv.include?("--HEAD") self[:HEAD?] = argv.include?("--HEAD")
self[:devel?] = argv.include?("--devel") self[:devel?] = argv.include?("--devel")
self[:universal?] = argv.include?("--universal") self[:universal?] = argv.include?("--universal")
self[:named_args] = argv.reject { |arg| arg.start_with?("-") }
end end
def freeze_named_args!(named_args) def freeze_named_args!(named_args)
# Reset cache values reliant on named_args
@formulae = nil
@resolved_formulae = nil
@formulae_paths = nil
@casks = nil
@kegs = nil
self[:named_args] = named_args self[:named_args] = named_args
self[:named_args].freeze self[:named_args].freeze
end end
def freeze_processed_options!(processed_options) def freeze_processed_options!(processed_options)
# Reset cache values reliant on processed_options
@cli_args = nil
@processed_options += processed_options @processed_options += processed_options
@processed_options.freeze @processed_options.freeze
end end

View File

@ -166,7 +166,6 @@ module Homebrew
check_constraint_violations check_constraint_violations
check_named_args(named_args, allow_no_named_args: allow_no_named_args) check_named_args(named_args, allow_no_named_args: allow_no_named_args)
@args.freeze_named_args!(named_args) @args.freeze_named_args!(named_args)
parse_formula_options
@args.freeze_processed_options!(@processed_options) @args.freeze_processed_options!(@processed_options)
Homebrew.args = @args Homebrew.args = @args
@ -189,7 +188,21 @@ module Homebrew
end end
def formula_options def formula_options
@parse_formula_options = true @args.formulae.each do |f|
next if f.options.empty?
f.options.each do |o|
name = o.flag
description = "`#{f.name}`: #{o.description}"
if name.end_with? "="
flag name, description: description
else
switch name, description: description
end
end
end
rescue FormulaUnavailableError
[]
end end
def max_named(count) def max_named(count)
@ -228,26 +241,6 @@ module Homebrew
private private
def parse_formula_options
return unless @parse_formula_options
@args.formulae.each do |f|
next if f.options.empty?
f.options.each do |o|
name = o.flag
description = "`#{f.name}`: #{o.description}"
if name.end_with? "="
flag name, description: description
else
switch name, description: description
end
end
end
rescue FormulaUnavailableError
[]
end
def enable_switch(*names, from:) def enable_switch(*names, from:)
names.each do |name| names.each do |name|
@switch_sources[option_to_name(name)] = from @switch_sources[option_to_name(name)] = from

View File

@ -14,6 +14,17 @@ describe "brew install", :integration_test do
.to output(%r{#{HOMEBREW_CELLAR}/testball1/0\.1}).to_stdout .to output(%r{#{HOMEBREW_CELLAR}/testball1/0\.1}).to_stdout
.and not_to_output.to_stderr .and not_to_output.to_stderr
.and be_a_success .and be_a_success
expect(HOMEBREW_CELLAR/"testball1/0.1/foo/test").not_to be_a_file
end
it "installs formulae with options" do
setup_test_formula "testball1"
expect { brew "install", "testball1", "--with-foo" }
.to output(%r{#{HOMEBREW_CELLAR}/testball1/0\.1}).to_stdout
.and not_to_output.to_stderr
.and be_a_success
expect(HOMEBREW_CELLAR/"testball1/0.1/foo/test").to be_a_file
end end
it "can install keg-only Formulae" do it "can install keg-only Formulae" do
@ -27,6 +38,7 @@ describe "brew install", :integration_test do
.to output(%r{#{HOMEBREW_CELLAR}/testball1/1\.0}).to_stdout .to output(%r{#{HOMEBREW_CELLAR}/testball1/1\.0}).to_stdout
.and not_to_output.to_stderr .and not_to_output.to_stderr
.and be_a_success .and be_a_success
expect(HOMEBREW_CELLAR/"testball1/1.0/foo/test").not_to be_a_file
end end
it "can install HEAD Formulae" do it "can install HEAD Formulae" do
@ -59,5 +71,6 @@ describe "brew install", :integration_test do
.to output(%r{#{HOMEBREW_CELLAR}/testball1/HEAD\-d5eb689}).to_stdout .to output(%r{#{HOMEBREW_CELLAR}/testball1/HEAD\-d5eb689}).to_stdout
.and output(/Cloning into/).to_stderr .and output(/Cloning into/).to_stderr
.and be_a_success .and be_a_success
expect(HOMEBREW_CELLAR/"testball1/HEAD-d5eb689/foo/test").not_to be_a_file
end end
end end