app/check_includes.py
author Sverre Rabbelier <srabbelier@gmail.com>
Thu, 27 Nov 2008 21:57:24 +0000
changeset 597 66088092f849
parent 595 3c4d5b7d4391
child 598 c1f9435bb645
permissions -rwxr-xr-x
Proper working implementation of a cycle detection algorithm, that returns the cycles (rather than printing them) by constructing the path between the two nodes that were found to be cyclic. Patch by: Sverre Rabbelier
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env python
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     2
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     3
import sys
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     4
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     5
import cPickle
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     6
import os
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     7
import graph
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     8
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     9
def parseFile(file_name):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    10
  if os.path.exists("imports.dat"):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    11
    log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    12
    all_imports = cPickle.load(log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
    log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
  else:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
    all_imports = {}
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
  if file_name in all_imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
    print "Overwriting previous data on '%s'." % file_name
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
  imports = []
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    21
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    22
  file = open(file_name)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    23
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    24
  for line in file:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
    if line.lstrip().startswith('import soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    26
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
      mod = splitline[1]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    29
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
    if line.lstrip().startswith('from soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
      mod = splitline[1] + '.' + splitline[3]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    33
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    34
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    35
  for idx, imp in enumerate(imports):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    36
    if imp in set(imports[idx+1:]):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
      print "Warning: file '%s' has a redundant import: '%s'." % (file_name, imp)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    39
  if file_name.endswith("__init__.py"):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    40
    normalized = file_name[:-12].replace('/', '.')
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    41
  else:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    42
    normalized = file_name[:-3].replace('/', '.')
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    43
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    44
  print "Writing imports for file %s (%s)." % (file_name, normalized)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    45
  all_imports[normalized] = imports
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    46
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
  log = open("imports.dat", "w")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
  cPickle.dump(all_imports, log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    49
  log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    50
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    51
  return 0
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    52
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    53
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    54
def buildGraph():
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    55
  import graph
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    56
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    57
  log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    58
  all_imports = cPickle.load(log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    59
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    60
  gr = graph.digraph()
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    61
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    62
  gr.add_nodes(all_imports.keys())
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
  for file_name, imports in all_imports.iteritems():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    65
    for imp in imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    66
      gr.add_edge(file_name, imp)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    67
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    68
  return gr
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    69
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    70
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    71
def showGraph(gr):
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    72
  for node in gr:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    73
    print "%s: " % node
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    74
    for edge in gr[node]:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    75
      print "\t%s" % edge
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    76
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    77
  return 0
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    78
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    79
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    80
def getParents(gst, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    81
  parents = []
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    82
  current = target
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    83
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    84
  while True:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    85
    for node in gst:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    86
      if current in gst[node]:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    87
        parents.append(node)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    88
        current = node
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    89
        break
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    90
    else:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    91
      break
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    92
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    93
  return parents
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    94
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    95
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    96
def pathFrom(parents, first, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    97
  idx = parents.index(first)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    98
  path = parents[idx::-1]
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    99
  return [target] + path + [target]
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   100
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   101
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   102
def findCycle(gr, gst, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   103
  parents = getParents(gst, target)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   104
  cycles = []
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   105
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   106
  for node in gr[target]:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   107
    if node in parents:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   108
      cycles.append(pathFrom(parents, node, target))
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   109
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   110
  return cycles
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   111
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   112
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   113
def findCycles(gr):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   114
  st, pre, post = gr.depth_first_search()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   115
  gst = graph.digraph()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   116
  gst.add_spanning_tree(st)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   117
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   118
  cycles = []
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   119
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   120
  for node in gr:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   121
    cycles += findCycle(gr, gst, node)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   122
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   123
  return cycles
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   124
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   125
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   126
def drawGraph(gr):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   127
  st, pre, post = gr.depth_first_search()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   128
  gst = graph.digraph()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   129
  gst.add_spanning_tree(st)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   130
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   131
  sys.path.append('/usr/lib/graphviz/python/')
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   132
  import gv
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   133
  dot = gst.write(fmt='dot')
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   134
  gvv = gv.readstring(dot)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   135
  gv.layout(gvv,'dot')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   136
  gv.render(gvv,'png','imports.png')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   137
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   138
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   139
def main(args):
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   140
  if len(args) == 1 and args[0].startswith("."):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   141
    gr = buildGraph()
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   142
    if args[0] == '.':
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   143
      return showGraph(gr)
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   144
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   145
    if args[0] == '..':
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   146
      return drawGraph(gr)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   147
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   148
    if args[0] == '...':
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   149
      cycles = findCycles(gr)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   150
      for cycle in cycles:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   151
        print cycle
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   152
      return 0
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   153
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   154
  if not args:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   155
    print "Please specify a filename to parse, or '.' to list the parsed imports"
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   156
    return -1
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   157
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   158
  res = 0
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   159
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   160
  for file_name in args:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   161
    res += parseFile(file_name)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   162
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   163
  print "Done parsing."
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   164
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   165
  return res
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   166
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   167
if __name__ == '__main__':
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   168
  import sys
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   169
  res = main(sys.argv[1:])
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   170
  sys.exit(res)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   171