Chromium Code Reviews| Index: build/android/gyp/lint.py |
| diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py |
| index bc761ff364a57cc5e83edf7e0c95f51195c2ea5b..2d3c79bfcb0c3c1aeeb1cb2b8ce697290228d6ee 100755 |
| --- a/build/android/gyp/lint.py |
| +++ b/build/android/gyp/lint.py |
| @@ -7,7 +7,7 @@ |
| """Runs Android's lint tool.""" |
| -import optparse |
| +import argparse |
| import os |
| import sys |
| import traceback |
| @@ -22,7 +22,8 @@ _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), |
| def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| manifest_path, result_path, product_dir, sources, jar_path, |
| - resource_dir=None, can_fail_build=False): |
| + cache_dir, resource_dir=None, can_fail_build=False, |
| + silent=False): |
| def _RelativizePath(path): |
| """Returns relative path to top-level src dir. |
| @@ -33,6 +34,8 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| return os.path.relpath(os.path.abspath(path), _SRC_ROOT) |
| def _ProcessConfigFile(): |
| + if not config_path or not processed_config_path: |
| + return |
| if not build_utils.IsTimeStale(processed_config_path, [config_path]): |
| return |
| @@ -54,23 +57,24 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| def _ParseAndShowResultFile(): |
| dom = minidom.parse(result_path) |
| issues = dom.getElementsByTagName('issue') |
| - print >> sys.stderr |
| - for issue in issues: |
| - issue_id = issue.attributes['id'].value |
| - message = issue.attributes['message'].value |
| - location_elem = issue.getElementsByTagName('location')[0] |
| - path = location_elem.attributes['file'].value |
| - line = location_elem.getAttribute('line') |
| - if line: |
| - error = '%s:%s %s: %s [warning]' % (path, line, message, issue_id) |
| - else: |
| - # Issues in class files don't have a line number. |
| - error = '%s %s: %s [warning]' % (path, message, issue_id) |
| - print >> sys.stderr, error.encode('utf-8') |
| - for attr in ['errorLine1', 'errorLine2']: |
| - error_line = issue.getAttribute(attr) |
| - if error_line: |
| - print >> sys.stderr, error_line.encode('utf-8') |
| + if not silent: |
| + print >> sys.stderr |
| + for issue in issues: |
| + issue_id = issue.attributes['id'].value |
| + message = issue.attributes['message'].value |
| + location_elem = issue.getElementsByTagName('location')[0] |
| + path = location_elem.attributes['file'].value |
| + line = location_elem.getAttribute('line') |
| + if line: |
| + error = '%s:%s %s: %s [warning]' % (path, line, message, issue_id) |
| + else: |
| + # Issues in class files don't have a line number. |
| + error = '%s %s: %s [warning]' % (path, message, issue_id) |
| + print >> sys.stderr, error.encode('utf-8') |
| + for attr in ['errorLine1', 'errorLine2']: |
| + error_line = issue.getAttribute(attr) |
| + if error_line: |
| + print >> sys.stderr, error_line.encode('utf-8') |
| return len(issues) |
| # Need to include all sources when a resource_dir is set so that resources are |
| @@ -84,10 +88,12 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| cmd = [ |
| _RelativizePath(lint_path), '-Werror', '--exitcode', '--showall', |
| - '--config', _RelativizePath(processed_config_path), |
| - '--classpath', _RelativizePath(jar_path), |
| '--xml', _RelativizePath(result_path), |
| ] |
| + if jar_path: |
| + cmd.extend(['--classpath', _RelativizePath(jar_path)]) |
| + if processed_config_path: |
| + cmd.extend(['--config', _RelativizePath(processed_config_path)]) |
| if resource_dir: |
| cmd.extend(['--resources', _RelativizePath(resource_dir)]) |
| @@ -117,13 +123,18 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| src_dir = NewSourceDir() |
| os.symlink(os.path.abspath(src), PathInDir(src_dir, src)) |
| - cmd.append(_RelativizePath(os.path.join(manifest_path, os.pardir))) |
| + if manifest_path: |
| + cmd.append(_RelativizePath(os.path.join(manifest_path, os.pardir))) |
| if os.path.exists(result_path): |
| os.remove(result_path) |
| + env = {} |
| + if cache_dir: |
| + env['_JAVA_OPTIONS'] = '-Duser.home=%s' % _RelativizePath(cache_dir) |
| + |
| try: |
| - build_utils.CheckOutput(cmd, cwd=_SRC_ROOT) |
| + build_utils.CheckOutput(cmd, cwd=_SRC_ROOT, env=env or None) |
|
agrieve
2016/03/19 00:12:53
I'm seeing a message "Picked up _JAVA_OPTIONS: ...
jbudorick
2016/03/19 00:57:42
Interesting, I don't see that in either gyp or gn.
agrieve
2016/03/19 01:02:44
Weird - seems to be a common issue:
http://stackov
|
| except build_utils.CalledProcessError: |
| if can_fail_build: |
| traceback.print_exc() |
| @@ -137,92 +148,129 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path, |
| try: |
| num_issues = _ParseAndShowResultFile() |
| except Exception: # pylint: disable=broad-except |
| - print 'Lint created unparseable xml file...' |
| - print 'File contents:' |
| - with open(result_path) as f: |
| - print f.read() |
| + if not silent: |
| + print 'Lint created unparseable xml file...' |
| + print 'File contents:' |
| + with open(result_path) as f: |
| + print f.read() |
| raise |
| _ProcessResultFile() |
| msg = ('\nLint found %d new issues.\n' |
| - ' - For full explanation refer to %s\n' |
| - ' - Wanna suppress these issues?\n' |
| - ' 1. Read comment in %s\n' |
| - ' 2. Run "python %s %s"\n' % |
| + ' - For full explanation refer to %s\n' % |
| (num_issues, |
| - _RelativizePath(result_path), |
| - _RelativizePath(config_path), |
| - _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android', |
| - 'lint', 'suppress.py')), |
| _RelativizePath(result_path))) |
| - print >> sys.stderr, msg |
| + if config_path: |
| + msg += (' - Wanna suppress these issues?\n' |
| + ' 1. Read comment in %s\n' |
| + ' 2. Run "python %s %s"\n' % |
| + (_RelativizePath(config_path), |
| + _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android', |
| + 'lint', 'suppress.py')), |
| + _RelativizePath(result_path))) |
| + if not silent: |
| + print >> sys.stderr, msg |
| if can_fail_build: |
| raise Exception('Lint failed.') |
| def main(): |
| - parser = optparse.OptionParser() |
| + parser = argparse.ArgumentParser() |
| build_utils.AddDepfileOption(parser) |
| - parser.add_option('--lint-path', help='Path to lint executable.') |
| - parser.add_option('--config-path', help='Path to lint suppressions file.') |
| - parser.add_option('--processed-config-path', |
| - help='Path to processed lint suppressions file.') |
| - parser.add_option('--manifest-path', help='Path to AndroidManifest.xml') |
| - parser.add_option('--result-path', help='Path to XML lint result file.') |
| - parser.add_option('--product-dir', help='Path to product dir.') |
| - parser.add_option('--src-dirs', help='Directories containing java files.') |
| - parser.add_option('--java-files', help='Paths to java files.') |
| - parser.add_option('--jar-path', help='Jar file containing class files.') |
| - parser.add_option('--resource-dir', help='Path to resource dir.') |
| - parser.add_option('--can-fail-build', action='store_true', |
| - help='If set, script will exit with nonzero exit status' |
| - ' if lint errors are present') |
| - parser.add_option('--stamp', help='Path to touch on success.') |
| - parser.add_option('--enable', action='store_true', |
| - help='Run lint instead of just touching stamp.') |
| - |
| - options, _ = parser.parse_args() |
| - |
| - build_utils.CheckOptions( |
| - options, parser, required=['lint_path', 'config_path', |
| - 'processed_config_path', 'manifest_path', |
| - 'result_path', 'product_dir', |
| - 'jar_path']) |
| - |
| - if options.enable: |
| + |
| + parser.add_argument('--lint-path', required=True, |
| + help='Path to lint executable.') |
| + parser.add_argument('--product-dir', required=True, |
| + help='Path to product dir.') |
| + parser.add_argument('--result-path', required=True, |
| + help='Path to XML lint result file.') |
| + |
| + parser.add_argument('--build-tools-version', |
| + help='Version of the build tools in the Android SDK.') |
| + parser.add_argument('--cache-dir', |
| + help='Path to the directory in which the android cache ' |
| + 'directory tree should be stored.') |
| + parser.add_argument('--can-fail-build', action='store_true', |
| + help='If set, script will exit with nonzero exit status' |
| + ' if lint errors are present') |
| + parser.add_argument('--config-path', |
| + help='Path to lint suppressions file.') |
| + parser.add_argument('--enable', action='store_true', |
| + help='Run lint instead of just touching stamp.') |
| + parser.add_argument('--jar-path', |
| + help='Jar file containing class files.') |
| + parser.add_argument('--java-files', |
| + help='Paths to java files.') |
| + parser.add_argument('--manifest-path', |
| + help='Path to AndroidManifest.xml') |
| + parser.add_argument('--platform-xml-path', |
| + help='Path to api-platforms.xml') |
| + parser.add_argument('--processed-config-path', |
| + help='Path to processed lint suppressions file.') |
| + parser.add_argument('--resource-dir', |
| + help='Path to resource dir.') |
| + parser.add_argument('--silent', action='store_true', |
| + help='If set, script will not log anything.') |
| + parser.add_argument('--src-dirs', |
| + help='Directories containing java files.') |
| + parser.add_argument('--stamp', |
| + help='Path to touch on success.') |
| + |
| + args = parser.parse_args() |
| + |
| + if args.enable: |
| sources = [] |
| - if options.src_dirs: |
| - src_dirs = build_utils.ParseGypList(options.src_dirs) |
| + if args.src_dirs: |
| + src_dirs = build_utils.ParseGypList(args.src_dirs) |
| sources = build_utils.FindInDirectories(src_dirs, '*.java') |
| - elif options.java_files: |
| - sources = build_utils.ParseGypList(options.java_files) |
| - else: |
| - print 'One of --src-dirs or --java-files must be specified.' |
| - return 1 |
| + elif args.java_files: |
| + sources = build_utils.ParseGypList(args.java_files) |
| + |
| + if args.config_path and not args.processed_config_path: |
| + parser.error('--config-path specified without --processed-config-path') |
| + elif args.processed_config_path and not args.config_path: |
| + parser.error('--processed-config-path specified without --config-path') |
| input_paths = [ |
| - options.lint_path, |
| - options.config_path, |
| - options.manifest_path, |
| - options.jar_path, |
| + args.lint_path, |
| ] |
| - input_paths.extend(sources) |
| - if options.resource_dir: |
| - input_paths.extend(build_utils.FindInDirectory(options.resource_dir, '*')) |
| - |
| - input_strings = [ options.processed_config_path ] |
| - output_paths = [ options.result_path ] |
| + if args.config_path: |
| + input_paths.append(args.config_path) |
| + if args.jar_path: |
| + input_paths.append(args.jar_path) |
| + if args.manifest_path: |
| + input_paths.append(args.manifest_path) |
| + if args.platform_xml_path: |
| + input_paths.append(args.platform_xml_path) |
| + if args.resource_dir: |
| + input_paths.extend(build_utils.FindInDirectory(args.resource_dir, '*')) |
| + if sources: |
| + input_paths.extend(sources) |
| + |
| + input_strings = [] |
| + if args.processed_config_path: |
| + input_strings.append(args.processed_config_path) |
| + |
| + output_paths = [ args.result_path ] |
| + if args.cache_dir: |
| + if not args.build_tools_version: |
| + parser.error('--cache-dir specified without --build-tools-version') |
| + output_paths.append(os.path.join( |
| + args.cache_dir, '.android', 'cache', |
| + 'api-versions-6-%s.bin' % args.build_tools_version)) |
| build_utils.CallAndWriteDepfileIfStale( |
| - lambda changes: _OnStaleMd5(changes, options.lint_path, |
| - options.config_path, |
| - options.processed_config_path, |
| - options.manifest_path, options.result_path, |
| - options.product_dir, sources, |
| - options.jar_path, |
| - resource_dir=options.resource_dir, |
| - can_fail_build=options.can_fail_build), |
| - options, |
| + lambda changes: _OnStaleMd5(changes, args.lint_path, |
| + args.config_path, |
| + args.processed_config_path, |
| + args.manifest_path, args.result_path, |
| + args.product_dir, sources, |
| + args.jar_path, |
| + args.cache_dir, |
| + resource_dir=args.resource_dir, |
| + can_fail_build=args.can_fail_build, |
| + silent=args.silent), |
| + args, |
| input_paths=input_paths, |
| input_strings=input_strings, |
| output_paths=output_paths, |