diff options
author | Brice Figureau <brice-puppet@daysofwonder.com> | 2009-02-14 17:16:09 +0100 |
---|---|---|
committer | Brice Figureau <brice-puppet@daysofwonder.com> | 2009-02-16 20:12:11 +0100 |
commit | 0c71c5cde211808ef6fd744ccbcc82b6cfc38bb5 (patch) | |
tree | 5328d85be48271fd2d34ff78a98f2e4250e3cad4 /lib | |
parent | e317fa9717e648435dbbc62497d73f803b7b2760 (diff) | |
download | puppet-0c71c5cde211808ef6fd744ccbcc82b6cfc38bb5.tar.gz puppet-0c71c5cde211808ef6fd744ccbcc82b6cfc38bb5.tar.xz puppet-0c71c5cde211808ef6fd744ccbcc82b6cfc38bb5.zip |
Move puppetdoc to the Application Controller paradigm
Signed-off-by: Brice Figureau <brice-puppet@daysofwonder.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/application/puppetdoc.rb | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/lib/puppet/application/puppetdoc.rb b/lib/puppet/application/puppetdoc.rb new file mode 100644 index 000000000..99e46cfd1 --- /dev/null +++ b/lib/puppet/application/puppetdoc.rb @@ -0,0 +1,198 @@ +require 'puppet' +require 'puppet/application' +require 'puppet/util/reference' +require 'puppet/network/handler' +require 'puppet/util/rdoc' + +$tab = " " +Reference = Puppet::Util::Reference + +Puppet::Application.new(:puppetdoc) do + + should_not_parse_config + + attr_accessor :unknown_args, :manifest + + preinit do + {:references => [], :mode => :text, :format => :to_rest }.each do |name,value| + options[name] = value + end + @unknown_args = [] + @manifest = false + end + + option("--all","-a") + option("--outputdir OUTPUTDIR","-o") + option("--verbose","-v") + option("--debug","-d") + + option("--format FORMAT", "-f") do |arg| + method = "to_%s" % arg + if Reference.method_defined?(method) + options[:format] = method + else + raise "Invalid output format %s" % arg + end + end + + option("--mode MODE", "-m") do |arg| + if Reference.modes.include?(arg) or arg.intern==:rdoc + options[:mode] = arg.intern + else + raise "Invalid output mode %s" % arg + end + end + + option("--list", "-l") do |arg| + puts Reference.references.collect { |r| Reference.reference(r).doc }.join("\n") + exit(0) + end + + option("--reference REFERENCE", "-r") do |arg| + options[:references] << arg.intern + end + + unknown do |opt, arg| + @unknown_args << {:opt => opt, :arg => arg } + true + end + + dispatch do + return :rdoc if options[:mode] == :rdoc + return :trac if options[:mode] == :trac + return :other + end + + command(:rdoc) do + exit_code = 0 + files = [] + unless @manifest + files += Puppet[:modulepath].split(':').collect { |p| File.expand_path(p) } + files += Puppet[:manifestdir].split(':').collect { |p| File.expand_path(p) } + end + files += ARGV + Puppet.info "scanning: %s" % files.inspect + Puppet.settings.setdefaults("puppetdoc", + "document_all" => [false, "Document all resources"] + ) + Puppet.settings[:document_all] = options[:all] || false + begin + if @manifest + Puppet::Util::RDoc.manifestdoc(files) + else + Puppet::Util::RDoc.rdoc(options[:outputdir], files) + end + rescue => detail + if Puppet[:trace] + puts detail.backtrace + end + $stderr.puts "Could not generate documentation: %s" % detail + exit_code = 1 + end + exit exit_code + end + + command(:trac) do + options[:references].each do |name| + section = Puppet::Util::Reference.reference(name) or raise "Could not find section %s" % name + unless options[:mode] == :pdf + section.trac + end + end + end + + command(:other) do + text = "" + if options[:references].length > 1 + with_contents = false + else + with_contents = true + end + exit_code = 0 + options[:references].sort { |a,b| a.to_s <=> b.to_s }.each do |name| + raise "Could not find reference %s" % name unless section = Puppet::Util::Reference.reference(name) + + begin + # Add the per-section text, but with no ToC + text += section.send(options[:format], with_contents) + rescue => detail + puts detail.backtrace + $stderr.puts "Could not generate reference %s: %s" % [name, detail] + exit_code = 1 + next + end + end + + unless with_contents # We've only got one reference + text += Puppet::Util::Reference.footer + end + + # Replace the trac links, since they're invalid everywhere else + text.gsub!(/`\w+\s+([^`]+)`:trac:/) { |m| $1 } + + if options[:mode] == :pdf + Puppet::Util::Reference.pdf(text) + else + puts text + end + + exit exit_code + end + + setup do + # sole manifest documentation + if ARGV.size > 0 + options[:mode] = :rdoc + @manifest = true + end + + if options[:mode] == :rdoc + setup_rdoc + else + setup_reference + end + end + + def setup_reference + if options[:all] + # Don't add dynamic references to the "all" list. + options[:references] = Reference.references.reject do |ref| + Reference.reference(ref).dynamic? + end + end + + if options[:references].empty? + options[:references] << :type + end + end + + def setup_rdoc + # consume the unknown options + # and feed them as settings + if @unknown_args.size > 0 + @unknown_args.each do |option| + # force absolute path for modulepath when passed on commandline + if option[:opt]=="--modulepath" or option[:opt] == "--manifestdir" + option[:arg] = option[:arg].split(':').collect { |p| File.expand_path(p) }.join(':') + end + Puppet.settings.handlearg(option[:opt], option[:arg]) + end + end + + # hack to get access to puppetmasterd modulepath and manifestdir + Puppet[:name] = "puppetmasterd" + # Now parse the config + Puppet.parse_config + + # Handle the logging settings. + if options[:debug] or options[:verbose] + if options[:debug] + Puppet::Util::Log.level = :debug + else + Puppet::Util::Log.level = :info + end + + Puppet::Util::Log.newdestination(:console) + end + end +end |