diff --git a/Library/Homebrew/cli/parser.rb b/Library/Homebrew/cli/parser.rb index d09f1730ed..4fc804ad65 100644 --- a/Library/Homebrew/cli/parser.rb +++ b/Library/Homebrew/cli/parser.rb @@ -148,7 +148,7 @@ module Homebrew generate_banner end - def switch(*names, description: nil, replacement: nil, env: nil, required_for: nil, depends_on: nil, + def switch(*names, description: nil, replacement: nil, env: nil, depends_on: nil, method: :on, hidden: false) global_switch = names.first.is_a?(Symbol) return if global_switch @@ -167,7 +167,7 @@ module Homebrew end names.each do |name| - set_constraints(name, required_for: required_for, depends_on: depends_on) + set_constraints(name, depends_on: depends_on) end env_value = env?(env) @@ -204,8 +204,7 @@ module Homebrew end end - def flag(*names, description: nil, replacement: nil, required_for: nil, - depends_on: nil, hidden: false) + def flag(*names, description: nil, replacement: nil, depends_on: nil, hidden: false) required, flag_type = if names.any? { |name| name.end_with? "=" } [OptionParser::REQUIRED_ARGUMENT, :required_flag] else @@ -226,7 +225,7 @@ module Homebrew end names.each do |name| - set_constraints(name, required_for: required_for, depends_on: depends_on) + set_constraints(name, depends_on: depends_on) end end @@ -506,31 +505,25 @@ module Homebrew Formatter.format_help_text(desc, width: OPTION_DESC_WIDTH).split("\n") end - def set_constraints(name, depends_on:, required_for:) - secondary = option_to_name(name) - unless required_for.nil? - primary = option_to_name(required_for) - @constraints << [primary, secondary, :mandatory] - end - + def set_constraints(name, depends_on:) return if depends_on.nil? primary = option_to_name(depends_on) - @constraints << [primary, secondary, :optional] + secondary = option_to_name(name) + @constraints << [primary, secondary] end def check_constraints - @constraints.each do |primary, secondary, constraint_type| + @constraints.each do |primary, secondary| primary_passed = option_passed?(primary) secondary_passed = option_passed?(secondary) + next if !secondary_passed || (primary_passed && secondary_passed) + primary = name_to_option(primary) secondary = name_to_option(secondary) - if :mandatory.equal?(constraint_type) && primary_passed && !secondary_passed - raise OptionConstraintError.new(primary, secondary) - end - raise OptionConstraintError.new(primary, secondary, missing: true) if secondary_passed && !primary_passed + raise OptionConstraintError.new(primary, secondary, missing: true) end end diff --git a/Library/Homebrew/test/cli/parser_spec.rb b/Library/Homebrew/test/cli/parser_spec.rb index 54dc168d65..5aaab4683a 100644 --- a/Library/Homebrew/test/cli/parser_spec.rb +++ b/Library/Homebrew/test/cli/parser_spec.rb @@ -164,21 +164,15 @@ describe Homebrew::CLI::Parser do subject(:parser) { described_class.new do flag "--flag1=" + flag "--flag2=", depends_on: "--flag1=" flag "--flag3=" - flag "--flag2=", required_for: "--flag1=" - flag "--flag4=", depends_on: "--flag3=" conflicts "--flag1=", "--flag3=" end } - it "raises exception on required_for constraint violation" do - expect { parser.parse(["--flag1=flag1"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) - end - it "raises exception on depends_on constraint violation" do expect { parser.parse(["--flag2=flag2"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) - expect { parser.parse(["--flag4=flag4"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) end it "raises exception for conflict violation" do @@ -216,20 +210,14 @@ describe Homebrew::CLI::Parser do described_class.new do switch "-a", "--switch-a", env: "switch_a" switch "-b", "--switch-b", env: "switch_b" - switch "--switch-c", required_for: "--switch-a" - switch "--switch-d", depends_on: "--switch-b" + switch "--switch-c", depends_on: "--switch-a" conflicts "--switch-a", "--switch-b" end } - it "raises exception on required_for constraint violation" do - expect { parser.parse(["--switch-a"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) - end - it "raises exception on depends_on constraint violation" do expect { parser.parse(["--switch-c"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) - expect { parser.parse(["--switch-d"]) }.to raise_error(Homebrew::CLI::OptionConstraintError) end it "raises exception for conflict violation" do