diff options
author | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-05 11:37:51 -0700 |
---|---|---|
committer | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-06 16:37:05 -0700 |
commit | 7e7d246bf46349c904c76a31951d4a40c200790b (patch) | |
tree | b3c56fa764b86c71a3590381049fe7225f99669d | |
parent | 0b97bd0df57dd6732db5f52fc7360f61e74dba2e (diff) | |
download | puppet-7e7d246bf46349c904c76a31951d4a40c200790b.tar.gz puppet-7e7d246bf46349c904c76a31951d4a40c200790b.tar.xz puppet-7e7d246bf46349c904c76a31951d4a40c200790b.zip |
(#6972) Recognize puppet global options in pre-parse.
This extends the CLI pre-parse phase to identify both string *and* global
options out of the Puppet settings/defaults system. This makes the regular
CLI support for setting Puppet configuration globals work as expected.
This moves us along the line of supporting these options more fully.
Reviewed-By: Dan Bode <dan@puppetlabs.com>
-rw-r--r-- | lib/puppet/application/string_base.rb | 22 | ||||
-rwxr-xr-x | spec/unit/application/string_base_spec.rb | 29 |
2 files changed, 50 insertions, 1 deletions
diff --git a/lib/puppet/application/string_base.rb b/lib/puppet/application/string_base.rb index 76b0a46fd..09d02c079 100644 --- a/lib/puppet/application/string_base.rb +++ b/lib/puppet/application/string_base.rb @@ -68,7 +68,9 @@ class Puppet::Application::StringBase < Puppet::Application until @action or (index += 1) >= command_line.args.length do item = command_line.args[index] if item =~ /^-/ then - option = @string.options.find { |a| item =~ /^-+#{a}\b/ } + option = @string.options.find do |name| + item =~ /^-+#{name.to_s.gsub(/[-_]/, '[-_]')}(?:[ =].*)?$/ + end if option then option = @string.get_option(option) # If we have an inline argument, just carry on. We don't need to @@ -79,6 +81,12 @@ class Puppet::Application::StringBase < Puppet::Application index += 1 unless (option.optional_argument? and command_line.args[index + 1] =~ /^-/) end + elsif option = find_global_settings_argument(item) then + unless Puppet.settings.boolean? option.name then + # As far as I can tell, we treat non-bool options as always having + # a mandatory argument. --daniel 2011-04-05 + index += 1 # ...so skip the argument. + end else raise ArgumentError, "Unknown option #{item.sub(/=.*$/, '').inspect}" end @@ -101,6 +109,18 @@ class Puppet::Application::StringBase < Puppet::Application end end + def find_global_settings_argument(item) + Puppet.settings.each do |name, object| + object.optparse_args.each do |arg| + next unless arg =~ /^-/ + # sadly, we have to emulate some of optparse here... + pattern = /^#{arg.sub('[no-]', '').sub(/[ =].*$/, '')}(?:[ =].*)?$/ + pattern.match item and return object + end + end + return nil # nothing found. + end + def setup Puppet::Util::Log.newdestination :console diff --git a/spec/unit/application/string_base_spec.rb b/spec/unit/application/string_base_spec.rb index cd24b6c49..3f8ae73b6 100755 --- a/spec/unit/application/string_base_spec.rb +++ b/spec/unit/application/string_base_spec.rb @@ -42,6 +42,15 @@ describe Puppet::Application::StringBase do app end + describe "#find_global_settings_argument" do + it "should not match --ca to --ca-location" do + option = mock('ca option', :optparse_args => ["--ca"]) + Puppet.settings.expects(:each).yields(:ca, option) + + app.find_global_settings_argument("--ca-location").should be_nil + end + end + describe "#preinit" do before :each do app.command_line.stubs(:args).returns %w{} @@ -118,6 +127,26 @@ describe Puppet::Application::StringBase do expect { app.preinit }. should raise_error ArgumentError, /Unknown option "--bar"/ end + + { "boolean options before" => %w{--trace foo}, + "boolean options after" => %w{foo --trace} + }.each do |name, args| + it "should accept global boolean settings #{name} the action" do + app.command_line.stubs(:args).returns args + app.preinit && app.parse_options + Puppet[:trace].should be_true + end + end + + { "before" => %w{--syslogfacility user1 foo}, + " after" => %w{foo --syslogfacility user1} + }.each do |name, args| + it "should accept global settings with arguments #{name} the action" do + app.command_line.stubs(:args).returns args + app.preinit && app.parse_options + Puppet[:syslogfacility].should == "user1" + end + end end end |