| Index: cros_generate_deps_graphs
|
| diff --git a/cros_generate_deps_graphs b/cros_generate_deps_graphs
|
| index 946cc38404db1d4a89e8595593e66a8010421f94..a8c17d46099fa3c5b049d60fe90694bc21bd98a1 100755
|
| --- a/cros_generate_deps_graphs
|
| +++ b/cros_generate_deps_graphs
|
| @@ -5,9 +5,9 @@
|
|
|
| """Generates pretty dependency graphs for Chrome OS packages."""
|
|
|
| +import dot_helper
|
| import optparse
|
| import os
|
| -import subprocess
|
| import sys
|
|
|
|
|
| @@ -41,26 +41,16 @@ def GetOutputBaseName(node, options):
|
| options.format)
|
|
|
|
|
| -def GetNodeLines(node, options, color):
|
| +def AddNodeToSubgraph(subgraph, node, options, color):
|
| """Gets the dot definition for a node."""
|
| name = node['full_name']
|
| - tags = ['label="%s (%s)"' % (name, node['action']),
|
| - 'color="%s"' % color,
|
| - 'fontcolor="%s"' % color]
|
| + href = None
|
| if options.link:
|
| filename = GetOutputBaseName(node, options)
|
| - tags.append('href="%s%s"' % (options.base_url, filename))
|
| - return ['"%s" [%s];' % (name, ', '.join(tags))]
|
| + href = '%s%s' % (options.base_url, filename)
|
| + subgraph.AddNode(name, name, color, href)
|
|
|
|
|
| -def GetReverseDependencyArcLines(node, options):
|
| - """Gets the dot definitions for the arcs leading to a node."""
|
| - lines = []
|
| - name = node['full_name']
|
| - for j in node['rev_deps']:
|
| - lines.append('"%s" -> "%s";' % (j, name))
|
| - return lines
|
| -
|
|
|
| def GenerateDotGraph(package, deps_map, options):
|
| """Generates the dot source for the dependency graph leading to a node.
|
| @@ -73,38 +63,29 @@ def GenerateDotGraph(package, deps_map, options):
|
| # definitions
|
| emitted = set()
|
|
|
| - lines = ['digraph dep {',
|
| - 'graph [name="%s"];' % package]
|
| + graph = dot_helper.Graph(package)
|
|
|
| # Add all the children if we want them, all of them in their own subgraph,
|
| # as a sink. Keep the arcs outside of the subgraph though (it generates
|
| # better layout).
|
| - has_children = False
|
| + children_subgraph = None
|
| if options.children and node['deps']:
|
| - has_children = True
|
| - lines += ['subgraph {',
|
| - 'rank=sink;']
|
| - arc_lines = []
|
| + children_subgraph = graph.AddNewSubgraph('sink')
|
| for child in node['deps']:
|
| child_node = deps_map[child]
|
| - lines += GetNodeLines(child_node, options, CHILD_COLOR)
|
| + AddNodeToSubgraph(children_subgraph, child_node, options, CHILD_COLOR)
|
| emitted.add(child)
|
| - # If child is in the rev_deps, we'll get the arc later.
|
| - if not child in node['rev_deps']:
|
| - arc_lines.append('"%s" -> "%s";' % (package, child))
|
| - lines += ['}']
|
| - lines += arc_lines
|
| + graph.AddArc(package, child)
|
|
|
| # Add the package in its own subgraph. If we didn't have children, make it
|
| # a sink
|
| - lines += ['subgraph {']
|
| - if has_children:
|
| - lines += ['rank=same;']
|
| + if children_subgraph:
|
| + rank = 'same'
|
| else:
|
| - lines += ['rank=sink;']
|
| - lines += GetNodeLines(node, options, TARGET_COLOR)
|
| + rank = 'sink'
|
| + package_subgraph = graph.AddNewSubgraph(rank)
|
| + AddNodeToSubgraph(package_subgraph, node, options, TARGET_COLOR)
|
| emitted.add(package)
|
| - lines += ['}']
|
|
|
| # Add all the other nodes, as well as all the arcs.
|
| for dep in deps:
|
| @@ -113,11 +94,11 @@ def GenerateDotGraph(package, deps_map, options):
|
| color = NORMAL_COLOR
|
| if dep_node['action'] == 'seed':
|
| color = SEED_COLOR
|
| - lines += GetNodeLines(dep_node, options, color)
|
| - lines += GetReverseDependencyArcLines(dep_node, options)
|
| + AddNodeToSubgraph(graph, dep_node, options, color)
|
| + for j in dep_node['rev_deps']:
|
| + graph.AddArc(j, dep)
|
|
|
| - lines += ['}']
|
| - return lines
|
| + return graph.Gen()
|
|
|
|
|
| def GenerateImages(input, options):
|
| @@ -126,20 +107,15 @@ def GenerateImages(input, options):
|
|
|
| for package in deps_map:
|
| lines = GenerateDotGraph(package, deps_map, options)
|
| - data = '\n'.join(lines)
|
|
|
| filename = os.path.join(options.output_dir,
|
| GetOutputBaseName(deps_map[package], options))
|
|
|
| - # Send the source to dot.
|
| - proc = subprocess.Popen(['dot', '-T' + options.format, '-o' + filename],
|
| - stdin=subprocess.PIPE)
|
| - proc.communicate(data)
|
| -
|
| + save_dot_filename = None
|
| if options.save_dot:
|
| - file = open(filename + '.dot', 'w')
|
| - file.write(data)
|
| - file.close()
|
| + save_dot_filename = filename + '.dot'
|
| +
|
| + dot_helper.GenerateImage(lines, filename, options.format, save_dot_filename)
|
|
|
|
|
| def main():
|
|
|