throw more specific toolexit when git fails during upgrade (#57162)

This commit is contained in:
Christopher Fujino 2020-05-14 11:03:07 -07:00 committed by GitHub
parent 7706a97aba
commit a2f5364dc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 72 additions and 7 deletions

View File

@ -219,12 +219,23 @@ class UpgradeCommandRunner {
workingDirectory: workingDirectory,
);
revision = result.stdout.trim();
} on Exception {
} on Exception catch (e) {
final String errorString = e.toString();
if (errorString.contains('fatal: HEAD does not point to a branch')) {
throwToolExit(
'You are not currently on a release branch. Use git to '
'check out an official branch (\'stable\', \'beta\', \'dev\', or \'master\') '
'and retry, for example:\n'
' git checkout stable'
);
} else if (errorString.contains('fatal: no upstream configured for branch')) {
throwToolExit(
'Unable to upgrade Flutter: no origin repository configured. '
"Run 'git remote add origin "
"https://github.com/flutter/flutter' in $workingDirectory",
);
'Run \'git remote add origin '
'https://github.com/flutter/flutter\' in $workingDirectory');
} else {
throwToolExit(errorString);
}
}
return revision;
}

View File

@ -160,7 +160,7 @@ void main() {
Platform: () => fakePlatform,
});
testUsingContext('fetchRemoteRevision', () async {
testUsingContext('fetchRemoteRevision returns revision if git succeeds', () async {
const String revision = 'abc123';
when(processManager.run(
<String>['git', 'fetch', '--tags'],
@ -185,6 +185,60 @@ void main() {
Platform: () => fakePlatform,
});
testUsingContext('fetchRemoteRevision throws toolExit if HEAD is detached', () async {
when(processManager.run(
<String>['git', 'fetch', '--tags'],
environment:anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')),
).thenAnswer((Invocation invocation) async {
return FakeProcessResult()..exitCode = 0;
});
when(processManager.run(
<String>['git', 'rev-parse', '--verify', '@{u}'],
environment:anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')),
).thenThrow(const ProcessException(
'git',
<String>['rev-parse', '--verify', '@{u}'],
'fatal: HEAD does not point to a branch',
));
expect(
() async => await realCommandRunner.fetchRemoteRevision(),
throwsToolExit(message: 'You are not currently on a release branch.'),
);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
Platform: () => fakePlatform,
});
testUsingContext('fetchRemoteRevision throws toolExit if no upstream configured', () async {
when(processManager.run(
<String>['git', 'fetch', '--tags'],
environment:anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')),
).thenAnswer((Invocation invocation) async {
return FakeProcessResult()..exitCode = 0;
});
when(processManager.run(
<String>['git', 'rev-parse', '--verify', '@{u}'],
environment:anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')),
).thenThrow(const ProcessException(
'git',
<String>['rev-parse', '--verify', '@{u}'],
'fatal: no upstream configured for branch',
));
expect(
() async => await realCommandRunner.fetchRemoteRevision(),
throwsToolExit(
message: 'Unable to upgrade Flutter: no origin repository configured\.',
),
);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
Platform: () => fakePlatform,
});
testUsingContext('git exception during attemptReset throwsToolExit', () async {
const String revision = 'abc123';
const String errorMessage = 'fatal: Could not parse object ´$revision´';