diff --git a/.cirrus.yml b/.cirrus.yml index e4cafa6434f1a..bfe6d0816b9fb 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -38,6 +38,10 @@ task: ninja -C out/host_release test_host_script: cd $ENGINE_PATH/src && ./flutter/testing/run_tests.sh host_release - name: build_android + lint_host_script: | + cd $ENGINE_PATH/src/flutter/tools/android_lint + $ENGINE_PATH/src/third_party/dart/tools/sdks/dart-sdk/bin/pub get + $ENGINE_PATH/src/third_party/dart/tools/sdks/dart-sdk/bin/dart bin/main.dart compile_host_script: | cd $ENGINE_PATH/src ./flutter/tools/gn --android --unoptimized diff --git a/tools/android_lint/baseline.xml b/tools/android_lint/baseline.xml new file mode 100644 index 0000000000000..2a81ee20380c5 --- /dev/null +++ b/tools/android_lint/baseline.xml @@ -0,0 +1,939 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/android_lint/bin/main.dart b/tools/android_lint/bin/main.dart index 4254fd2d20124..c96de9afc2226 100644 --- a/tools/android_lint/bin/main.dart +++ b/tools/android_lint/bin/main.dart @@ -57,7 +57,15 @@ Future runLint(ArgParser argParser, ArgResults argResults) async { return -1; } - final IOSink projectXml = File('./project.xml').openWrite(); + if (argResults['rebaseline']) { + print('Removing previous baseline.xml...'); + final File baselineXml = File(baselineXmlPath); + if (baselineXml.existsSync()) { + await baselineXml.delete(); + } + } + print('Preparing projext.xml...'); + final IOSink projectXml = File(projectXmlPath).openWrite(); projectXml.write( ''' @@ -79,57 +87,67 @@ Future runLint(ArgParser argParser, ArgResults argResults) async { await projectXml.close(); print('Wrote project.xml, starting lint...'); - final ProcessResult result = await processManager.run( + final Process lintProcess = await processManager.start( [ path.join(androidSdkDir.path, 'tools', 'bin', 'lint'), '--project', - './project.xml', + projectXmlPath, '--html', argResults['out'], '--showall', '--exitcode', // Set non-zero exit code on errors '-Wall', '-Werror', + '--baseline', + baselineXmlPath, ], ); - if (result.stderr != null) { - print('Lint tool had internal errors:'); - print(result.stderr); - } - print(result.stdout); - return result.exitCode; + lintProcess.stdout.pipe(stdout); + lintProcess.stderr.pipe(stderr); + return await lintProcess.exitCode; } +/// Prepares an [ArgParser] for this script. ArgParser setupOptions() { final ArgParser argParser = ArgParser(); - argParser.addOption( - 'in', - help: 'The path to `engine/src`.', - defaultsTo: path.relative( - path.join( - path.dirname( - path.dirname(path.dirname(path.fromUri(Platform.script))), + argParser + ..addOption( + 'in', + help: 'The path to `engine/src`.', + defaultsTo: path.relative( + path.join( + projectDir, + '..', + '..', + '..', ), - '..', - '..', ), - ), - ); - argParser.addOption( - 'out', - help: 'The path to write the generated the HTML report to.', - defaultsTo: 'lint_report', - ); - argParser.addFlag( - 'help', - help: 'Print usage of the command.', - negatable: false, - defaultsTo: false, - ); + ) + ..addOption( + 'out', + help: 'The path to write the generated the HTML report to.', + defaultsTo: path.join(projectDir, 'lint_report'), + ) + ..addFlag( + 'help', + help: 'Print usage of the command.', + negatable: false, + defaultsTo: false, + ) + ..addFlag( + 'rebaseline', + help: 'Recalculates the baseline for errors and warnings ' + 'in this project.', + negatable: false, + defaultsTo: false, + ); return argParser; } +/// Checks that `java` points to Java 1.8. +/// +/// The SDK lint tool may not work with Java > 1.8. Future checkJava1_8() async { print('Checking Java version...'); final ProcessResult javaResult = await processManager.run( @@ -146,3 +164,18 @@ Future checkJava1_8() async { 'If this process fails, please retry using Java 1.8.'); } } + +/// The root directory of this project. +String get projectDir => path.dirname( + path.dirname( + path.fromUri(Platform.script), + ), + ); + +/// The path to use for project.xml, which tells the linter where to find source +/// files. +String get projectXmlPath => path.join(projectDir, 'project.xml'); + +/// The path to use for baseline.xml, which tells the linter what errors or +/// warnings to ignore. +String get baselineXmlPath => path.join(projectDir, 'baseline.xml');