diff options
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/dsl/resource_api.rb | 2 | ||||
-rw-r--r-- | lib/puppet/indirector/catalog/compiler.rb | 4 | ||||
-rw-r--r-- | lib/puppet/node.rb | 4 | ||||
-rw-r--r-- | lib/puppet/parser/ast/comparison_operator.rb | 15 | ||||
-rw-r--r-- | lib/puppet/parser/ast/leaf.rb | 3 | ||||
-rw-r--r-- | lib/puppet/parser/compiler.rb | 23 | ||||
-rw-r--r-- | lib/puppet/parser/lexer.rb | 16 | ||||
-rw-r--r-- | lib/puppet/parser/parser_support.rb | 2 | ||||
-rw-r--r-- | lib/puppet/parser/resource.rb | 9 | ||||
-rw-r--r-- | lib/puppet/parser/type_loader.rb | 28 | ||||
-rw-r--r-- | lib/puppet/rails/resource.rb | 6 | ||||
-rw-r--r-- | lib/puppet/resource.rb | 5 | ||||
-rw-r--r-- | lib/puppet/resource/catalog.rb | 2 | ||||
-rw-r--r-- | lib/puppet/resource/type_collection.rb | 6 | ||||
-rw-r--r-- | lib/puppet/type.rb | 10 | ||||
-rw-r--r-- | lib/puppet/type/file.rb | 2 | ||||
-rwxr-xr-x | lib/puppet/type/file/source.rb | 2 |
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 |