From ac7b307803fc3dfdd142fd4791192adc2fdb26f2 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 20 Jan 2020 23:23:02 -0800 Subject: [PATCH] Don't pre-cache Android artifacts with --no-android flag (#49009) --- .../lib/src/commands/precache.dart | 49 +++++++++++++++++-- .../hermetic/precache_test.dart | 17 +++++-- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index a288bdff55..a8409c373c 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import '../base/common.dart'; import '../cache.dart'; import '../features.dart'; import '../globals.dart' as globals; @@ -57,6 +58,31 @@ class PrecacheCommand extends FlutterCommand { @override bool get shouldUpdateCache => false; + /// Some flags are umbrella names that expand to include multiple artifacts. + static const Map> _expandedArtifacts = >{ + 'android': [ + 'android_gen_snapshot', + 'android_maven', + 'android_internal_build', + ] + }; + + @override + Future validateCommand() { + _expandedArtifacts.forEach((String umbrellaName, List childArtifactNames) { + if (!argResults.arguments.contains('--no-$umbrellaName')) { + return; + } + for (final String childArtifactName in childArtifactNames) { + if (argResults.arguments.contains('--$childArtifactName')) { + throwToolExit('--$childArtifactName requires --$umbrellaName'); + } + } + }); + + return super.validateCommand(); + } + @override Future runCommand() async { if (boolArg('all-platforms')) { @@ -74,11 +100,26 @@ class PrecacheCommand extends FlutterCommand { if (artifact.feature != null && !featureFlags.isEnabled(artifact.feature)) { continue; } - if (boolArg(artifact.name)) { + + bool expandedArtifactProcessed = false; + _expandedArtifacts.forEach((String umbrellaName, List childArtifactNames) { + if (!childArtifactNames.contains(artifact.name)) { + return; + } + expandedArtifactProcessed = true; + + // Expanded artifacts options are true by default. + // Explicitly ignore them if umbrella name is excluded. + // Example: --no-android [--android_gen_snapshot] + if (!boolArg(umbrellaName)) { + return; + } + + // Example: --android [--android_gen_snapshot] requiredArtifacts.add(artifact); - } - // The `android` flag expands to android_gen_snapshot, android_maven, android_internal_build. - if (artifact.name.startsWith('android_') && boolArg('android')) { + }); + + if (!expandedArtifactProcessed && boolArg(artifact.name)) { requiredArtifacts.add(artifact); } } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/precache_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/precache_test.dart index d8bc857cc4..4eea7facde 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/precache_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/precache_test.dart @@ -44,8 +44,6 @@ void main() { expect(artifacts, unorderedEquals({ DevelopmentArtifact.universal, DevelopmentArtifact.web, - DevelopmentArtifact.androidGenSnapshot, - DevelopmentArtifact.androidMaven, })); }, overrides: { Cache: () => cache, @@ -59,14 +57,25 @@ void main() { expect(artifacts, unorderedEquals({ DevelopmentArtifact.universal, - DevelopmentArtifact.androidGenSnapshot, - DevelopmentArtifact.androidMaven, })); }, overrides: { Cache: () => cache, FeatureFlags: () => TestFeatureFlags(isWebEnabled: false), }); + testUsingContext('precache exits if requesting mismatched artifacts.', () async { + final PrecacheCommand command = PrecacheCommand(); + applyMocksToCommand(command); + + expect(createTestCommandRunner(command).run(const ['precache', + '--no-android', + '--android_gen_snapshot', + ]), throwsToolExit(message: '--android_gen_snapshot requires --android')); + }, overrides: { + Cache: () => cache, + FeatureFlags: () => TestFeatureFlags(isWebEnabled: false), + }); + testUsingContext('precache adds artifact flags to requested artifacts', () async { final PrecacheCommand command = PrecacheCommand(); applyMocksToCommand(command);