Merge pull request #5738 from BenMusch/handle-conflicts
Prioritize CLI arguments over env vars when they conflict
This commit is contained in:
commit
f3716fe2d8
@ -27,6 +27,7 @@ module Homebrew
|
|||||||
Homebrew.args.instance_eval { undef tap }
|
Homebrew.args.instance_eval { undef tap }
|
||||||
@constraints = []
|
@constraints = []
|
||||||
@conflicts = []
|
@conflicts = []
|
||||||
|
@switch_sources = {}
|
||||||
@processed_options = []
|
@processed_options = []
|
||||||
@desc_line_length = 43
|
@desc_line_length = 43
|
||||||
@hide_from_man_page = false
|
@hide_from_man_page = false
|
||||||
@ -51,14 +52,14 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
process_option(*names, description)
|
process_option(*names, description)
|
||||||
@parser.on(*names, *wrap_option_desc(description)) do
|
@parser.on(*names, *wrap_option_desc(description)) do
|
||||||
enable_switch(*names)
|
enable_switch(*names, from: :args)
|
||||||
end
|
end
|
||||||
|
|
||||||
names.each do |name|
|
names.each do |name|
|
||||||
set_constraints(name, required_for: required_for, depends_on: depends_on)
|
set_constraints(name, required_for: required_for, depends_on: depends_on)
|
||||||
end
|
end
|
||||||
|
|
||||||
enable_switch(*names) if !env.nil? && !ENV["HOMEBREW_#{env.to_s.upcase}"].nil?
|
enable_switch(*names, from: :env) if !env.nil? && !ENV["HOMEBREW_#{env.to_s.upcase}"].nil?
|
||||||
end
|
end
|
||||||
alias switch_option switch
|
alias switch_option switch
|
||||||
|
|
||||||
@ -172,12 +173,19 @@ module Homebrew
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def enable_switch(*names)
|
def enable_switch(*names, from:)
|
||||||
names.each do |name|
|
names.each do |name|
|
||||||
|
@switch_sources[option_to_name(name)] = from
|
||||||
Homebrew.args["#{option_to_name(name)}?"] = true
|
Homebrew.args["#{option_to_name(name)}?"] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def disable_switch(*names)
|
||||||
|
names.each do |name|
|
||||||
|
Homebrew.args.delete_field("#{option_to_name(name)}?")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# These are common/global switches accessible throughout Homebrew
|
# These are common/global switches accessible throughout Homebrew
|
||||||
def common_switch(name)
|
def common_switch(name)
|
||||||
Homebrew::CLI::Parser.global_options.fetch(name, name)
|
Homebrew::CLI::Parser.global_options.fetch(name, name)
|
||||||
@ -225,7 +233,13 @@ module Homebrew
|
|||||||
|
|
||||||
next if violations.count < 2
|
next if violations.count < 2
|
||||||
|
|
||||||
raise OptionConflictError, violations.map(&method(:name_to_option))
|
env_var_options = violations.select do |option|
|
||||||
|
@switch_sources[option_to_name(option)] == :env_var
|
||||||
|
end
|
||||||
|
|
||||||
|
select_cli_arg = violations.count - env_var_options.count == 1
|
||||||
|
raise OptionConflictError, violations.map(&method(:name_to_option)) unless select_cli_arg
|
||||||
|
env_var_options.each(&method(:disable_switch))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -145,8 +145,8 @@ describe Homebrew::CLI::Parser do
|
|||||||
describe "test constraints for switch options" do
|
describe "test constraints for switch options" do
|
||||||
subject(:parser) {
|
subject(:parser) {
|
||||||
described_class.new do
|
described_class.new do
|
||||||
switch "-a", "--switch-a"
|
switch "-a", "--switch-a", env: "switch_a"
|
||||||
switch "-b", "--switch-b"
|
switch "-b", "--switch-b", env: "switch_b"
|
||||||
switch "--switch-c", required_for: "--switch-a"
|
switch "--switch-c", required_for: "--switch-a"
|
||||||
switch "--switch-d", depends_on: "--switch-b"
|
switch "--switch-d", depends_on: "--switch-b"
|
||||||
|
|
||||||
@ -177,6 +177,22 @@ describe Homebrew::CLI::Parser do
|
|||||||
parser.parse(["--switch-b"])
|
parser.parse(["--switch-b"])
|
||||||
expect(Homebrew.args.switch_b?).to be true
|
expect(Homebrew.args.switch_b?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "prioritizes cli arguments over env vars when they conflict" do
|
||||||
|
allow(ENV).to receive(:[]).with("HOMEBREW_SWITCH_A").and_return("1")
|
||||||
|
allow(ENV).to receive(:[]).with("HOMEBREW_SWITCH_B").and_return("0")
|
||||||
|
allow(ENV).to receive(:[])
|
||||||
|
parser.parse(["--switch-b"])
|
||||||
|
expect(Homebrew.args.switch_a).to be_falsy
|
||||||
|
expect(Homebrew.args).to be_switch_b
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises an exception on constraint violation when both are env vars" do
|
||||||
|
allow(ENV).to receive(:[]).with("HOMEBREW_SWITCH_A").and_return("1")
|
||||||
|
allow(ENV).to receive(:[]).with("HOMEBREW_SWITCH_B").and_return("1")
|
||||||
|
allow(ENV).to receive(:[])
|
||||||
|
expect { parser.parse(["--switch-a", "--switch-b"]) }.to raise_error(Homebrew::CLI::OptionConflictError)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "test immutability of args" do
|
describe "test immutability of args" do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user