diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-05-16 00:00:47 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-05-16 00:00:47 +0000 |
commit | e95734b8bbe570381f4da078b3977a905fe6e031 (patch) | |
tree | 1e8cfa0524a70ac5cc9fc833b90a0e2a6aa78734 /lib/puppet/util/autoload.rb | |
parent | dbedcd7b9892bc41728a4f334464f152d09d54fc (diff) | |
download | puppet-e95734b8bbe570381f4da078b3977a905fe6e031.tar.gz puppet-e95734b8bbe570381f4da078b3977a905fe6e031.tar.xz puppet-e95734b8bbe570381f4da078b3977a905fe6e031.zip |
Redoing autoload a bit in preparation for adding a plugindir
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2518 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/util/autoload.rb')
-rw-r--r-- | lib/puppet/util/autoload.rb | 104 |
1 files changed, 58 insertions, 46 deletions
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb index f171254af..ac4939a0b 100644 --- a/lib/puppet/util/autoload.rb +++ b/lib/puppet/util/autoload.rb @@ -18,14 +18,11 @@ class Puppet::Util::Autoload Puppet::Util.proxy self, :loaded, :clear - def handle_libdir - dir = Puppet[:libdir] - - $: << dir unless $:.include?(dir) - end - def initialize(obj, path, options = {}) @path = path.to_s + if @path !~ /^\w/ + raise ArgumentError, "Autoload paths cannot be fully qualified" + end @object = obj self.class[obj] = self @@ -46,62 +43,77 @@ class Puppet::Util::Autoload @loaded = {} end + # Load a single plugin by name. def load(name) - name = symbolize(name) - handle_libdir() - - path = File.join(@path, name.to_s + ".rb") - - begin - Kernel.load path, @wrap - @loaded[name] = true - return true - rescue LoadError => detail - # I have no idea what's going on here, but different versions - # of ruby are raising different errors on missing files. - unless detail.to_s =~ /^no such file/i - warn "Could not autoload %s: %s" % [name, detail] - if Puppet[:trace] - puts detail.backtrace + path = name.to_s + ".rb" + + eachdir do |dir| + file = File.join(dir, path) + next unless FileTest.exists?(file) + begin + Kernel.load file, @wrap + name = symbolize(name) + @loaded[name] = true + return true + rescue LoadError => detail + # I have no idea what's going on here, but different versions + # of ruby are raising different errors on missing files. + unless detail.to_s =~ /^no such file/i + warn "Could not autoload %s: %s" % [name, detail] + if Puppet[:trace] + puts detail.backtrace + end end + return false end - return false end + return false end + # Indicate whether the specfied plugin has been loaded. def loaded?(name) - name = symbolize(name) - @loaded[name] + @loaded[symbolize(name)] end def loadall - handle_libdir() # Load every instance of everything we can find. - $:.each do |dir| - fdir = File.join(dir, @path) - if FileTest.exists?(fdir) and FileTest.directory?(fdir) - Dir.glob("#{fdir}/*.rb").each do |file| - # Load here, rather than require, so that facts - # can be reloaded. This has some short-comings, I - # believe, but it works as long as real classes - # aren't used. - name = File.basename(file).sub(".rb", '').intern - next if @loaded.include? name - next if $".include?(File.join(@path, name.to_s + ".rb")) - filepath = File.join(@path, name.to_s + ".rb") - begin - Kernel.require filepath - @loaded[name] = true - rescue => detail - if Puppet[:trace] - puts detail.backtrace - end - warn "Could not autoload %s: %s" % [file.inspect, detail] + eachdir do |dir| + Dir.glob("#{dir}/*.rb").each do |file| + # Load here, rather than require, so that facts + # can be reloaded. This has some short-comings, I + # believe, but it works as long as real classes + # aren't used. + name = File.basename(file).sub(".rb", '').intern + next if @loaded.include? name + next if $".include?(File.join(@path, name.to_s + ".rb")) + filepath = File.join(@path, name.to_s + ".rb") + begin + Kernel.require filepath + @loaded[name] = true + rescue => detail + if Puppet[:trace] + puts detail.backtrace end + warn "Could not autoload %s: %s" % [file.inspect, detail] end end end end + + private + + # Yield each subdir in turn. + def eachdir + searchpath.each do |dir| + subdir = File.join(dir, @path) + yield subdir if FileTest.directory?(subdir) + end + end + + # The list of directories to search through for loadable plugins. + def searchpath + [Puppet[:libdir], $:].flatten + end end # $Id$ |