| 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)
|
| 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,
|
|
|