From d35a9db6fe439b1efaddffb19cea540b99917d16 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Mon, 20 Mar 2017 17:09:59 -0700 Subject: [PATCH] Avoid downloading artifacts twice (#8872) * Avoid downloading artifacts twice * Don't update cache before `flutter upgrade` is executed (`flutter upgrade` might bump the engine version) * Don't update cache twice during `flutter precache` Fixes #8249. * add test --- .../lib/src/commands/precache.dart | 3 + .../lib/src/commands/upgrade.dart | 3 + .../lib/src/runner/flutter_command.dart | 5 +- .../test/src/runner/flutter_command_test.dart | 63 +++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 packages/flutter_tools/test/src/runner/flutter_command_test.dart diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index c8665c463eb..f2a15abc319 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -19,6 +19,9 @@ class PrecacheCommand extends FlutterCommand { @override final String description = 'Populates the Flutter tool\'s cache of binary artifacts.'; + @override + bool get shouldUpdateCache => false; + @override Future runCommand() async { if (argResults['all-platforms']) diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart index 8b2a76aec34..ca963bcd582 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart @@ -22,6 +22,9 @@ class UpgradeCommand extends FlutterCommand { @override final String description = 'Upgrade your copy of Flutter.'; + @override + bool get shouldUpdateCache => false; + @override Future runCommand() async { try { diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index c1e8104bc52..be46185530d 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -37,6 +37,8 @@ abstract class FlutterCommand extends Command { bool get shouldRunPub => _usesPubOption && argResults['pub']; + bool get shouldUpdateCache => true; + BuildMode _defaultBuildMode; void usesTargetOption() { @@ -134,7 +136,8 @@ abstract class FlutterCommand extends Command { Future verifyThenRunCommand() async { // Populate the cache. We call this before pub get below so that the sky_engine // package is available in the flutter cache for pub to find. - await cache.updateAll(); + if (shouldUpdateCache) + await cache.updateAll(); if (shouldRunPub) await pubGet(); diff --git a/packages/flutter_tools/test/src/runner/flutter_command_test.dart b/packages/flutter_tools/test/src/runner/flutter_command_test.dart new file mode 100644 index 00000000000..8e9e7f97714 --- /dev/null +++ b/packages/flutter_tools/test/src/runner/flutter_command_test.dart @@ -0,0 +1,63 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/runner/flutter_command.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +import '../context.dart'; + +void main() { + + group('Flutter Command', () { + + MockCache cache; + + setUp(() { + cache = new MockCache(); + }); + + testUsingContext('honors shouldUpdateCache false', () async { + final DummyFlutterCommand flutterCommand = new DummyFlutterCommand(shouldUpdateCache: false); + await flutterCommand.run(); + verifyZeroInteractions(cache); + }, + overrides: { + Cache: () => cache, + }); + + testUsingContext('honors shouldUpdateCache true', () async { + final DummyFlutterCommand flutterCommand = new DummyFlutterCommand(shouldUpdateCache: true); + await flutterCommand.run(); + verify(cache.updateAll()).called(1); + }, + overrides: { + Cache: () => cache, + }); + }); +} + +class DummyFlutterCommand extends FlutterCommand { + + DummyFlutterCommand({this.shouldUpdateCache}); + + @override + final bool shouldUpdateCache; + + @override + String get description => 'does nothing'; + + @override + String get name => 'dummy'; + + @override + Future runCommand() async { + // does nothing. + } +} + +class MockCache extends Mock implements Cache {} \ No newline at end of file