[flutter_tool] Crash less when git fails during 'version' (#45628)
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
index 45a7025..d9bf1e0 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
@@ -10,7 +10,6 @@
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/version.dart';
-import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/version.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
@@ -27,60 +26,95 @@
testUsingContext('version ls', () async {
final VersionCommand command = VersionCommand();
- await createTestCommandRunner(command).run(<String>['version']);
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ ]);
expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\n' ''));
}, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(),
- Pub: () => const Pub(),
});
testUsingContext('version switch', () async {
const String version = '10.0.0';
final VersionCommand command = VersionCommand();
- final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
- await Future.wait<void>(<Future<void>>[runCommand]);
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ version,
+ ]);
expect(testLogger.statusText, contains('Switching Flutter to version $version'));
}, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(),
- Pub: () => const Pub(),
+ });
+
+ testUsingContext('version switch, latest commit query fails', () async {
+ const String version = '10.0.0';
+ final VersionCommand command = VersionCommand();
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ version,
+ ]);
+ expect(testLogger.errorText, contains('git failed'));
+ }, overrides: <Type, Generator>{
+ ProcessManager: () => MockProcessManager(latestCommitFails: true),
+ });
+
+ testUsingContext('latest commit is parsable when query fails', () {
+ final FlutterVersion flutterVersion = FlutterVersion();
+ expect(
+ () => DateTime.parse(flutterVersion.frameworkCommitDate),
+ returnsNormally,
+ );
+ }, overrides: <Type, Generator>{
+ ProcessManager: () => MockProcessManager(latestCommitFails: true),
});
testUsingContext('switch to not supported version without force', () async {
const String version = '1.1.5';
final VersionCommand command = VersionCommand();
- final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
- await Future.wait<void>(<Future<void>>[runCommand]);
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ version,
+ ]);
expect(testLogger.errorText, contains('Version command is not supported in'));
}, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(),
- Pub: () => const Pub(),
});
testUsingContext('switch to not supported version with force', () async {
const String version = '1.1.5';
final VersionCommand command = VersionCommand();
- final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', '--force', version]);
- await Future.wait<void>(<Future<void>>[runCommand]);
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ '--force',
+ version,
+ ]);
expect(testLogger.statusText, contains('Switching Flutter to version $version with force'));
}, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(),
- Pub: () => const Pub(),
});
testUsingContext('tool exit on confusing version', () async {
const String version = 'master';
final VersionCommand command = VersionCommand();
- final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
- expect(() async => await Future.wait<void>(<Future<void>>[runCommand]),
- throwsA(isInstanceOf<ToolExit>()));
+ expect(() async =>
+ await createTestCommandRunner(command).run(<String>[
+ 'version',
+ '--no-pub',
+ version,
+ ]),
+ throwsA(isInstanceOf<ToolExit>()),
+ );
}, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(),
- Pub: () => const Pub(),
});
testUsingContext('exit tool if can\'t get the tags', () async {
final VersionCommand command = VersionCommand();
-
try {
await command.getTags();
fail('ToolExit expected');
@@ -94,11 +128,15 @@
}
class MockProcessManager extends Mock implements ProcessManager {
- MockProcessManager({ this.failGitTag = false });
+ MockProcessManager({
+ this.failGitTag = false,
+ this.latestCommitFails = false,
+ });
String version = '';
- bool failGitTag;
+ final bool failGitTag;
+ final bool latestCommitFails;
@override
Future<ProcessResult> run(
@@ -142,6 +180,14 @@
return ProcessResult(0, 0, '$version-0-g00000000', '');
}
}
+ final List<String> commitDateCommand = <String>[
+ '-n', '1',
+ '--pretty=format:%ad',
+ '--date=iso',
+ ];
+ if (latestCommitFails && commandStr == FlutterVersion.gitLog(commitDateCommand).join(' ')) {
+ return ProcessResult(0, -9, '', 'git failed');
+ }
return ProcessResult(0, 0, '', '');
}