diff -r 1f0034e370aa -r 71ad690e91f5 build/buildutils/checkjava.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/buildutils/checkjava.py Mon Oct 04 11:29:25 2010 +0300 @@ -0,0 +1,75 @@ +# +# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Check Java source code for inconsistencies. Includes following checks +# - is package defined and matching with file path +# +#! /usr/bin/python + +import os, fnmatch, re, sys +from optparse import OptionParser + +RE_PACKAGE = re.compile(r"package\s+([\w.]+)\s*;") + + +def getPackage(f): + ''' Return the package of Java source file, or None if not defined ''' + fin = file(f, "r") + for l in fin.readlines(): + match = RE_PACKAGE.search(l) + if match: + return match.group(1) + + return None + +def checkPackage(f, package): + ''' Check if package is correct in file path. Return True if incorrect. ''' + + if not package: + print "%s(0): error: no package defined" % f + return True + + dir = os.path.dirname(f).replace("\\", "/") + if not dir.endswith(package.replace(".", "/")): + print "%s(0): error: package \"%s\" does not match filepath" % (f, package) + return True + + return False + +def checkHierarchy(root, exclude = None): + failures = False + for path, dirs, files in os.walk(root): + if exclude and exclude in path.replace("\\", "/").split("/"): + continue + + filenames = [os.path.join(path, f) for f in fnmatch.filter(files, "*.java")] + for f in filenames: + result = checkPackage(f, getPackage(f)) + failures = failures or result + + return failures + +def main(): + parser = OptionParser() + parser.add_option("--exclude", dest = "exclude", + help = "Exclude paths having this directory component, e.g. tsrc") + (options, args) = parser.parse_args() + + failures = False + for root in args: + failures = failures or checkHierarchy(root, options.exclude) + + sys.exit(failures and 1 or 0) + +if __name__ == "__main__": + main()