[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35

test branch puppet-dev at googlegroups.com
Wed Jul 14 10:32:45 UTC 2010


The following commit has been merged in the upstream branch:
commit cd06b877cd97edb26551d9c30c399d666603e586
Author: Markus Roberts <Markus at reality.com>
Date:   Thu Apr 15 16:30:32 2010 -0700

    Fix for #3556 Plussignment value melding
    
    The plussignment operator was constructing the new parameter value by
    modifying the param object's value in place (so as to preserve the file
    and line information for debugging).  However, when multiple resources
    are overridden by the same plussignment this would result in all of the
    resources sharing the same value (the union of all the prior values and
    the new value), which is wrong.
    
    Instead, we need to give each resource its own copy of the value (e.g.,
    a copy of the param object), which this patch implements.
    
    Signed-off-by: Markus Roberts <Markus at reality.com>

diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 7fcb7c1..1ae065f 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -324,10 +324,16 @@ class Puppet::Parser::Resource < Puppet::Resource
 
         # If we've gotten this far, we're allowed to override.
 
-        # Merge with previous value, if the parameter was generated with the +> syntax.
-        # It's important that we use the new param instance here, not the old one,
-        # so that the source is registered correctly for later overrides.
-        param.value = [current.value, param.value].flatten if param.add
+        # Merge with previous value, if the parameter was generated with the +> 
+        # syntax.  It's important that we use a copy of the new param instance 
+        # here, not the old one, and not the original new one, so that the source 
+        # is registered correctly for later overrides but the values aren't 
+        # implcitly shared when multiple resources are overrriden at once (see
+        # ticket #3556).
+        if param.add
+            param = param.dup 
+            param.value = [current.value, param.value].flatten
+        end
 
         set_parameter(param)
     end
diff --git a/spec/unit/parser/resource.rb b/spec/unit/parser/resource.rb
index 1af9da3..ca73bfb 100755
--- a/spec/unit/parser/resource.rb
+++ b/spec/unit/parser/resource.rb
@@ -401,6 +401,24 @@ describe Puppet::Parser::Resource do
             @resource[:testing].should == %w{other testing}
         end
 
+        it "should not merge parameter values when multiple resources are overriden with '+>' at once " do
+            @resource_2 = mkresource :source => @source
+
+            @resource.  set_parameter(:testing, "old_val_1")
+            @resource_2.set_parameter(:testing, "old_val_2")
+
+            @source.stubs(:child_of?).returns true
+            param = Puppet::Parser::Resource::Param.new(:name => :testing, :value => "new_val", :source => @resource.source)
+            param.add = true
+            @override.set_parameter(param)
+
+            @resource.  merge(@override)
+            @resource_2.merge(@override)
+
+            @resource  [:testing].should == %w{old_val_1 new_val}
+            @resource_2[:testing].should == %w{old_val_2 new_val}
+        end
+
         it "should promote tag overrides to real tags" do
             @source.stubs(:child_of?).returns true
             param = Puppet::Parser::Resource::Param.new(:name => :tag, :value => "testing", :source => @resource.source)

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list