summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/dsl/resource_api.rb2
-rw-r--r--lib/puppet/indirector/catalog/compiler.rb4
-rw-r--r--lib/puppet/node.rb4
-rw-r--r--lib/puppet/parser/ast/comparison_operator.rb15
-rw-r--r--lib/puppet/parser/ast/leaf.rb3
-rw-r--r--lib/puppet/parser/compiler.rb23
-rw-r--r--lib/puppet/parser/lexer.rb16
-rw-r--r--lib/puppet/parser/parser_support.rb2
-rw-r--r--lib/puppet/parser/resource.rb9
-rw-r--r--lib/puppet/parser/type_loader.rb28
-rw-r--r--lib/puppet/rails/resource.rb6
-rw-r--r--lib/puppet/resource.rb5
-rw-r--r--lib/puppet/resource/catalog.rb2
-rw-r--r--lib/puppet/resource/type_collection.rb6
-rw-r--r--lib/puppet/type.rb10
-rw-r--r--lib/puppet/type/file.rb2
-rwxr-xr-xlib/puppet/type/file/source.rb2
17 files changed, 57 insertions, 82 deletions
diff --git a/lib/puppet/dsl/resource_api.rb b/lib/puppet/dsl/resource_api.rb
index 9aa1ea07a..d82373b0e 100644
--- a/lib/puppet/dsl/resource_api.rb
+++ b/lib/puppet/dsl/resource_api.rb
@@ -37,7 +37,7 @@ class Puppet::DSL::ResourceAPI
super
ensure
- @searching_for_method = true
+ @searching_for_method = false
end
def set_instance_variables
diff --git a/lib/puppet/indirector/catalog/compiler.rb b/lib/puppet/indirector/catalog/compiler.rb
index e85608ed1..c50022fff 100644
--- a/lib/puppet/indirector/catalog/compiler.rb
+++ b/lib/puppet/indirector/catalog/compiler.rb
@@ -72,9 +72,9 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
loglevel = networked? ? :notice : :none
- benchmark(loglevel, "Compiled catalog for #{node.name}") do
+ benchmark(loglevel, str) do
begin
- return Puppet::Parser::Compiler.compile(node)
+ config = Puppet::Parser::Compiler.compile(node)
rescue Puppet::Error => detail
Puppet.err(detail.to_s) if networked?
raise
diff --git a/lib/puppet/node.rb b/lib/puppet/node.rb
index 1fc615410..2453cd1d5 100644
--- a/lib/puppet/node.rb
+++ b/lib/puppet/node.rb
@@ -16,8 +16,8 @@ class Puppet::Node
indirects :node, :terminus_setting => :node_terminus, :doc => "Where to find node information.
A node is composed of its name, its facts, and its environment."
- attr_accessor :name, :classes, :source, :ipaddress
- attr_reader :time, :parameters
+ attr_accessor :name, :classes, :source, :ipaddress, :parameters
+ attr_reader :time
def environment
return super if @environment
diff --git a/lib/puppet/parser/ast/comparison_operator.rb b/lib/puppet/parser/ast/comparison_operator.rb
index c8694bbff..039c81df8 100644
--- a/lib/puppet/parser/ast/comparison_operator.rb
+++ b/lib/puppet/parser/ast/comparison_operator.rb
@@ -16,17 +16,16 @@ class Puppet::Parser::AST
def evaluate(scope)
# evaluate the operands, should return a boolean value
lval = @lval.safeevaluate(scope)
- rval = @rval.safeevaluate(scope)
- # convert to number if operands are number
- lval = Puppet::Parser::Scope.number?(lval) || lval
- rval = Puppet::Parser::Scope.number?(rval) || rval
+ case @operator
+ when "==","!="
+ @rval.evaluate_match(lval, scope) ? @operator == '==' : @operator == '!='
+ else
+ rval = @rval.safeevaluate(scope)
+ rval = Puppet::Parser::Scope.number?(rval) || rval
+ lval = Puppet::Parser::Scope.number?(lval) || lval
- # return result
- unless @operator == '!='
lval.send(@operator,rval)
- else
- lval != rval
end
end
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index 3b9163d9c..49f430278 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -17,6 +17,9 @@ class Puppet::Parser::AST
obj = obj.downcase if obj.respond_to?(:downcase)
value = value.downcase if value.respond_to?(:downcase)
+ obj = Puppet::Parser::Scope.number?(obj) || obj
+ value = Puppet::Parser::Scope.number?(value) || value
+
# "" == undef for case/selector/if
obj == value or (obj == "" and value == :undef)
end
diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb
index 85980722c..a901c0dd6 100644
--- a/lib/puppet/parser/compiler.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -251,19 +251,7 @@ class Puppet::Parser::Compiler
# evaluate_generators loop.
def evaluate_definitions
exceptwrap do
- if ary = unevaluated_resources
- evaluated = false
- ary.each do |resource|
- if not resource.virtual?
- resource.evaluate
- evaluated = true
- end
- end
- # If we evaluated, let the loop know.
- return evaluated
- else
- return false
- end
+ !unevaluated_resources.each { |resource| resource.evaluate }.empty?
end
end
@@ -482,12 +470,7 @@ class Puppet::Parser::Compiler
# Return an array of all of the unevaluated resources. These will be definitions,
# which need to get evaluated into native resources.
def unevaluated_resources
- ary = resources.reject { |resource| resource.builtin? or resource.evaluated? }
-
- if ary.empty?
- return nil
- else
- return ary
- end
+ # The order of these is significant for speed due to short-circuting
+ resources.reject { |resource| resource.evaluated? or resource.virtual? or resource.builtin_type? }
end
end
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index 6a9f1cfc4..1e10ff96c 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -540,15 +540,17 @@ class Puppet::Parser::Lexer
[ str[0..-2],str[-1,1] ]
end
- def tokenize_interpolated_string(token_type)
+ def tokenize_interpolated_string(token_type,preamble='')
value,terminator = slurpstring('"$')
- token_queue << [TOKENS[token_type[terminator]],value]
- while terminator == '$' and not @scanner.scan(/\{/)
- token_queue << [TOKENS[:VARIABLE],@scanner.scan(%r{(\w*::)*\w+|[0-9]})]
- value,terminator = slurpstring('"$')
- token_queue << [TOKENS[DQ_continuation_token_types[terminator]],value]
+ token_queue << [TOKENS[token_type[terminator]],preamble+value]
+ if terminator != '$' or @scanner.scan(/\{/)
+ token_queue.shift
+ elsif var_name = @scanner.scan(%r{(\w*::)*\w+|[0-9]})
+ token_queue << [TOKENS[:VARIABLE],var_name]
+ tokenize_interpolated_string(DQ_continuation_token_types)
+ else
+ tokenize_interpolated_string(token_type,token_queue.pop.last + terminator)
end
- token_queue.shift
end
# just parse a string, not a whole file
diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb
index 4f3a4ddff..c0fd37178 100644
--- a/lib/puppet/parser/parser_support.rb
+++ b/lib/puppet/parser/parser_support.rb
@@ -111,7 +111,7 @@ class Puppet::Parser::Parser
end
def import(file)
- known_resource_types.loader.import(file, @lexer.file)
+ known_resource_types.loader.import_if_possible(file, @lexer.file)
end
def initialize(env)
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 3cccf4f3e..c956a1106 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -32,12 +32,9 @@ class Puppet::Parser::Resource < Puppet::Resource
end
# Set up some boolean test methods
- [:translated, :override, :evaluated].each do |method|
- newmeth = (method.to_s + "?").intern
- define_method(newmeth) do
- self.send(method)
- end
- end
+ def translated?; !!@translated; end
+ def override?; !!@override; end
+ def evaluated?; !!@evaluated; end
def [](param)
param = symbolize(param)
diff --git a/lib/puppet/parser/type_loader.rb b/lib/puppet/parser/type_loader.rb
index cb8657f0c..c33f90d11 100644
--- a/lib/puppet/parser/type_loader.rb
+++ b/lib/puppet/parser/type_loader.rb
@@ -70,7 +70,7 @@ class Puppet::Parser::TypeLoader
def initialize(env)
self.environment = env
- @loaded = []
+ @loaded = {}
@loading = Helper.new
@imported = {}
@@ -79,10 +79,13 @@ class Puppet::Parser::TypeLoader
def load_until(namespaces, name)
return nil if name == "" # special-case main.
name2files(namespaces, name).each do |filename|
- modname = nil
- import_if_possible(filename) do
- modname = import(filename)
- @loaded << filename
+ modname = begin
+ import_if_possible(filename)
+ rescue Puppet::ImportError => detail
+ # We couldn't load the item
+ # I'm not convienced we should just drop these errors, but this
+ # preserves existing behaviours.
+ nil
end
if result = yield(filename)
Puppet.info "Automatically imported #{name} from #{filename}"
@@ -124,23 +127,18 @@ class Puppet::Parser::TypeLoader
parser.parse
end
- private
-
# Utility method factored out of load for handling thread-safety.
# This isn't tested in the specs, because that's basically impossible.
- def import_if_possible(file, &blk)
- return if @loaded.include?(file)
- begin
+ def import_if_possible(file, current_file = nil)
+ @loaded[file] || begin
case @loading.owner_of(file)
when :this_thread
- return
+ nil
when :another_thread
- return import_if_possible(file, &blk)
+ import_if_possible(file,current_file)
when :nobody
- blk.call
+ @loaded[file] = import(file,current_file)
end
- rescue Puppet::ImportError => detail
- # We couldn't load the item
ensure
@loading.done_with(file)
end
diff --git a/lib/puppet/rails/resource.rb b/lib/puppet/rails/resource.rb
index a5cdd0c13..582cdd41a 100644
--- a/lib/puppet/rails/resource.rb
+++ b/lib/puppet/rails/resource.rb
@@ -212,16 +212,16 @@ class Puppet::Rails::Resource < ActiveRecord::Base
end
hash[:scope] = scope
hash[:source] = scope.source
- hash[:params] = []
+ hash[:parameters] = []
names = []
self.param_names.each do |pname|
# We can get the same name multiple times because of how the
# db layout works.
next if names.include?(pname.name)
names << pname.name
- hash[:params] << pname.to_resourceparam(self, scope.source)
+ hash[:parameters] << pname.to_resourceparam(self, scope.source)
end
- obj = Puppet::Parser::Resource.new(hash)
+ obj = Puppet::Parser::Resource.new(hash.delete("type"), hash.delete("title"), hash)
# Store the ID, so we can check if we're re-collecting the same resource.
obj.rails_id = self.id
diff --git a/lib/puppet/resource.rb b/lib/puppet/resource.rb
index 31237e3b1..55874aec8 100644
--- a/lib/puppet/resource.rb
+++ b/lib/puppet/resource.rb
@@ -199,7 +199,7 @@ class Puppet::Resource
end
def resource_type
- case type
+ @resource_type ||= case type
when "Class"; find_hostclass(title)
when "Node"; find_node(title)
else
@@ -409,6 +409,9 @@ class Puppet::Resource
if (argtitle || argtype) =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
elsif argtitle then [ argtype, argtitle ]
elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
+ elsif argtype.is_a?(Hash) then
+ raise ArgumentError, "Puppet::Resource.new does not take a hash as the first argument. "+
+ "Did you mean (#{(argtype[:type] || argtype["type"]).inspect}, #{(argtype[:title] || argtype["title"]).inspect }) ?"
else raise ArgumentError, "No title provided and #{argtype.inspect} is not a valid resource reference"
end
end
diff --git a/lib/puppet/resource/catalog.rb b/lib/puppet/resource/catalog.rb
index d163fc17e..4ac99eeea 100644
--- a/lib/puppet/resource/catalog.rb
+++ b/lib/puppet/resource/catalog.rb
@@ -57,7 +57,7 @@ class Puppet::Resource::Catalog < Puppet::SimpleGraph
end
def title_key_for_ref( ref )
- ref =~ /^(.+)\[(.*)\]/
+ ref =~ /^(.+)\[(.*)\]/m
[$1, $2]
end
diff --git a/lib/puppet/resource/type_collection.rb b/lib/puppet/resource/type_collection.rb
index 58e8b9497..9ed27332d 100644
--- a/lib/puppet/resource/type_collection.rb
+++ b/lib/puppet/resource/type_collection.rb
@@ -198,11 +198,7 @@ class Puppet::Resource::TypeCollection
private
def find_fully_qualified(name, type)
- return nil unless name =~ /^::/
-
- name = name.sub(/^::/, '')
-
- send(type, name)
+ send(type, name.sub(/^::/, ''))
end
def find_partially_qualified(namespace, name, type)
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index d0fea9731..880711066 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -193,7 +193,7 @@ class Type
when 0; []
when 1;
identity = lambda {|x| x}
- [ [ /(.*)/, [ [key_attributes.first, identity ] ] ] ]
+ [ [ /(.*)/m, [ [key_attributes.first, identity ] ] ] ]
else
raise Puppet::DevError,"you must specify title patterns when there are two or more key attributes"
end
@@ -1874,12 +1874,8 @@ class Type
self.to_trans.to_resource
end
- %w{exported virtual}.each do |m|
- define_method(m+"?") do
- self.send(m)
- end
- end
-
+ def virtual?; !!@virtual; end
+ def exported?; !!@exported; end
end
end
diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb
index 195e8c86f..71f2756bc 100644
--- a/lib/puppet/type/file.rb
+++ b/lib/puppet/type/file.rb
@@ -25,7 +25,7 @@ Puppet::Type.newtype(:file) do
native resource to support what you are doing."
def self.title_patterns
- [ [ /^(.*?)\/?$/, [ [ :path, lambda{|x| x} ] ] ] ]
+ [ [ /^(.*?)\/*\Z/m, [ [ :path, lambda{|x| x} ] ] ] ]
end
newparam(:path) do
diff --git a/lib/puppet/type/file/source.rb b/lib/puppet/type/file/source.rb
index 05da79b3d..2eaf4a33f 100755
--- a/lib/puppet/type/file/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -106,8 +106,6 @@ module Puppet
next if metadata_method == :checksum and metadata.ftype == "directory"
if resource[param_name].nil? or resource[param_name] == :absent
- v = metadata.send(metadata_method)
- resource.info "Setting #{param_name} to #{v}"
resource[param_name] = metadata.send(metadata_method)
end
end