Do not run version check if generating shell completion and stdout isn't terminal (#79418)

This commit is contained in:
Dave Shifflett 2021-04-01 22:19:03 -05:00 committed by GitHub
parent d44ab58d69
commit d56717399b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 2 deletions

View file

@ -253,11 +253,14 @@ class FlutterCommandRunner extends CommandRunner<void> {
globals.flutterVersion.ensureVersionFile();
final bool machineFlag = topLevelResults['machine'] as bool;
final bool ci = await globals.botDetector.isRunningOnBot;
final bool redirectedCompletion = !globals.stdio.hasTerminal &&
(topLevelResults.command?.name ?? '').endsWith('-completion');
final bool isMachine = machineFlag || ci || redirectedCompletion;
final bool versionCheckFlag = topLevelResults['version-check'] as bool;
final bool explicitVersionCheckPassed = topLevelResults.wasParsed('version-check') && versionCheckFlag;
if (topLevelResults.command?.name != 'upgrade' &&
(explicitVersionCheckPassed || (versionCheckFlag && !ci && !machineFlag))) {
(explicitVersionCheckPassed || (versionCheckFlag && !isMachine))) {
await globals.flutterVersion.checkFlutterVersionFreshness();
}

View file

@ -108,6 +108,40 @@ void main() {
BotDetector: () => const FakeBotDetector(true),
}, initializeFlutterRoot: false);
testUsingContext('checks that Flutter installation is up-to-date if shell completion to terminal', () async {
final FlutterCommand command = DummyFlutterCommand(name: 'bash-completion');
final FlutterCommandRunner runner = createTestCommandRunner(command) as FlutterCommandRunner;
final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion;
await runner.run(<String>['bash-completion']);
expect(version.didCheckFlutterVersionFreshness, true);
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
Platform: () => platform,
FlutterVersion: () => FakeFlutterVersion(),
BotDetector: () => const FakeBotDetector(false),
Stdio: () => FakeStdio(hasFakeTerminal: true),
});
testUsingContext('does not check that Flutter installation is up-to-date if redirecting shell completion', () async {
final FlutterCommand command = DummyFlutterCommand(name: 'bash-completion');
final FlutterCommandRunner runner = createTestCommandRunner(command) as FlutterCommandRunner;
final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion;
await runner.run(<String>['bash-completion']);
expect(version.didCheckFlutterVersionFreshness, false);
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
Platform: () => platform,
FlutterVersion: () => FakeFlutterVersion(),
BotDetector: () => const FakeBotDetector(false),
Stdio: () => FakeStdio(hasFakeTerminal: false),
});
testUsingContext('Fetches tags when --version is used', () async {
final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner;
final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion;

View file

@ -13,6 +13,7 @@ class DummyFlutterCommand extends FlutterCommand {
DummyFlutterCommand({
this.shouldUpdateCache = false,
this.noUsagePath = false,
this.name = 'dummy',
this.commandFunction,
});
@ -29,7 +30,7 @@ class DummyFlutterCommand extends FlutterCommand {
Future<String> get usagePath => noUsagePath ? null : super.usagePath;
@override
String get name => 'dummy';
final String name;
@override
Future<FlutterCommandResult> runCommand() async {