-
Notifications
You must be signed in to change notification settings - Fork 409
/
Copy pathcheck_circular.py
executable file
·36 lines (32 loc) · 1 KB
/
check_circular.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
import os
import sys
import networkx as nx
def build_graph(path):
graph = nx.DiGraph()
for f in os.listdir(path):
graph.add_node(f)
cnt = 0
with open(path+"/"+f) as fp:
line = fp.readline()
enter_include = False
exit_include = False
while line and not exit_include:
if line.startswith('#include "'):
enter_include = True
node = line.split()[1].replace('"', '')
graph.add_node(node)
graph.add_edge(f, node)
elif enter_include:
exit_include = True
line = fp.readline()
return graph
def main():
graph = build_graph("../include/xtensor")
cycle = list(nx.simple_cycles(graph))
for x in cycle:
print(x)
exception_message = ' - '.join([str(y) for y in cycle])
if len(cycle) != 0:
raise Exception('CircularInclude', exception_message)
main()