app/check_includes.py
author Sverre Rabbelier <srabbelier@gmail.com>
Wed, 26 Nov 2008 23:56:35 +0000
changeset 595 3c4d5b7d4391
child 597 66088092f849
permissions -rwxr-xr-x
Added rudementry include checker 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
sys.path.append('/usr/lib/graphviz/python/')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     5
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     6
import cPickle
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     7
import os
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     8
import graph
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     9
import gv
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    10
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    11
def parseFile(file_name):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    12
  if os.path.exists("imports.dat"):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
    log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
    all_imports = cPickle.load(log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
    log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
  else:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
    all_imports = {}
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
  if file_name in all_imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
    print "Overwriting previous data on '%s'." % file_name
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
  imports = []
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
  file = open(file_name)
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
  for line in file:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
    if line.lstrip().startswith('import soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    29
      mod = splitline[1]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
    if line.lstrip().startswith('from soc'):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    33
      splitline = line[:-1].split(' ')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    34
      mod = splitline[1] + '.' + splitline[3]
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    35
      imports.append(mod)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    36
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
  for idx, imp in enumerate(imports):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
    if imp in set(imports[idx+1:]):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    39
      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
    40
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    41
  normalized = "soc.%s" % file_name[:-3].replace('/', '.')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    42
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    43
  print "Writing imports for file %s (%s)." % (file_name, normalized)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    44
  all_imports[normalized] = imports
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    45
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    46
  log = open("imports.dat", "w")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
  cPickle.dump(all_imports, log)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
  log.close()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    49
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    50
  return 0
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    51
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
def buildGraph():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    54
  log = open("imports.dat", "r")
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    55
  all_imports = cPickle.load(log)
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
  gr = graph.graph()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    58
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    59
  gr.add_nodes(all_imports.keys())
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    60
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    61
  for file_name, imports in all_imports.iteritems():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    62
    for imp in imports:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
      if imp not in gr:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
        gr.add_node(imp)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    65
      gr.add_edge(file_name, imp)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    66
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    67
  return gr
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    68
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
def showGraph():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    71
  gr = buildGraph()
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
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    77
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    78
def drawGraph():
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    79
  gr = buildGraph()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    80
  dot = gr.write(fmt='dot')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    81
  gvv = gv.readstring(dot)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    82
  gv.layout(gvv,'dot')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    83
  gv.render(gvv,'png','imports.png')
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    84
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    85
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    86
def main(args):
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    87
  if len(args) == 1:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    88
    if args[0] == '.':
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    89
      return showGraph()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    90
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    91
    if args[0] == '..':
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    92
      return drawGraph()
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    93
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    94
  if not args:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    95
    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
    96
    return -1
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    97
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    98
  res = 0
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    99
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   100
  for file_name in args:
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   101
    res += parseFile(file_name)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   102
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   103
  print "Done parsing."
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   104
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   105
  return res
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   106
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   107
if __name__ == '__main__':
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   108
  import sys
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   109
  res = main(sys.argv[1:])
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   110
  sys.exit(res)
3c4d5b7d4391 Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   111