#! /usr/bin/env python """The Tab Police watches for possibly inconsistent indentation.""" import os import sys import getopt import string import tokenize verbose = 0 def main(): global verbose try: opts, args = getopt.getopt(sys.argv[1:], "v") except getopt.error, msg: print msg for o, a in opts: if o == '-v': verbose = verbose + 1 for arg in args: check(arg) def check(file): if os.path.isdir(file) and not os.path.islink(file): if verbose: print "%s: listing directory" % `file` names = os.listdir(file) for name in names: fullname = os.path.join(file, name) if (os.path.isdir(fullname) and not os.path.islink(fullname) or os.path.normcase(name[-3:]) == ".py"): check(fullname) return try: f = open(file) except IOError, msg: print "%s: I/O Error: %s" % (`file`, str(msg)) return if verbose > 1: print "checking", `file`, "with tabsize 8..." tokens = [] tokenize.tabsize = 8 try: tokenize.tokenize(f.readline, tokens.append) except tokenize.TokenError, msg: print "%s: Token Error: %s" % (`file`, str(msg)) if verbose > 1: print "checking", `file`, "with tabsize 4..." f.seek(0) alttokens = [] tokenize.tabsize = 4 try: tokenize.tokenize(f.readline, alttokens.append) except tokenize.TokenError, msg: print "%s: Token Error: %s" % (`file`, str(msg)) f.close() if tokens != alttokens: if verbose: print "%s: *** Trouble in tab city! ***" % `file` else: print file else: if verbose: print "%s: Clean bill of health." % `file` if __name__ == '__main__': main()