diff --git a/Library/Homebrew/options.rb b/Library/Homebrew/options.rb index e10d9483e5..d8783a9d65 100644 --- a/Library/Homebrew/options.rb +++ b/Library/Homebrew/options.rb @@ -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 diff --git a/Library/Homebrew/test/test_options.rb b/Library/Homebrew/test/test_options.rb index 78edb408cc..405ead73bb 100644 --- a/Library/Homebrew/test/test_options.rb +++ b/Library/Homebrew/test/test_options.rb @@ -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