app/check_includes.py
author Sverre Rabbelier <srabbelier@gmail.com>
Thu, 27 Nov 2008 23:40:30 +0000
changeset 598 c1f9435bb645
parent 597 66088092f849
permissions -rwxr-xr-x
Change command parsing and do file walking manually Also print warnings to stderr 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
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
     9
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    10
ROOTDIR = "soc"
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    11
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    12
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
def parseFile(file_name):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
  if os.path.exists("imports.dat"):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
    log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
    all_imports = cPickle.load(log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
    log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
  else:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
    all_imports = {}
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    21
  if file_name in all_imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    22
    print "Overwriting previous data on '%s'." % 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
  imports = []
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    26
  file = open(file_name)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
  for line in file:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    29
    if line.lstrip().startswith('import soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
      mod = splitline[1]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    33
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    34
    if line.lstrip().startswith('from soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    35
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    36
      mod = splitline[1] + '.' + splitline[3]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    39
  for idx, imp in enumerate(imports):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    40
    if imp in set(imports[idx+1:]):
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    41
      sys.stderr.write("Warning: file '%s' has a redundant import: '%s'.\n" % (file_name, imp))
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    42
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    43
  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
    44
    normalized = file_name[:-12].replace('/', '.')
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    45
  else:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    46
    normalized = file_name[:-3].replace('/', '.')
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
  print "Writing imports for file %s (%s)." % (file_name, normalized)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    49
  all_imports[normalized] = imports
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
  log = open("imports.dat", "w")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    52
  cPickle.dump(all_imports, log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    53
  log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    54
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    55
  return 0
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    56
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    57
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    58
def buildGraph():
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    59
  if not os.path.exists("imports.dat"):
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    60
    sys.stderr.write("Missing imports.dat file, run 'build' first\n")
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
    61
    return
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    62
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
  log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
  all_imports = cPickle.load(log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    65
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    66
  gr = graph.digraph()
595
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
  gr.add_nodes(all_imports.keys())
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
  for file_name, imports in all_imports.iteritems():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    71
    for imp in imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    72
      gr.add_edge(file_name, imp)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    73
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    74
  return gr
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    75
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
def showGraph(gr):
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    78
  for node in gr:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    79
    print "%s: " % node
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    80
    for edge in gr[node]:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    81
      print "\t%s" % edge
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    82
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    83
  return 0
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    84
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    85
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    86
def getParents(gst, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    87
  parents = []
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    88
  current = target
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    89
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    90
  while True:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    91
    for node in gst:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    92
      if current in gst[node]:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    93
        parents.append(node)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    94
        current = node
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    95
        break
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    96
    else:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    97
      break
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    98
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
    99
  return parents
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 pathFrom(parents, first, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   103
  idx = parents.index(first)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   104
  path = parents[idx::-1]
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   105
  return [target] + path + [target]
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   106
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   107
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   108
def findCycle(gr, gst, target):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   109
  parents = getParents(gst, target)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   110
  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
  for node in gr[target]:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   113
    if node in parents:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   114
      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
   115
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   116
  return cycles
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
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   119
def findCycles(gr):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   120
  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
   121
  gst = graph.digraph()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   122
  gst.add_spanning_tree(st)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   123
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   124
  cycles = []
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
  for node in gr:
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   127
    cycles += findCycle(gr, gst, node)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   128
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   129
  return cycles
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
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   132
def drawGraph(gr):
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   133
  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
   134
  gst = graph.digraph()
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   135
  gst.add_spanning_tree(st)
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   136
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   137
  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
   138
  import gv
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   139
  dot = gst.write(fmt='dot')
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   140
  gvv = gv.readstring(dot)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   141
  gv.layout(gvv,'dot')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   142
  gv.render(gvv,'png','imports.png')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   143
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   144
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   145
def accumulate(arg, dirname, fnames):
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   146
  for fname in fnames:
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   147
    if not fname.endswith(".py"):
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   148
      continue
597
66088092f849 Proper working implementation of a cycle detection algorithm, that
Sverre Rabbelier <srabbelier@gmail.com>
parents: 595
diff changeset
   149
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   150
    arg.append(os.path.join(dirname, fname))
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   151
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   152
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   153
def main(args):
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   154
  if len(args) != 1:
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   155
    print "Supported options: 'print', 'build', 'find', and 'draw'."
595
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
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   158
  action = args[0]
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   159
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   160
  if action == "build":
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   161
    fnames = []
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   162
    os.path.walk(ROOTDIR, accumulate, fnames)
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   163
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   164
    for fname in fnames:
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   165
      parseFile(fname)
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   166
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   167
    print "Done parsing."
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   168
    return 0
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   169
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   170
  gr = buildGraph()
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   171
  if not gr:
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   172
    return 1
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   173
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   174
  if action == "show":
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   175
    return showGraph(gr)
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   176
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   177
  if action == "draw":
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   178
    return drawGraph(gr)
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   179
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   180
  if action == "find":
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   181
    cycles = findCycles(gr)
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   182
    for cycle in cycles:
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   183
      print cycle
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   184
    return 0
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   185
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   186
  print "Unknown option."
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   187
  return -1
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   188
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   189
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   190
if __name__ == '__main__':
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   191
  import sys
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   192
  os.chdir("../app")
595
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   193
  res = main(sys.argv[1:])
598
c1f9435bb645 Change command parsing and do file walking manually
Sverre Rabbelier <srabbelier@gmail.com>
parents: 597
diff changeset
   194
  sys.exit(0)