[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, experimental, updated. debian/2.6.8-1-844-g7ec39d5
Daniel Pittman
daniel at rimspace.net
Tue May 10 08:04:27 UTC 2011
The following commit has been merged in the experimental branch:
commit adc9244ecf4bfb59a98a2dd5472b03f685b6303e
Author: Daniel Pittman <daniel at rimspace.net>
Date: Thu Jan 27 00:02:52 2011 -0800
Feature #2597 -- generate a DOT graph of cycles on request.
When the '--graph' option is specified, generate a new 'cycles.dot' file and
report the location of that to the user. This contains only the cycles, in
dot format, allowing a visual representation of the cycle to be obtained
quickly.
This will include up to 10 paths through the cycle in the graph, and only one
in the display to the user, to reduce information overload.
diff --git a/lib/puppet/simple_graph.rb b/lib/puppet/simple_graph.rb
index 1b5ffdc..e39aa87 100644
--- a/lib/puppet/simple_graph.rb
+++ b/lib/puppet/simple_graph.rb
@@ -191,7 +191,7 @@ class Puppet::SimpleGraph
# BFS is preferred because it will generally report the shortest paths
# through the graph first, which are more likely to be interesting to the
# user. I think; it would be interesting to verify that. --daniel 2011-01-23
- def all_paths_in_cycle(cycle, max_paths = 10)
+ def paths_in_cycle(cycle, max_paths = 1)
raise ArgumentError, "negative or zero max_paths" if max_paths < 1
# Calculate our filtered outbound vertex lists...
@@ -225,14 +225,43 @@ class Puppet::SimpleGraph
message = "Found #{n} dependency cycle#{s}:\n"
cycles.each do |cycle|
- paths = all_paths_in_cycle(cycle)
+ paths = paths_in_cycle(cycle)
message += paths.map{ |path| '(' + path.join(" => ") + ')'}.join("\n") + "\n"
end
- message += "Try the '--graph' option and opening the '.dot' file in OmniGraffle or GraphViz"
+
+ if Puppet[:graph] then
+ filename = write_cycles_to_graph(cycles)
+ message += "Cycle graph written to #{filename}."
+ else
+ message += "Try the '--graph' option and opening the "
+ message += "resulting '.dot' file in OmniGraffle or GraphViz"
+ end
raise Puppet::Error, message
end
+ def write_cycles_to_graph(cycles)
+ # This does not use the DOT graph library, just writes the content
+ # directly. Given the complexity of this, there didn't seem much point
+ # using a heavy library to generate exactly the same content. --daniel 2011-01-27
+ Puppet.settings.use(:graphing)
+
+ graph = ["digraph Resource_Cycles {"]
+ graph << ' label = "Resource Cycles"'
+
+ cycles.each do |cycle|
+ paths_in_cycle(cycle, 10).each do |path|
+ graph << path.map { |v| '"' + v.to_s.gsub(/"/, '\\"') + '"' }.join(" -> ")
+ end
+ end
+
+ graph << '}'
+
+ filename = File.join(Puppet[:graphdir], "cycles.dot")
+ File.open(filename, "w") { |f| f.puts graph }
+ return filename
+ end
+
# Provide a topological sort.
def topsort
degree = {}
diff --git a/spec/unit/simple_graph_spec.rb b/spec/unit/simple_graph_spec.rb
index e7c875f..2c6af06 100755
--- a/spec/unit/simple_graph_spec.rb
+++ b/spec/unit/simple_graph_spec.rb
@@ -362,7 +362,7 @@ describe Puppet::SimpleGraph do
add_edges "a" => "b", "b" => "c", "c" => "a"
cycles = @graph.find_cycles_in_graph.sort
- paths = @graph.all_paths_in_cycle(cycles.first)
+ paths = @graph.paths_in_cycle(cycles.first, 100)
paths.should be == [%w{a b c a}]
end
@@ -374,7 +374,7 @@ describe Puppet::SimpleGraph do
cycles = @graph.find_cycles_in_graph.sort
cycles.length.should be == 1
- paths = @graph.all_paths_in_cycle(cycles.first)
+ paths = @graph.paths_in_cycle(cycles.first, 100)
paths.sort.should be == [%w{a b1 a}, %w{a b2 a}]
end
@@ -385,7 +385,7 @@ describe Puppet::SimpleGraph do
cycles = @graph.find_cycles_in_graph.sort
cycles.length.should be == 1
- paths = @graph.all_paths_in_cycle(cycles.first)
+ paths = @graph.paths_in_cycle(cycles.first, 100)
paths.should be == [%w{a b a}, %w{a b c a}]
end
@@ -396,11 +396,11 @@ describe Puppet::SimpleGraph do
cycles.length.should be == 1
(1..20).each do |n|
- paths = @graph.all_paths_in_cycle(cycles.first, n)
+ paths = @graph.paths_in_cycle(cycles.first, n)
paths.length.should be == n
end
- paths = @graph.all_paths_in_cycle(cycles.first, 21)
+ paths = @graph.paths_in_cycle(cycles.first, 21)
paths.length.should be == 20
end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list