Skip to content

Commit 0d95243

Browse files
[flutter_tools] Precache after channel switch (#118129)
Fixes flutter/flutter#44118
1 parent 574a718 commit 0d95243

6 files changed

Lines changed: 83 additions & 47 deletions

File tree

packages/flutter_tools/lib/src/commands/channel.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import '../runner/flutter_command.dart';
99
import '../runner/flutter_command_runner.dart';
1010
import '../version.dart';
1111

12+
import 'upgrade.dart' show precacheArtifacts;
13+
1214
class ChannelCommand extends FlutterCommand {
1315
ChannelCommand({ bool verboseHelp = false }) {
1416
argParser.addFlag(
@@ -17,6 +19,12 @@ class ChannelCommand extends FlutterCommand {
1719
help: 'Include all the available branches (including local branches) when listing channels.',
1820
hide: !verboseHelp,
1921
);
22+
argParser.addFlag(
23+
'cache-artifacts',
24+
help: 'After switching channels, download all required binary artifacts. '
25+
'This is the equivalent of running "flutter precache" with the "--all-platforms" flag.',
26+
defaultsTo: true,
27+
);
2028
}
2129

2230
@override
@@ -134,6 +142,9 @@ class ChannelCommand extends FlutterCommand {
134142
globals.printStatus('This is not an official channel. For a list of available channels, try "flutter channel".');
135143
}
136144
await _checkout(branchName);
145+
if (boolArg('cache-artifacts')) {
146+
await precacheArtifacts(Cache.flutterRoot);
147+
}
137148
globals.printStatus("Successfully switched to flutter channel '$branchName'.");
138149
globals.printStatus("To ensure that you're on the latest build from this channel, run 'flutter upgrade'");
139150
}

packages/flutter_tools/lib/src/commands/precache.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ class PrecacheCommand extends FlutterCommand {
2222
_platform = platform,
2323
_logger = logger,
2424
_featureFlags = featureFlags {
25-
argParser.addFlag('all-platforms', abbr: 'a', negatable: false,
26-
help: 'Precache artifacts for all host platforms.');
25+
argParser.addFlag('all-platforms',
26+
abbr: 'a',
27+
negatable: false,
28+
help: 'Precache artifacts for all host platforms.',
29+
aliases: const <String>['all']);
2730
argParser.addFlag('force', abbr: 'f', negatable: false,
2831
help: 'Force re-downloading of artifacts.');
2932
argParser.addFlag('android',

packages/flutter_tools/lib/src/commands/upgrade.dart

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ class UpgradeCommand extends FlutterCommand {
8888

8989
@visibleForTesting
9090
class UpgradeCommandRunner {
91-
9291
String? workingDirectory; // set in runCommand() above
9392

9493
Future<FlutterCommandResult> runCommand({
@@ -205,7 +204,7 @@ class UpgradeCommandRunner {
205204
// Make sure the welcome message re-display is delayed until the end.
206205
final PersistentToolState persistentToolState = globals.persistentToolState!;
207206
persistentToolState.setShouldRedisplayWelcomeMessage(false);
208-
await precacheArtifacts();
207+
await precacheArtifacts(workingDirectory);
209208
await updatePackages(flutterVersion);
210209
await runDoctor();
211210
// Force the welcome message to re-display following the upgrade.
@@ -318,27 +317,6 @@ class UpgradeCommandRunner {
318317
}
319318
}
320319

321-
/// Update the engine repository and precache all artifacts.
322-
///
323-
/// Check for and download any engine and pkg/ updates. We run the 'flutter'
324-
/// shell script reentrantly here so that it will download the updated
325-
/// Dart and so forth if necessary.
326-
Future<void> precacheArtifacts() async {
327-
globals.printStatus('');
328-
globals.printStatus('Upgrading engine...');
329-
final int code = await globals.processUtils.stream(
330-
<String>[
331-
globals.fs.path.join('bin', 'flutter'), '--no-color', '--no-version-check', 'precache',
332-
],
333-
workingDirectory: workingDirectory,
334-
allowReentrantFlutter: true,
335-
environment: Map<String, String>.of(globals.platform.environment),
336-
);
337-
if (code != 0) {
338-
throwToolExit(null, exitCode: code);
339-
}
340-
}
341-
342320
/// Update the user's packages.
343321
Future<void> updatePackages(FlutterVersion flutterVersion) async {
344322
globals.printStatus('');
@@ -367,3 +345,24 @@ class UpgradeCommandRunner {
367345
);
368346
}
369347
}
348+
349+
/// Update the engine repository and precache all artifacts.
350+
///
351+
/// Check for and download any engine and pkg/ updates. We run the 'flutter'
352+
/// shell script reentrantly here so that it will download the updated
353+
/// Dart and so forth if necessary.
354+
Future<void> precacheArtifacts([String? workingDirectory]) async {
355+
globals.printStatus('');
356+
globals.printStatus('Upgrading engine...');
357+
final int code = await globals.processUtils.stream(
358+
<String>[
359+
globals.fs.path.join('bin', 'flutter'), '--no-color', '--no-version-check', 'precache',
360+
],
361+
allowReentrantFlutter: true,
362+
environment: Map<String, String>.of(globals.platform.environment),
363+
workingDirectory: workingDirectory,
364+
);
365+
if (code != 0) {
366+
throwToolExit(null, exitCode: code);
367+
}
368+
}

packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'package:file/memory.dart';
56
import 'package:flutter_tools/src/base/file_system.dart';
67
import 'package:flutter_tools/src/base/io.dart';
78
import 'package:flutter_tools/src/base/platform.dart';
@@ -327,7 +328,7 @@ void main() {
327328
environment: <String, String>{'FLUTTER_ALREADY_LOCKED': 'true', ...fakePlatform.environment}
328329
),
329330
);
330-
await realCommandRunner.precacheArtifacts();
331+
await precacheArtifacts();
331332
expect(processManager, hasNoRemainingExpectations);
332333
}, overrides: <Type, Generator>{
333334
ProcessManager: () => processManager,
@@ -408,6 +409,7 @@ void main() {
408409
late FakeProcessManager fakeProcessManager;
409410
late Directory tempDir;
410411
late File flutterToolState;
412+
late FileSystem fs;
411413

412414
setUp(() {
413415
Cache.disableLocking();
@@ -424,7 +426,8 @@ void main() {
424426
stdout: 'v1.12.16-19-gb45b676af',
425427
),
426428
]);
427-
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
429+
fs = MemoryFileSystem.test();
430+
tempDir = fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
428431
flutterToolState = tempDir.childFile('.flutter_tool_state');
429432
});
430433

@@ -434,6 +437,7 @@ void main() {
434437
});
435438

436439
testUsingContext('upgrade continue prints welcome message', () async {
440+
fakeProcessManager = FakeProcessManager.any();
437441
final UpgradeCommand upgradeCommand = UpgradeCommand(
438442
verboseHelp: false,
439443
commandRunner: fakeCommandRunner,
@@ -451,6 +455,7 @@ void main() {
451455
containsPair('redisplay-welcome-message', true),
452456
);
453457
}, overrides: <Type, Generator>{
458+
FileSystem: () => fs,
454459
FlutterVersion: () => FakeFlutterVersion(),
455460
ProcessManager: () => fakeProcessManager,
456461
PersistentToolState: () => PersistentToolState.test(
@@ -479,9 +484,6 @@ class FakeUpgradeCommandRunner extends UpgradeCommandRunner {
479484
@override
480485
Future<void> attemptReset(String newRevision) async {}
481486

482-
@override
483-
Future<void> precacheArtifacts() async {}
484-
485487
@override
486488
Future<void> updatePackages(FlutterVersion flutterVersion) async {}
487489

packages/flutter_tools/test/general.shard/args_test.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:args/args.dart';
66
import 'package:args/command_runner.dart';
77
import 'package:flutter_tools/executable.dart' as executable;
8+
import 'package:flutter_tools/src/cache.dart';
89
import 'package:flutter_tools/src/commands/analyze.dart';
910
import 'package:flutter_tools/src/runner/flutter_command.dart';
1011
import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
@@ -15,6 +16,14 @@ import '../src/testbed.dart';
1516
import 'runner/utils.dart';
1617

1718
void main() {
19+
setUpAll(() {
20+
Cache.disableLocking();
21+
});
22+
23+
tearDownAll(() {
24+
Cache.enableLocking();
25+
});
26+
1827
test('Help for command line arguments is consistently styled and complete', () => Testbed().run(() {
1928
final FlutterCommandRunner runner = FlutterCommandRunner(verboseHelp: true);
2029
executable.generateCommands(

packages/flutter_tools/test/general.shard/channel_test.dart

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,18 @@ void main() {
242242
});
243243

244244
testUsingContext('can switch channels', () async {
245-
fakeProcessManager.addCommands(<FakeCommand>[
246-
const FakeCommand(
245+
fakeProcessManager.addCommands(const <FakeCommand>[
246+
FakeCommand(
247247
command: <String>['git', 'fetch'],
248248
),
249-
const FakeCommand(
249+
FakeCommand(
250250
command: <String>['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'],
251251
),
252-
const FakeCommand(
253-
command: <String>['git', 'checkout', 'beta', '--']
252+
FakeCommand(
253+
command: <String>['git', 'checkout', 'beta', '--']
254+
),
255+
FakeCommand(
256+
command: <String>['bin/flutter', '--no-color', '--no-version-check', 'precache'],
254257
),
255258
]);
256259

@@ -265,16 +268,19 @@ void main() {
265268
);
266269
expect(testLogger.errorText, hasLength(0));
267270

268-
fakeProcessManager.addCommands(<FakeCommand>[
269-
const FakeCommand(
271+
fakeProcessManager.addCommands(const <FakeCommand>[
272+
FakeCommand(
270273
command: <String>['git', 'fetch'],
271274
),
272-
const FakeCommand(
275+
FakeCommand(
273276
command: <String>['git', 'show-ref', '--verify', '--quiet', 'refs/heads/stable'],
274277
),
275-
const FakeCommand(
278+
FakeCommand(
276279
command: <String>['git', 'checkout', 'stable', '--']
277280
),
281+
FakeCommand(
282+
command: <String>['bin/flutter', '--no-color', '--no-version-check', 'precache'],
283+
),
278284
]);
279285

280286
await runner.run(<String>['channel', 'stable']);
@@ -286,16 +292,19 @@ void main() {
286292
});
287293

288294
testUsingContext('switching channels prompts to run flutter upgrade', () async {
289-
fakeProcessManager.addCommands(<FakeCommand>[
290-
const FakeCommand(
295+
fakeProcessManager.addCommands(const <FakeCommand>[
296+
FakeCommand(
291297
command: <String>['git', 'fetch'],
292298
),
293-
const FakeCommand(
299+
FakeCommand(
294300
command: <String>['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'],
295301
),
296-
const FakeCommand(
302+
FakeCommand(
297303
command: <String>['git', 'checkout', 'beta', '--']
298304
),
305+
FakeCommand(
306+
command: <String>['bin/flutter', '--no-color', '--no-version-check', 'precache'],
307+
),
299308
]);
300309

301310
final ChannelCommand command = ChannelCommand();
@@ -322,16 +331,19 @@ void main() {
322331
// This verifies that bug https://github.com/flutter/flutter/issues/21134
323332
// doesn't return.
324333
testUsingContext('removes version stamp file when switching channels', () async {
325-
fakeProcessManager.addCommands(<FakeCommand>[
326-
const FakeCommand(
334+
fakeProcessManager.addCommands(const <FakeCommand>[
335+
FakeCommand(
327336
command: <String>['git', 'fetch'],
328337
),
329-
const FakeCommand(
338+
FakeCommand(
330339
command: <String>['git', 'show-ref', '--verify', '--quiet', 'refs/heads/beta'],
331340
),
332-
const FakeCommand(
341+
FakeCommand(
333342
command: <String>['git', 'checkout', 'beta', '--']
334343
),
344+
FakeCommand(
345+
command: <String>['bin/flutter', '--no-color', '--no-version-check', 'precache'],
346+
),
335347
]);
336348

337349
final File versionCheckFile = globals.cache.getStampFileFor(

0 commit comments

Comments
 (0)