When the manifest has:
package { "gcc-c++": ensure => latest }
An exception is raised:
SyntaxError: nested *?+ in regexp

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

Reply via email to