#!/usr/bin/env python3 # Simple graph query utility # useful for getting answers from .dot files produced by bitbake -g # # Written by: Paul Eggleton # # Copyright 2013 Intel Corporation # # SPDX-License-Identifier: GPL-2.0-only # 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()