diff options
author | lutter <lutter@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-03-09 00:52:47 +0000 |
---|---|---|
committer | lutter <lutter@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-03-09 00:52:47 +0000 |
commit | 0fa3c434b658fe432c306dc9e52e6b8c949ad3cf (patch) | |
tree | 21f012dd7ef63123f00cf5d207313177ed17d1aa /lib | |
parent | 38975de420bfd2f1350e7e55a996db40bc05d0b8 (diff) | |
download | puppet-0fa3c434b658fe432c306dc9e52e6b8c949ad3cf.tar.gz puppet-0fa3c434b658fe432c306dc9e52e6b8c949ad3cf.tar.xz puppet-0fa3c434b658fe432c306dc9e52e6b8c949ad3cf.zip |
Search manifests first within modules, and if no module is found, search in
the directory the current manifest is in.
Glob patterns can be used for the path, but the path only matches a module
if the first part of the path is not a glob.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2279 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/modules.rb | 33 | ||||
-rw-r--r-- | lib/puppet/parser/grammar.ra | 71 | ||||
-rw-r--r-- | lib/puppet/parser/parser.rb | 121 |
3 files changed, 124 insertions, 101 deletions
diff --git a/lib/puppet/modules.rb b/lib/puppet/modules.rb index 3d071b05a..b1b8804ea 100644 --- a/lib/puppet/modules.rb +++ b/lib/puppet/modules.rb @@ -3,6 +3,7 @@ class Puppet::Module TEMPLATES = "templates" FILES = "files" + MANIFESTS = "manifests" # Return an array of paths by splitting the +modulepath+ config # parameter. Only consider paths that are absolute and existing @@ -54,6 +55,26 @@ class Puppet::Module end end + # Return a list of manifests (as absolute filenames) that match +pat+ + # with the current directory set to +cwd+. If the first component of + # +pat+ does not contain any wildcards and is an existing module, return + # a list of manifests in that module matching the rest of +pat+ + # Otherwise, try to find manifests matching +pat+ relative to +cwd+ + def self.find_manifests(pat, cwd = nil) + cwd ||= Dir.getwd + mod = find(pat) + if mod + return mod.manifests(pat) + else + abspat = File::expand_path(pat, cwd) + files = Dir.glob(abspat) + if files.size == 0 + files = Dir.glob(abspat + ".pp") + end + return files + end + end + attr_reader :name, :path def initialize(name, path) @name = name @@ -62,6 +83,7 @@ class Puppet::Module def strip(file) n, rest = file.split(File::SEPARATOR, 2) + rest = nil if rest && rest.empty? return rest end @@ -73,5 +95,16 @@ class Puppet::Module return File::join(path, FILES) end + def manifests(pat) + rest = strip(pat) + rest ||= "init.pp" + p = File::join(path, MANIFESTS, rest) + files = Dir.glob(p) + if files.size == 0 + files = Dir.glob(p + ".pp") + end + return files + end + private :initialize end diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra index e0629fe9a..f191e2969 100644 --- a/lib/puppet/parser/grammar.ra +++ b/lib/puppet/parser/grammar.ra @@ -458,47 +458,42 @@ import: IMPORT quotedtext { end result = ast AST::ASTArray - Dir.chdir(dir) { - # We can't interpolate at this point since we don't have any - # scopes set up. Warn the user if they use a variable reference - pat = val[1].value - if pat.index("$") - Puppet.warning( - "The import of #{pat} contains a variable reference;" + - " variables are not interpolated for imports " + - "in file #{@lexer.file} at line #{@lexer.line}" - ) + # We can't interpolate at this point since we don't have any + # scopes set up. Warn the user if they use a variable reference + pat = val[1].value + if pat.index("$") + Puppet.warning( + "The import of #{pat} contains a variable reference;" + + " variables are not interpolated for imports " + + "in file #{@lexer.file} at line #{@lexer.line}" + ) + end + files = Puppet::Module::find_manifests(pat, dir) + if files.size == 0 + raise Puppet::ImportError.new("No file(s) found for import " + + "of '#{pat}'") + end + + files.each { |file| + parser = Puppet::Parser::Parser.new(interp) + parser.files = self.files + Puppet.debug("importing '%s'" % file) + + unless file =~ /^#{File::SEPARATOR}/ + file = File.join(dir, file) end - files = Dir.glob(pat) - if files.size == 0 - files = Dir.glob(pat + ".pp") - if files.size == 0 - raise Puppet::ImportError.new("No file(s) found for import " + - "of '#{pat}'") - end + begin + parser.file = file + rescue Puppet::ImportError + Puppet.warning( + "Importing %s would result in an import loop" % + File.join(dir, file) + ) + next end - files.each { |file| - parser = Puppet::Parser::Parser.new(interp) - parser.files = self.files - Puppet.debug("importing '%s'" % file) - - unless file =~ /^#{File::SEPARATOR}/ - file = File.join(dir, file) - end - begin - parser.file = file - rescue Puppet::ImportError - Puppet.warning( - "Importing %s would result in an import loop" % - File.join(dir, file) - ) - next - end - - # This will normally add code to the 'main' class. - parser.parse - } + # This will normally add code to the 'main' class. + parser.parse } } diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb index 0f6bb0384..e89be74b6 100644 --- a/lib/puppet/parser/parser.rb +++ b/lib/puppet/parser/parser.rb @@ -29,7 +29,7 @@ module Puppet class Parser < Racc::Parser -module_eval <<'..end grammar.ra modeval..id379b61d0b2', 'grammar.ra', 644 +module_eval <<'..end grammar.ra modeval..id83a5f213ec', 'grammar.ra', 639 require 'puppet/parser/functions' attr_reader :file, :interp @@ -199,7 +199,7 @@ end # $Id$ -..end grammar.ra modeval..id379b61d0b2 +..end grammar.ra modeval..id83a5f213ec ##### racc 1.4.5 generates ### @@ -1496,7 +1496,7 @@ module_eval <<'.,.,', 'grammar.ra', 448 end .,., -module_eval <<'.,.,', 'grammar.ra', 503 +module_eval <<'.,.,', 'grammar.ra', 498 def _reduce_119( val, _values, result ) # importing files # yuk, i hate keywords @@ -1508,53 +1508,48 @@ module_eval <<'.,.,', 'grammar.ra', 503 end result = ast AST::ASTArray - Dir.chdir(dir) { - # We can't interpolate at this point since we don't have any - # scopes set up. Warn the user if they use a variable reference - pat = val[1].value - if pat.index("$") - Puppet.warning( - "The import of #{pat} contains a variable reference;" + - " variables are not interpolated for imports " + - "in file #{@lexer.file} at line #{@lexer.line}" - ) - end - files = Dir.glob(pat) - if files.size == 0 - files = Dir.glob(pat + ".pp") - if files.size == 0 - raise Puppet::ImportError.new("No file(s) found for import " + - "of '#{pat}'") - end - end + # We can't interpolate at this point since we don't have any + # scopes set up. Warn the user if they use a variable reference + pat = val[1].value + if pat.index("$") + Puppet.warning( + "The import of #{pat} contains a variable reference;" + + " variables are not interpolated for imports " + + "in file #{@lexer.file} at line #{@lexer.line}" + ) + end + files = Puppet::Module::find_manifests(pat, dir) + if files.size == 0 + raise Puppet::ImportError.new("No file(s) found for import " + + "of '#{pat}'") + end - files.each { |file| - parser = Puppet::Parser::Parser.new(interp) - parser.files = self.files - Puppet.debug("importing '%s'" % file) + files.each { |file| + parser = Puppet::Parser::Parser.new(interp) + parser.files = self.files + Puppet.debug("importing '%s'" % file) - unless file =~ /^#{File::SEPARATOR}/ - file = File.join(dir, file) - end - begin - parser.file = file - rescue Puppet::ImportError - Puppet.warning( - "Importing %s would result in an import loop" % - File.join(dir, file) - ) - next - end + unless file =~ /^#{File::SEPARATOR}/ + file = File.join(dir, file) + end + begin + parser.file = file + rescue Puppet::ImportError + Puppet.warning( + "Importing %s would result in an import loop" % + File.join(dir, file) + ) + next + end - # This will normally add code to the 'main' class. - parser.parse - } + # This will normally add code to the 'main' class. + parser.parse } result end .,., -module_eval <<'.,.,', 'grammar.ra', 513 +module_eval <<'.,.,', 'grammar.ra', 508 def _reduce_120( val, _values, result ) interp.newdefine fqname(val[1]), :arguments => val[2], :code => val[4] @lexer.indefine = false @@ -1565,7 +1560,7 @@ module_eval <<'.,.,', 'grammar.ra', 513 end .,., -module_eval <<'.,.,', 'grammar.ra', 517 +module_eval <<'.,.,', 'grammar.ra', 512 def _reduce_121( val, _values, result ) interp.newdefine fqname(val[1]), :arguments => val[2] @lexer.indefine = false @@ -1574,7 +1569,7 @@ module_eval <<'.,.,', 'grammar.ra', 517 end .,., -module_eval <<'.,.,', 'grammar.ra', 525 +module_eval <<'.,.,', 'grammar.ra', 520 def _reduce_122( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -1584,7 +1579,7 @@ module_eval <<'.,.,', 'grammar.ra', 525 end .,., -module_eval <<'.,.,', 'grammar.ra', 530 +module_eval <<'.,.,', 'grammar.ra', 525 def _reduce_123( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -1594,7 +1589,7 @@ module_eval <<'.,.,', 'grammar.ra', 530 end .,., -module_eval <<'.,.,', 'grammar.ra', 535 +module_eval <<'.,.,', 'grammar.ra', 530 def _reduce_124( val, _values, result ) interp.newnode val[1], :parent => val[2], :code => val[4] result = nil @@ -1602,7 +1597,7 @@ module_eval <<'.,.,', 'grammar.ra', 535 end .,., -module_eval <<'.,.,', 'grammar.ra', 538 +module_eval <<'.,.,', 'grammar.ra', 533 def _reduce_125( val, _values, result ) interp.newnode val[1], :parent => val[2] result = nil @@ -1616,7 +1611,7 @@ module_eval <<'.,.,', 'grammar.ra', 538 # reduce 128 omitted -module_eval <<'.,.,', 'grammar.ra', 550 +module_eval <<'.,.,', 'grammar.ra', 545 def _reduce_129( val, _values, result ) result = val[0] result = [result] unless result.is_a?(Array) @@ -1631,14 +1626,14 @@ module_eval <<'.,.,', 'grammar.ra', 550 # reduce 132 omitted -module_eval <<'.,.,', 'grammar.ra', 558 +module_eval <<'.,.,', 'grammar.ra', 553 def _reduce_133( val, _values, result ) result = nil result end .,., -module_eval <<'.,.,', 'grammar.ra', 562 +module_eval <<'.,.,', 'grammar.ra', 557 def _reduce_134( val, _values, result ) result = ast AST::ASTArray, :children => [] result @@ -1647,14 +1642,14 @@ module_eval <<'.,.,', 'grammar.ra', 562 # reduce 135 omitted -module_eval <<'.,.,', 'grammar.ra', 567 +module_eval <<'.,.,', 'grammar.ra', 562 def _reduce_136( val, _values, result ) result = nil result end .,., -module_eval <<'.,.,', 'grammar.ra', 571 +module_eval <<'.,.,', 'grammar.ra', 566 def _reduce_137( val, _values, result ) result = val[1] result = [result] unless result[0].is_a?(Array) @@ -1664,7 +1659,7 @@ module_eval <<'.,.,', 'grammar.ra', 571 # reduce 138 omitted -module_eval <<'.,.,', 'grammar.ra', 578 +module_eval <<'.,.,', 'grammar.ra', 573 def _reduce_139( val, _values, result ) result = val[0] result = [result] unless result[0].is_a?(Array) @@ -1673,7 +1668,7 @@ module_eval <<'.,.,', 'grammar.ra', 578 end .,., -module_eval <<'.,.,', 'grammar.ra', 583 +module_eval <<'.,.,', 'grammar.ra', 578 def _reduce_140( val, _values, result ) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0], val[2]] @@ -1681,7 +1676,7 @@ module_eval <<'.,.,', 'grammar.ra', 583 end .,., -module_eval <<'.,.,', 'grammar.ra', 587 +module_eval <<'.,.,', 'grammar.ra', 582 def _reduce_141( val, _values, result ) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0]] @@ -1689,14 +1684,14 @@ module_eval <<'.,.,', 'grammar.ra', 587 end .,., -module_eval <<'.,.,', 'grammar.ra', 589 +module_eval <<'.,.,', 'grammar.ra', 584 def _reduce_142( val, _values, result ) result = [val[0], val[2]] result end .,., -module_eval <<'.,.,', 'grammar.ra', 591 +module_eval <<'.,.,', 'grammar.ra', 586 def _reduce_143( val, _values, result ) result = [val[0]] result @@ -1705,7 +1700,7 @@ module_eval <<'.,.,', 'grammar.ra', 591 # reduce 144 omitted -module_eval <<'.,.,', 'grammar.ra', 596 +module_eval <<'.,.,', 'grammar.ra', 591 def _reduce_145( val, _values, result ) result = val[1] result @@ -1714,7 +1709,7 @@ module_eval <<'.,.,', 'grammar.ra', 596 # reduce 146 omitted -module_eval <<'.,.,', 'grammar.ra', 601 +module_eval <<'.,.,', 'grammar.ra', 596 def _reduce_147( val, _values, result ) result = val[1] result @@ -1729,14 +1724,14 @@ module_eval <<'.,.,', 'grammar.ra', 601 # reduce 151 omitted -module_eval <<'.,.,', 'grammar.ra', 608 +module_eval <<'.,.,', 'grammar.ra', 603 def _reduce_152( val, _values, result ) result = ast AST::Variable, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 616 +module_eval <<'.,.,', 'grammar.ra', 611 def _reduce_153( val, _values, result ) if val[1].instance_of?(AST::ASTArray) result = val[1] @@ -1747,7 +1742,7 @@ module_eval <<'.,.,', 'grammar.ra', 616 end .,., -module_eval <<'.,.,', 'grammar.ra', 618 +module_eval <<'.,.,', 'grammar.ra', 613 def _reduce_154( val, _values, result ) result = ast AST::ASTArray result @@ -1760,7 +1755,7 @@ module_eval <<'.,.,', 'grammar.ra', 618 # reduce 157 omitted -module_eval <<'.,.,', 'grammar.ra', 623 +module_eval <<'.,.,', 'grammar.ra', 618 def _reduce_158( val, _values, result ) result = nil result |