poky/scripts/contrib/graph-tool
Ross Burton a56f14e5fc graph-tool: update to new networkx API, be iterative
Update the dot parser to the new networkx API (using pydotplus to parse).

Also, switch the path display to output the paths as they are found instead of
collecting them into a list, so output appears sooner.

(From OE-Core rev: c91898b07465fdd5f3629babb7ff9226454de24e)

Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2016-08-17 10:35:42 +01:00

2.7 KiB
Executable File

#!/usr/bin/env python3

Simple graph query utility

useful for getting answers from .dot files produced by bitbake -g

Written by: Paul Eggleton paul.eggleton@linux.intel.com

Copyright 2013 Intel Corporation

This program is free software; you can redistribute it and/or modify

it under the terms of the GNU General Public License version 2 as

published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

GNU General Public License for more details.

You should have received a copy of the GNU General Public License along

with this program; if not, write to the Free Software Foundation, Inc.,

51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

import sys

def get_path_networkx(dotfile, fromnode, tonode): try: import networkx except ImportError: print('ERROR: Please install the networkx python module') sys.exit(1)

graph = networkx.DiGraph(networkx.nx_pydot.read_dot(dotfile))
def node_missing(node):
    import difflib
    close_matches = difflib.get_close_matches(node, graph.nodes(), cutoff=0.7)
    if close_matches:
        print('ERROR: no node "%s" in graph. Close matches:\n  %s' % (node, '\n  '.join(close_matches)))
    sys.exit(1)

if not fromnode in graph:
    node_missing(fromnode)
if not tonode in graph:
    node_missing(tonode)
return networkx.all_simple_paths(graph, source=fromnode, target=tonode)

def find_paths(args, usage): if len(args) < 3: usage() sys.exit(1)

fromnode = args[1]
tonode = args[2]

path = None
for path in get_path_networkx(args[0], fromnode, tonode):
    print(" -> ".join(map(str, path)))
if not path:
    print("ERROR: no path from %s to %s in graph" % (fromnode, tonode))
    sys.exit(1)

def main(): import optparse parser = optparse.OptionParser( usage = '''%prog [options]

Available commands: find-paths Find all of the paths between two nodes in a dot graph''')

#parser.add_option("-d", "--debug",
#        help = "Report all SRCREV values, not just ones where AUTOREV has been used",
#        action="store_true", dest="debug", default=False)

options, args = parser.parse_args(sys.argv)
args = args[1:]

if len(args) < 1:
    parser.print_help()
    sys.exit(1)

if args[0] == "find-paths":
    find_paths(args[1:], parser.print_help)
else:
    parser.print_help()
    sys.exit(1)

if name == "main": main()