[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, '', '');
   }