Fix passing multiple switches as a single word to the build

Fixes Homebrew/homebrew#17434.
This commit is contained in:
Jack Nagel 2013-01-30 11:04:54 -06:00
parent b6631ac23f
commit 3414b4d689
2 changed files with 21 additions and 2 deletions

View File

@ -1,3 +1,5 @@
require 'set'
class Option
include Comparable
@ -33,6 +35,8 @@ class Option
def split_name(name)
case name
when /^[a-zA-Z]$/
[name, "-#{name}"]
when /^-[a-zA-Z]$/
[name[1..1], name]
when /^--(.+)$/
@ -101,8 +105,16 @@ class Options
case arg
when self then arg
when Option then new << arg
when Array then new(arg.map { |a| Option.new(a.to_s) })
else raise TypeError, "Cannot convert #{arg.inspect} to Options"
when Array
opts = arg.map do |arg|
case arg
when /^-[^-]+$/ then arg[1..-1].split(//)
else arg
end
end.flatten
new(opts.map { |o| Option.new(o) })
else
raise TypeError, "Cannot convert #{arg.inspect} to Options"
end
end
end

View File

@ -140,4 +140,11 @@ class OptionsTests < Test::Unit::TestCase
def test_coerce_raises_for_inappropriate_types
assert_raises(TypeError) { Options.coerce(1) }
end
def test_coerce_splits_multiple_switches_with_single_dash
array = %w{-vd}
verbose = Option.new("-v")
debug = Option.new("-d")
assert_equal [verbose, debug].sort, Options.coerce(array).to_a.sort
end
end