- previously, Puppet would search $LOAD_PATH and just
load applications in the first $LOAD_PATH to have
the directory puppet/application. Now multiple paths
can contain applications.

Signed-off-by: Dan Bode <[email protected]>
---
 lib/puppet/util/command_line.rb     |    8 ++++++--
 spec/unit/util/command_line_spec.rb |   24 ++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/lib/puppet/util/command_line.rb b/lib/puppet/util/command_line.rb
index 3562a3d..4aff0a8 100644
--- a/lib/puppet/util/command_line.rb
+++ b/lib/puppet/util/command_line.rb
@@ -33,8 +33,12 @@ module Puppet
       end
 
       def available_subcommands
-        absolute_appdir = $LOAD_PATH.collect { |x| 
File.join(x,'puppet','application') }.detect{ |x| File.directory?(x) }
-        Dir[File.join(absolute_appdir, '*.rb')].map{|fn| File.basename(fn, 
'.rb')}
+        absolute_appdirs = $LOAD_PATH.collect do |x| 
+          File.join(x,'puppet','application')
+        end.select{ |x| File.directory?(x) }
+        absolute_appdirs.inject([]) do |commands, dir|
+          commands + Dir[File.join(dir, '*.rb')].map{|fn| File.basename(fn, 
'.rb')}
+        end.uniq
       end
 
       def usage_message
diff --git a/spec/unit/util/command_line_spec.rb 
b/spec/unit/util/command_line_spec.rb
index 7ba9652..a648eb4 100644
--- a/spec/unit/util/command_line_spec.rb
+++ b/spec/unit/util/command_line_spec.rb
@@ -6,6 +6,7 @@ Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| 
File.exist?(f) ? require(f
 require 'puppet/util/command_line'
 
 describe Puppet::Util::CommandLine do
+  include PuppetSpec::Files
   before do
     @tty  = stub("tty",  :tty? => true )
     @pipe = stub("pipe", :tty? => false)
@@ -105,4 +106,27 @@ describe Puppet::Util::CommandLine do
       end
     end
   end
+  describe 'when loading commands' do
+    before do
+      @core_apps = ["describe", "filebucket", "kick", "queue", "resource", 
"agent", "cert", "apply", "doc", "master"]
+      @command_line = Puppet::Util::CommandLine.new("foo", %w{ client --help w 
   hatever.pp }, @tty )
+    end
+    it 'should be able to find all existing commands' do
+      @core_apps.each do |command|
+        @command_line.available_subcommands.should include command
+      end
+    end
+    describe 'when multiple paths have applications' do
+      before do
+        @dir=tmpdir('command_line_plugin_test')
+        @appdir="#{@dir}/puppet/application"
+        FileUtils.mkdir_p(@appdir)
+        FileUtils.touch("#{@appdir}/foo.rb")
+        $LOAD_PATH.unshift(@dir)
+      end
+      it 'should be able to find commands from both paths' do
+        @command_line.available_subcommands.should == ['foo'] + @core_apps
+      end
+    end
+  end
 end
-- 
1.5.5.6

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to