summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Berry <paul@puppetlabs.com>2010-09-21 12:12:19 -0700
committerMarkus Roberts <Markus@reality.com>2010-09-22 21:11:31 -0700
commit99c1019e1d3402ec8e476dc859d5aaef82ec4f69 (patch)
tree94c261c7b0eb76a213f4f3186031a4a889bb8471
parent8cd1540f82cbdf903c164bdbc2c7229e34a4178b (diff)
downloadpuppet-99c1019e1d3402ec8e476dc859d5aaef82ec4f69.tar.gz
puppet-99c1019e1d3402ec8e476dc859d5aaef82ec4f69.tar.xz
puppet-99c1019e1d3402ec8e476dc859d5aaef82ec4f69.zip
[#4798] Puppet doc manifests documentation mode broken
When running puppet doc, if the directory containing the user's specified manifest file overlaps with the modules directory (i.e. they are the same directory or one contains the other), Puppet doc would try to parse the overlapping files twice, triggering an exception which made the documentation run fail. Fixed the bug by adding a check to the RDoc::Parser#scan method to prevent re-parsing of files that have already been parsed. Also added a spec test to verify that this works.
-rw-r--r--lib/puppet/util/rdoc/parser.rb15
-rw-r--r--spec/integration/application/doc_spec.rb48
-rwxr-xr-xspec/unit/util/rdoc/parser_spec.rb2
3 files changed, 58 insertions, 7 deletions
diff --git a/lib/puppet/util/rdoc/parser.rb b/lib/puppet/util/rdoc/parser.rb
index 63df38ab9..841484322 100644
--- a/lib/puppet/util/rdoc/parser.rb
+++ b/lib/puppet/util/rdoc/parser.rb
@@ -33,13 +33,16 @@ class Parser
# main entry point
def scan
- Puppet.info "rdoc: scanning #{@input_file_name}"
- if @input_file_name =~ /\.pp$/
- @parser = Puppet::Parser::Parser.new(Puppet[:environment])
- @parser.file = @input_file_name
- @ast = @parser.parse
+ env = Puppet::Node::Environment.new
+ unless env.known_resource_types.watching_file?(@input_file_name)
+ Puppet.info "rdoc: scanning #{@input_file_name}"
+ if @input_file_name =~ /\.pp$/
+ @parser = Puppet::Parser::Parser.new(env)
+ @parser.file = @input_file_name
+ @ast = @parser.parse
+ end
+ scan_top_level(@top_level)
end
- scan_top_level(@top_level)
@top_level
end
diff --git a/spec/integration/application/doc_spec.rb b/spec/integration/application/doc_spec.rb
new file mode 100644
index 000000000..cb9f47868
--- /dev/null
+++ b/spec/integration/application/doc_spec.rb
@@ -0,0 +1,48 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'puppet_spec/files'
+
+describe Puppet::Application::Doc do
+ include PuppetSpec::Files
+
+ it "should not generate an error when module dir overlaps parent of site.pp (#4798)" do
+ begin
+ # Note: the directory structure below is more complex than it
+ # needs to be, but it's representative of the directory structure
+ # used in bug #4798.
+ old_dir = Dir.getwd # Note: can't use chdir with a block because it will generate bogus warnings
+ tmpdir = tmpfile('doc_spec')
+ Dir.mkdir(tmpdir)
+ Dir.chdir(tmpdir)
+ site_file = 'site.pp'
+ File.open(site_file, 'w') do |f|
+ f.puts '# A comment'
+ end
+ modules_dir = 'modules'
+ Dir.mkdir(modules_dir)
+ rt_dir = File.join(modules_dir, 'rt')
+ Dir.mkdir(rt_dir)
+ manifests_dir = File.join(rt_dir, 'manifests')
+ Dir.mkdir(manifests_dir)
+ rt_file = File.join(manifests_dir, 'rt.pp')
+ File.open(rt_file, 'w') do |f|
+ f.puts '# A class'
+ f.puts 'class foo { }'
+ f.puts '# A definition'
+ f.puts 'define bar { }'
+ end
+
+ puppet = Puppet::Application[:doc]
+ Puppet[:modulepath] = modules_dir
+ Puppet[:manifest] = site_file
+ puppet.options[:mode] = :rdoc
+ puppet.expects(:exit).with(0)
+ puppet.run_command
+
+ File.should be_exist('doc')
+ ensure
+ Dir.chdir(old_dir)
+ end
+ end
+end
diff --git a/spec/unit/util/rdoc/parser_spec.rb b/spec/unit/util/rdoc/parser_spec.rb
index 79195e657..3614c0a3c 100755
--- a/spec/unit/util/rdoc/parser_spec.rb
+++ b/spec/unit/util/rdoc/parser_spec.rb
@@ -19,7 +19,7 @@ describe RDoc::Parser do
it "should parse puppet files with the puppet parser" do
@parser.stubs(:scan_top_level)
parser = stub 'parser'
- Puppet::Parser::Parser.expects(:new).returns(parser)
+ Puppet::Parser::Parser.stubs(:new).returns(parser)
parser.expects(:parse)
parser.expects(:file=).with("module/manifests/init.pp")