Chromium Code Reviews| Index: build/android/findbugs_diff.py |
| diff --git a/build/android/findbugs_diff.py b/build/android/findbugs_diff.py |
| index 28224f1a3871c59dfe53e58c25a7140bc781834d..5a596b9b26b2480a55e79b4dfb30ce6a9fd1aabf 100755 |
| --- a/build/android/findbugs_diff.py |
| +++ b/build/android/findbugs_diff.py |
| @@ -5,14 +5,6 @@ |
| # found in the LICENSE file. |
| """Runs findbugs, and returns an error code if there are new warnings. |
| -This runs findbugs with an additional flag to exclude known bugs. |
| -To update the list of known bugs, do this: |
| - |
| - findbugs_diff.py --rebaseline |
| - |
| -Note that this is separate from findbugs_exclude.xml. The "exclude" file has |
| -false positives that we do not plan to fix. The "known bugs" file has real |
| -bugs that we *do* plan to fix (but haven't done so yet). |
| Other options |
| --only-analyze used to only analyze the class you are interested. |
| @@ -20,30 +12,116 @@ Other options |
| --findbugs-args used to passin other findbugs's options. |
| Run |
| - $CHROM_SRC/third_party/findbugs/bin/findbugs -textui for details. |
| + $CHROMIUM_SRC/third_party/findbugs/bin/findbugs -textui for details. |
| """ |
| +import argparse |
| +import logging |
| import os |
| import sys |
| from pylib import constants |
| from pylib.utils import findbugs |
| +_DEFAULT_BASE_DIR = os.path.join( |
| + constants.DIR_SOURCE_ROOT, 'build', 'android', 'findbugs_filter') |
| + |
| +sys.path.append( |
| + os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'android', 'gyp')) |
| +from util import build_utils |
| + |
| + |
| +# TODO(jbudorick): Delete this once it's no longer used to support clients |
| +# who aren't explicitly passing jars. |
| +def DEPRECATED_GetChromeJars(release): |
| + path = os.path.join( |
| + constants.DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUT_DIR', 'out'), |
| + 'Release' if release else 'Debug', 'lib.java') |
| + jars = [] |
| + for dir_path, _, filenames in os.walk(path): |
| + jars.extend(os.path.join(dir_path, f) for f in filenames |
| + if f.endswith('.jar') and not f.endswith('.dex.jar')) |
| + return jars |
| + |
| def main(): |
| - parser = findbugs.GetCommonParser() |
| + parser = argparse.ArgumentParser() |
| - options, _ = parser.parse_args() |
| + parser.add_argument( |
| + '-r', '--rebaseline', action='store_true', dest='rebaseline', |
| + help='DEPRECATED') |
| + parser.add_argument( |
| + '-a', '--auxclasspath', action='store', default=None, dest='auxclasspath', |
| + help='Set aux classpath for analysis.') |
| + parser.add_argument( |
| + '--auxclasspath-gyp', dest='auxclasspath_gyp', |
| + help='A gyp list containing the aux classpath for analysis') |
| + parser.add_argument( |
| + '-o', '--only-analyze', action='store', default='org.chromium.-', |
| + dest='only_analyze', help='Only analyze the given classes and packages.') |
| + parser.add_argument( |
| + '-e', '--exclude', action='store', default=None, dest='exclude', |
| + help='Exclude bugs matching given filter.') |
| + parser.add_argument( |
| + '-k', '--known-bugs', action='store', default=None, dest='known_bugs', |
| + help='DEPRECATED') |
| + parser.add_argument( |
| + '-l', '--release-build', action='store_true', dest='release_build', |
| + help='Analyze release build instead of debug.') |
| + parser.add_argument( |
| + '-f', '--findbug-args', action='store', default=None, dest='findbug_args', |
| + help='Additional findbug arguments.') |
| + parser.add_argument( |
| + '-b', '--base-dir', action='store', default=_DEFAULT_BASE_DIR, |
| + dest='base_dir', help='Base directory for configuration file.') |
| + parser.add_argument( |
| + '--output-file', action='store', dest='output_file', |
| + help='Path to save the output to.') |
| + parser.add_argument('--stamp') |
|
cjhopman
2015/03/12 19:22:43
This should also have a depfile argument.
The dep
|
| - if not options.base_dir: |
| - options.base_dir = os.path.join(constants.DIR_SOURCE_ROOT, 'build', |
| - 'android', 'findbugs_filter') |
| - if not options.only_analyze: |
| - options.only_analyze = 'org.chromium.-' |
| + # TODO(jbudorick): Switch this to nargs='+' once all clients explicitly pass |
| + # the jars they want to run against. |
| + parser.add_argument( |
| + 'jar_paths', metavar='JAR_PATH', nargs='*', |
| + help='JAR file to analyze') |
| - return findbugs.Run(options) |
| + args = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) |
| + if args.auxclasspath: |
| + args.auxclasspath = args.auxclasspath.split(':') |
| + elif args.auxclasspath_gyp: |
| + args.auxclasspath = build_utils.ParseGypList(args.auxclasspath_gyp) |
| + |
| + # TODO(jbudorick): Remove this once all clients explicitly pass the jars |
| + # they want to run against. |
| + if not args.jar_paths: |
| + args.jar_paths = DEPRECATED_GetChromeJars(args.release_build) |
| + |
| + if args.base_dir: |
| + if not args.exclude: |
| + args.exclude = os.path.join(args.base_dir, 'findbugs_exclude.xml') |
| + |
| + findbugs_command, findbugs_warnings = findbugs.Run( |
| + args.exclude, args.only_analyze, args.auxclasspath, |
| + args.output_file, args.findbug_args, args.jar_paths) |
| + |
| + if findbugs_warnings: |
| + print '*' * 80 |
| + print 'FindBugs run via:' |
| + print findbugs_command |
| + print 'FindBugs reported the following issues:' |
| + for warning in sorted(findbugs_warnings): |
| + print ' %s' % warning |
| + print '*' * 80 |
| + elif args.stamp: |
| + build_utils.Touch(args.stamp) |
| + |
| + return len(findbugs_warnings) |
| if __name__ == '__main__': |
| sys.exit(main()) |
| + |