diff options
-rw-r--r-- | lib/puppet/parser/scope.rb | 9 | ||||
-rwxr-xr-x | spec/unit/parser/scope.rb | 30 |
2 files changed, 37 insertions, 2 deletions
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb index 5b3c6d04a..71b9be27c 100644 --- a/lib/puppet/parser/scope.rb +++ b/lib/puppet/parser/scope.rb @@ -331,12 +331,17 @@ class Puppet::Parser::Scope ss = StringScanner.new(string) out = "" while not ss.eos? - if ss.scan(/^\$\{((\w*::)*\w+)\}|^\$((\w*::)*\w+)/) + if ss.scan(/^\$\{((\w*::)*\w+|[0-9]+)\}|^\$([0-9])|^\$((\w*::)*\w+)/) # If it matches the backslash, then just retun the dollar sign. if ss.matched == '\\$' out << '$' else # look the variable up - out << lookupvar(ss[1] || ss[3]).to_s || "" + # make sure $0-$9 are lookupable only if ephemeral + var = ss[1] || ss[3] || ss[4] + if var and var =~ /^[0-9]+$/ and not ephemeral?(var) + next + end + out << lookupvar(var).to_s || "" end elsif ss.scan(/^\\(.)/) # Puppet.debug("Got escape: pos:%d; m:%s" % [ss.pos, ss.matched]) diff --git a/spec/unit/parser/scope.rb b/spec/unit/parser/scope.rb index 641a3f946..665b2ed63 100755 --- a/spec/unit/parser/scope.rb +++ b/spec/unit/parser/scope.rb @@ -223,6 +223,36 @@ describe Puppet::Parser::Scope do end end + describe "when interpolating string" do + (0..9).each do |n| + it "should allow $#{n} to match" do + @scope.setvar(n.to_s, "value", :ephemeral => true) + + @scope.strinterp("$#{n}").should == "value" + end + end + + (0..9).each do |n| + it "should not allow $#{n} to match if not ephemeral" do + @scope.setvar(n.to_s, "value", :ephemeral => false) + + @scope.strinterp("$#{n}").should_not == "value" + end + end + + it "should not allow $10 to match" do + @scope.setvar("10", "value", :ephemeral => true) + + @scope.strinterp('==$10==').should_not == "==value==" + end + + it "should not allow ${10} to match" do + @scope.setvar("10", "value", :ephemeral => true) + + @scope.strinterp('==${10}==').should == "==value==" + end + end + describe "when setting ephemeral vars from matches" do before :each do @match = stub 'match', :is_a? => true |