Unverified Commit f6db8ccd authored by Peter Lauri's avatar Peter Lauri Committed by GitHub

[flutter_tools] fix version tag `v` stripping and support old "dev" and new "pre" tags (#55602)

parent 6dc1e83f
...@@ -13,7 +13,6 @@ import '../cache.dart'; ...@@ -13,7 +13,6 @@ import '../cache.dart';
import '../dart/pub.dart'; import '../dart/pub.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
import '../runner/flutter_command.dart'; import '../runner/flutter_command.dart';
import '../version.dart';
class VersionCommand extends FlutterCommand { class VersionCommand extends FlutterCommand {
VersionCommand() : super() { VersionCommand() : super() {
...@@ -87,7 +86,7 @@ class VersionCommand extends FlutterCommand { ...@@ -87,7 +86,7 @@ class VersionCommand extends FlutterCommand {
} }
} }
final String version = argResults.rest[0].replaceFirst('v', ''); final String version = argResults.rest[0].replaceFirst(RegExp('^v'), '');
final List<String> matchingTags = tags.where((String tag) => tag.contains(version)).toList(); final List<String> matchingTags = tags.where((String tag) => tag.contains(version)).toList();
String matchingTag; String matchingTag;
// TODO(fujino): make this a tool exit and fix tests // TODO(fujino): make this a tool exit and fix tests
...@@ -127,15 +126,12 @@ class VersionCommand extends FlutterCommand { ...@@ -127,15 +126,12 @@ class VersionCommand extends FlutterCommand {
throwToolExit('Unable to checkout version branch for version $version: $e'); throwToolExit('Unable to checkout version branch for version $version: $e');
} }
final FlutterVersion flutterVersion = FlutterVersion(); globals.printStatus('Switching Flutter to version $matchingTag${withForce ? ' with force' : ''}');
globals.printStatus('Switching Flutter to version ${flutterVersion.frameworkVersion}${withForce ? ' with force' : ''}');
// Check for and download any engine and pkg/ updates. // Check for and download any engine and pkg/ updates.
// We run the 'flutter' shell script re-entrantly here // We run the 'flutter' shell script re-entrantly here
// so that it will download the updated Dart and so forth // so that it will download the updated Dart and so forth
// if necessary. // if necessary.
globals.printStatus('');
globals.printStatus('Downloading engine...'); globals.printStatus('Downloading engine...');
int code = await processUtils.stream(<String>[ int code = await processUtils.stream(<String>[
globals.fs.path.join('bin', 'flutter'), globals.fs.path.join('bin', 'flutter'),
...@@ -147,9 +143,6 @@ class VersionCommand extends FlutterCommand { ...@@ -147,9 +143,6 @@ class VersionCommand extends FlutterCommand {
throwToolExit(null, exitCode: code); throwToolExit(null, exitCode: code);
} }
globals.printStatus('');
globals.printStatus(flutterVersion.toString());
final String projectRoot = findProjectRoot(); final String projectRoot = findProjectRoot();
if (projectRoot != null && boolArg('pub')) { if (projectRoot != null && boolArg('pub')) {
globals.printStatus(''); globals.printStatus('');
......
...@@ -42,7 +42,7 @@ void main() { ...@@ -42,7 +42,7 @@ void main() {
'version', 'version',
'--no-pub', '--no-pub',
]); ]);
expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0\n')); expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0\r\n31.0.0-0.0.pre\n'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Stdio: () => mockStdio, Stdio: () => mockStdio,
...@@ -51,7 +51,7 @@ void main() { ...@@ -51,7 +51,7 @@ void main() {
testUsingContext('version switch prompt is accepted', () async { testUsingContext('version switch prompt is accepted', () async {
when(mockStdio.stdinHasTerminal).thenReturn(true); when(mockStdio.stdinHasTerminal).thenReturn(true);
const String version = '10.0.0'; const String version = 'v10.0.0';
final VersionCommand command = VersionCommand(); final VersionCommand command = VersionCommand();
when(globals.terminal.promptForCharInput(<String>['y', 'n'], when(globals.terminal.promptForCharInput(<String>['y', 'n'],
logger: anyNamed('logger'), logger: anyNamed('logger'),
...@@ -71,21 +71,21 @@ void main() { ...@@ -71,21 +71,21 @@ void main() {
FlutterVersion: () => mockVersion, FlutterVersion: () => mockVersion,
}); });
testUsingContext('version switch prompt is declined', () async { testUsingContext('old dev version switch prompt is accepted', () async {
when(mockStdio.stdinHasTerminal).thenReturn(true); when(mockStdio.stdinHasTerminal).thenReturn(true);
const String version = '10.0.0'; const String version = '30.0.0-dev.0.0';
final VersionCommand command = VersionCommand(); final VersionCommand command = VersionCommand();
when(globals.terminal.promptForCharInput(<String>['y', 'n'], when(globals.terminal.promptForCharInput(<String>['y', 'n'],
logger: anyNamed('logger'), logger: anyNamed('logger'),
prompt: 'Are you sure you want to proceed?') prompt: 'Are you sure you want to proceed?')
).thenAnswer((Invocation invocation) async => 'n'); ).thenAnswer((Invocation invocation) async => 'y');
await createTestCommandRunner(command).run(<String>[ await createTestCommandRunner(command).run(<String>[
'version', 'version',
'--no-pub', '--no-pub',
version, version,
]); ]);
expect(testLogger.statusText, isNot(contains('Switching Flutter to version $version'))); expect(testLogger.statusText, contains('Switching Flutter to version $version'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Stdio: () => mockStdio, Stdio: () => mockStdio,
...@@ -93,30 +93,47 @@ void main() { ...@@ -93,30 +93,47 @@ void main() {
FlutterVersion: () => mockVersion, FlutterVersion: () => mockVersion,
}); });
testUsingContext('version switch, latest commit query fails', () async { testUsingContext('dev version switch prompt is accepted', () async {
const String version = '10.0.0'; when(mockStdio.stdinHasTerminal).thenReturn(true);
const String version = '31.0.0-0.0.pre';
final VersionCommand command = VersionCommand(); final VersionCommand command = VersionCommand();
when(globals.terminal.promptForCharInput(<String>['y', 'n'],
logger: anyNamed('logger'),
prompt: 'Are you sure you want to proceed?')
).thenAnswer((Invocation invocation) async => 'y');
await createTestCommandRunner(command).run(<String>[ await createTestCommandRunner(command).run(<String>[
'version', 'version',
'--no-pub', '--no-pub',
version, version,
]); ]);
expect(testLogger.errorText, contains('git failed')); expect(testLogger.statusText, contains('Switching Flutter to version $version'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(latestCommitFails: true), ProcessManager: () => MockProcessManager(),
Stdio: () => mockStdio, Stdio: () => mockStdio,
AnsiTerminal: () => MockTerminal(),
FlutterVersion: () => mockVersion, FlutterVersion: () => mockVersion,
}); });
testUsingContext('latest commit is parsable when query fails', () { testUsingContext('version switch prompt is declined', () async {
final FlutterVersion flutterVersion = FlutterVersion(); when(mockStdio.stdinHasTerminal).thenReturn(true);
expect( const String version = '10.0.0';
() => DateTime.parse(flutterVersion.frameworkCommitDate), final VersionCommand command = VersionCommand();
returnsNormally, when(globals.terminal.promptForCharInput(<String>['y', 'n'],
); logger: anyNamed('logger'),
prompt: 'Are you sure you want to proceed?')
).thenAnswer((Invocation invocation) async => 'n');
await createTestCommandRunner(command).run(<String>[
'version',
'--no-pub',
version,
]);
expect(testLogger.statusText, isNot(contains('Switching Flutter to version $version')));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(latestCommitFails: true), ProcessManager: () => MockProcessManager(),
Stdio: () => mockStdio, Stdio: () => mockStdio,
AnsiTerminal: () => MockTerminal(),
FlutterVersion: () => mockVersion, FlutterVersion: () => mockVersion,
}); });
...@@ -187,7 +204,7 @@ void main() { ...@@ -187,7 +204,7 @@ void main() {
await createTestCommandRunner(command).run(<String>[ await createTestCommandRunner(command).run(<String>[
'version', 'version',
]); ]);
expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0\n')); expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0\r\n31.0.0-0.0.pre\n'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Stdio: () => mockStdio, Stdio: () => mockStdio,
...@@ -236,11 +253,12 @@ class MockProcessManager extends Mock implements ProcessManager { ...@@ -236,11 +253,12 @@ class MockProcessManager extends Mock implements ProcessManager {
if (failGitTag) { if (failGitTag) {
return ProcessResult(0, 1, '', ''); return ProcessResult(0, 1, '', '');
} }
return ProcessResult(0, 0, 'v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0', ''); return ProcessResult(0, 0, 'v10.0.0\r\nv20.0.0\r\n30.0.0-dev.0.0\r\n31.0.0-0.0.pre', '');
} }
if (command[0] == 'git' && command[1] == 'checkout') { if (command[0] == 'git' && command[1] == 'checkout') {
version = (command[2] as String).replaceFirst('v', ''); version = (command[2] as String).replaceFirst(RegExp('^v'), '');
} }
return ProcessResult(0, 0, '', ''); return ProcessResult(0, 0, '', '');
} }
...@@ -264,14 +282,6 @@ class MockProcessManager extends Mock implements ProcessManager { ...@@ -264,14 +282,6 @@ class MockProcessManager extends Mock implements ProcessManager {
return ProcessResult(0, 0, '$version-0-g00000000', ''); 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, '', ''); return ProcessResult(0, 0, '', '');
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment