mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

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>
2.7 KiB
Executable File
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()