When the manifest has:
package { "gcc-c++": ensure => latest }
An exception is raised:
SyntaxError: nested *?+ in regexpThis affects several providers: dpkg, rug, up2date, urpmi Fixed by escaping the package names with Regexp.escape Signed-off-by: Jesse Wolfe <[email protected]> --- lib/puppet/provider/package/dpkg.rb | 2 +- lib/puppet/provider/package/rug.rb | 2 +- lib/puppet/provider/package/up2date.rb | 2 +- lib/puppet/provider/package/urpmi.rb | 2 +- spec/unit/provider/package/dpkg.rb | 7 +++++++ spec/unit/provider/package/rug.rb | 25 +++++++++++++++++++++++++ spec/unit/provider/package/up2date.rb | 25 +++++++++++++++++++++++++ spec/unit/provider/package/urpmi.rb | 25 +++++++++++++++++++++++++ 8 files changed, 86 insertions(+), 4 deletions(-) create mode 100755 spec/unit/provider/package/rug.rb create mode 100755 spec/unit/provider/package/up2date.rb create mode 100755 spec/unit/provider/package/urpmi.rb diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb index a4c3982..d6ec56a 100755 --- a/lib/puppet/provider/package/dpkg.rb +++ b/lib/puppet/provider/package/dpkg.rb @@ -83,7 +83,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package def latest output = dpkg_deb "--show", @resource[:source] matches = /^(\S+)\t(\S+)$/.match(output).captures - unless matches[0].match(@resource[:name]) + unless matches[0].match( Regexp.escape(@resource[:name]) ) warning "source doesn't contain named package, but %s" % matches[0] end matches[1] diff --git a/lib/puppet/provider/package/rug.rb b/lib/puppet/provider/package/rug.rb index b68ec30..ca27cbb 100644 --- a/lib/puppet/provider/package/rug.rb +++ b/lib/puppet/provider/package/rug.rb @@ -36,7 +36,7 @@ Puppet::Type.type(:package).provide :rug, :parent => :rpm do #rug can only get a list of *all* available packages? output = rug "list-updates" - if output =~ /#...@resource[:name]}\s*\|\s*([0-9\.\-]+)/ + if output =~ /#{Regexp.escape @resource[:name]}\s*\|\s*([0-9\.\-]+)/ return $1 else # rug didn't find updates, pretend the current diff --git a/lib/puppet/provider/package/up2date.rb b/lib/puppet/provider/package/up2date.rb index d8a1265..284bbaf 100644 --- a/lib/puppet/provider/package/up2date.rb +++ b/lib/puppet/provider/package/up2date.rb @@ -25,7 +25,7 @@ Puppet::Type.type(:package).provide :up2date, :parent => :rpm, :source => :rpm d #up2date can only get a list of *all* available packages? output = up2date "--showall" - if output =~ /^...@resource[:name]}-(\d+.*)\.\w+/ + if output =~ /^#{Regexp.escape @resource[:name]}-(\d+.*)\.\w+/ return $1 else # up2date didn't find updates, pretend the current diff --git a/lib/puppet/provider/package/urpmi.rb b/lib/puppet/provider/package/urpmi.rb index a958352..a79e962 100644 --- a/lib/puppet/provider/package/urpmi.rb +++ b/lib/puppet/provider/package/urpmi.rb @@ -43,7 +43,7 @@ Puppet::Type.type(:package).provide :urpmi, :parent => :rpm, :source => :rpm do def latest output = urpmq "-S", @resource[:name] - if output =~ /^...@resource[:name]}\s+:\s+.*\(\s+(\S+)\s+\)/ + if output =~ /^#{Regexp.escape @resource[:name]}\s+:\s+.*\(\s+(\S+)\s+\)/ return $1 else # urpmi didn't find updates, pretend the current diff --git a/spec/unit/provider/package/dpkg.rb b/spec/unit/provider/package/dpkg.rb index 08aaca8..0c5c9b5 100755 --- a/spec/unit/provider/package/dpkg.rb +++ b/spec/unit/provider/package/dpkg.rb @@ -149,6 +149,13 @@ describe provider do @provider.expects(:warning) @provider.latest end + + it "should cope with names containing ++" do + @resource = stub 'resource', :[] => "asdf++" + @provider = provider.new(@resource) + @provider.expects(:dpkg_deb).returns "asdf++\t1.0" + @provider.latest.should == "1.0" + end end it "should use 'dpkg -r' to uninstall" do diff --git a/spec/unit/provider/package/rug.rb b/spec/unit/provider/package/rug.rb new file mode 100755 index 0000000..3181e43 --- /dev/null +++ b/spec/unit/provider/package/rug.rb @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby + +Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } + +provider = Puppet::Type.type(:package).provider(:rug) + +describe provider do + before do + @resource = stub 'resource', :[] => "asdf" + @provider = provider.new(@resource) + end + + + describe "when determining latest available version" do + + it "should cope with names containing ++" do + @resource = stub 'resource', :[] => "asdf++" + @provider = provider.new(@resource) + @provider.expects(:rug).returns "asdf++ | 1.0" + @provider.latest.should == "1.0" + end + + end + +end diff --git a/spec/unit/provider/package/up2date.rb b/spec/unit/provider/package/up2date.rb new file mode 100755 index 0000000..ec4bc67 --- /dev/null +++ b/spec/unit/provider/package/up2date.rb @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby + +Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } + +provider = Puppet::Type.type(:package).provider(:up2date) + +describe provider do + before do + @resource = stub 'resource', :[] => "asdf" + @provider = provider.new(@resource) + end + + + describe "when determining latest available version" do + + it "should cope with names containing ++" do + @resource = stub 'resource', :[] => "asdf++" + @provider = provider.new(@resource) + @provider.expects(:up2date).returns "asdf++-1.0.rpm" + @provider.latest.should == "1.0" + end + + end + +end diff --git a/spec/unit/provider/package/urpmi.rb b/spec/unit/provider/package/urpmi.rb new file mode 100755 index 0000000..050ed63 --- /dev/null +++ b/spec/unit/provider/package/urpmi.rb @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby + +Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } + +provider = Puppet::Type.type(:package).provider(:urpmi) + +describe provider do + before do + @resource = stub 'resource', :[] => "asdf" + @provider = provider.new(@resource) + end + + + describe "when determining latest available version" do + + it "should cope with names containing ++" do + @resource = stub 'resource', :[] => "asdf++" + @provider = provider.new(@resource) + @provider.expects(:urpmq).returns "asdf++ : whatever ( 1.0 )" + @provider.latest.should == "1.0" + end + + end + +end -- 1.6.3.3 --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
