Please review pull request #735: Bug/2.7.x/14288 gem provider fails on bad input opened by (daniel-pittman)

Description:

Previously, when the output of the gem command contained a line that didn't
match it was returned as nil - but the rest of the provider didn't handle
that value at all!

That led to any mismatch causing various failures to dereference nil as a
hash, and general failure.

This fixes this to behave significantly better by just omitting that entry in
the result, returning only the expected content.

Signed-off-by: Daniel Pittman [email protected]

  • Opened: Wed May 02 23:23:54 UTC 2012
  • Based on: puppetlabs:2.7.x (94dee104ddb833482ce2356ab3aa33fa9d3d5fb2)
  • Requested merge: daniel-pittman:bug/2.7.x/14288-gem-provider-fails-on-bad-input (d5e0cddc9ab604053b060bf98c14e6ba0d65818f)

Diff follows:

diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index 331615f..4888d50 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -26,7 +26,9 @@ def self.gemlist(options)
     end
 
     begin
-      list = execute(gem_list_command).lines.map {|set| gemsplit(set) }
+      list = execute(gem_list_command).lines.
+        map {|set| gemsplit(set) }.
+        reject {|x| x.nil? }
     rescue Puppet::ExecutionFailure => detail
       raise Puppet::Error, "Could not list gems: #{detail}"
     end
diff --git a/spec/fixtures/unit/provider/package/gem/line-with-1.8.5-warning b/spec/fixtures/unit/provider/package/gem/line-with-1.8.5-warning
new file mode 100644
index 0000000..07a27e7
--- /dev/null
+++ b/spec/fixtures/unit/provider/package/gem/line-with-1.8.5-warning
@@ -0,0 +1,14 @@
+/home/jenkins/.rvm/gems/ruby-1.8.5-p231@global/gems/rubygems-bundler-0.9.0/lib/rubygems-bundler/regenerate_binstubs_command.rb:34: warning: parenthesize argument(s) for future version
+
+*** LOCAL GEMS ***
+
+columnize (0.3.2)
+diff-lcs (1.1.3)
+metaclass (0.0.1)
+mocha (0.10.5)
+rake (0.8.7)
+rspec-core (2.9.0)
+rspec-expectations (2.9.1)
+rspec-mocks (2.9.0)
+rubygems-bundler (0.9.0)
+rvm (1.11.3.3)
diff --git a/spec/unit/provider/package/gem_spec.rb b/spec/unit/provider/package/gem_spec.rb
index 516e579..8e519d6 100755
--- a/spec/unit/provider/package/gem_spec.rb
+++ b/spec/unit/provider/package/gem_spec.rb
@@ -101,7 +101,6 @@
     end
   end
 
-
   describe "#instances" do
     before do
       provider_class.stubs(:command).with(:gemcmd).returns "/my/gem"
@@ -123,5 +122,22 @@
         {:ensure => ["0.8.7", "0.6.9"], :provider => :gem, :name => 'vagrant'}
       ]
     end
+
+    it "should not fail when an unmatched line is returned" do
+      provider_class.expects(:execute).with(%w{/my/gem list --local}).
+        returns(File.read(my_fixture('line-with-1.8.5-warning')))
+
+      provider_class.instances.map {|p| p.properties}.
+        should == [{:provider=>:gem, :ensure=>["0.3.2"], :name=>"columnize"},
+                   {:provider=>:gem, :ensure=>["1.1.3"], :name=>"diff-lcs"},
+                   {:provider=>:gem, :ensure=>["0.0.1"], :name=>"metaclass"},
+                   {:provider=>:gem, :ensure=>["0.10.5"], :name=>"mocha"},
+                   {:provider=>:gem, :ensure=>["0.8.7"], :name=>"rake"},
+                   {:provider=>:gem, :ensure=>["2.9.0"], :name=>"rspec-core"},
+                   {:provider=>:gem, :ensure=>["2.9.1"], :name=>"rspec-expectations"},
+                   {:provider=>:gem, :ensure=>["2.9.0"], :name=>"rspec-mocks"},
+                   {:provider=>:gem, :ensure=>["0.9.0"], :name=>"rubygems-bundler"},
+                   {:provider=>:gem, :ensure=>["1.11.3.3"], :name=>"rvm"}]
+    end
   end
 end

    

--
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