| // Copyright 2023 The Flutter Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. | |
| import 'dart:io'; | |
| import 'package:args/command_runner.dart'; | |
| import 'package:cli_util/cli_logging.dart'; | |
| import 'package:devtools_tool/model.dart'; | |
| import 'package:io/io.dart'; | |
| import '../utils.dart'; | |
| import 'shared.dart'; | |
| final _flutterPreReleaseTagRegExp = RegExp(r'[0-9]+.[0-9]+.0-[0-9]+.0.pre'); | |
| /// This command updates the the Flutter SDK contained in the 'tool/' directory | |
| /// to the latest Flutter candidate branch, as specified by the commit hash in | |
| /// the flutter-candidate.txt file in the repository root. | |
| /// | |
| /// When the '--update-on-path' flag is passed, the Flutter SDK that is on PATH | |
| /// (your local flutter/flutter git checkout) will be updated as well. | |
| /// | |
| /// To run this script: | |
| /// `dt update-flutter-sdk [--update-on-path]` | |
| class UpdateFlutterSdkCommand extends Command { | |
| UpdateFlutterSdkCommand() { | |
| argParser.addUpdateOnPathFlag(); | |
| } | |
| @override | |
| String get name => 'update-flutter-sdk'; | |
| @override | |
| String get description => | |
| 'Updates the the Flutter SDK contained in the \'tool/\' directory to the ' | |
| 'latest Flutter candidate branch. Optionally, can also update the Flutter' | |
| 'SDK that is on PATH (your local flutter/flutter git checkout).'; | |
| @override | |
| Future run() async { | |
| final updateOnPath = | |
| argResults![SharedCommandArgs.updateOnPath.flagName] as bool; | |
| final log = Logger.standard(); | |
| final repo = DevToolsRepo.getInstance(); | |
| final processManager = ProcessManager(); | |
| final String? flutterVersion; | |
| final versionStr = repo.readFile(Uri.parse('flutter-candidate.txt')).trim(); | |
| // If the version string doesn't match the expected pattern for a | |
| // pre-release tag, then assume it's a commit hash: | |
| flutterVersion = _flutterPreReleaseTagRegExp.hasMatch(versionStr) | |
| ? 'tags/$versionStr' | |
| : versionStr; | |
| log.stdout('Updating to Flutter version from cache: $flutterVersion'); | |
| final flutterSdkDirName = repo.sdkDirectoryName; | |
| final toolSdkPath = repo.toolFlutterSdkPath; | |
| // If the flag was set, update the SDK on PATH in addition to the | |
| // tool/flutter-sdk copy. | |
| if (updateOnPath) { | |
| final pathSdk = FlutterSdk.findFromPathEnvironmentVariable(); | |
| log.stdout('Updating Flutter from PATH at ${pathSdk.sdkPath}'); | |
| // Verify we have an upstream remote to pull from. | |
| await findRemote( | |
| processManager, | |
| remoteId: 'flutter/flutter.git', | |
| workingDirectory: pathSdk.sdkPath, | |
| ); | |
| await processManager.runAll( | |
| commands: [ | |
| CliCommand.git(['stash']), | |
| CliCommand.git(['fetch', 'upstream']), | |
| CliCommand.git(['checkout', 'upstream/master']), | |
| CliCommand.git(['reset', '--hard', 'upstream/master']), | |
| CliCommand.git(['checkout', flutterVersion, '-f']), | |
| CliCommand.flutter(['--version']), | |
| ], | |
| workingDirectory: pathSdk.sdkPath, | |
| ); | |
| log.stdout('Finished updating Flutter from PATH at ${pathSdk.sdkPath}'); | |
| } | |
| // Next, update (or clone) the tool/flutter-sdk copy. | |
| // On Windows LCUI trybots, some of the flutter repo paths cause | |
| // "Filename too long" errors. Filenames such as: | |
| // engine/src/flutter/testing/ios_scenario_app/ios/Scenarios/ | |
| // ScenariosUITests/ | |
| // golden_platform_view_clippath_with_transform_multiple_clips_impeller_iPhone SE (3rd generation)_26.2_simulator.png'. | |
| final gitLongFilesCommand = CliCommand.git([ | |
| 'config', | |
| 'core.longpaths', | |
| 'true', | |
| ]); | |
| if (Directory(toolSdkPath).existsSync()) { | |
| log.stdout('Updating Flutter at $toolSdkPath'); | |
| await processManager.runAll( | |
| commands: [ | |
| gitLongFilesCommand, | |
| CliCommand.git(['fetch']), | |
| CliCommand.git(['checkout', flutterVersion, '-f']), | |
| CliCommand.flutter(['--version']), | |
| ], | |
| workingDirectory: toolSdkPath, | |
| ); | |
| } else { | |
| log.stdout('Cloning Flutter into $toolSdkPath'); | |
| await processManager.runProcess( | |
| CliCommand.git([ | |
| 'clone', | |
| '--no-checkout', | |
| 'https://github.com/flutter/flutter', | |
| flutterSdkDirName, | |
| ]), | |
| workingDirectory: repo.toolDirectoryPath, | |
| ); | |
| await processManager.runAll( | |
| commands: [ | |
| gitLongFilesCommand, | |
| CliCommand.git(['checkout', flutterVersion, '-f']), | |
| CliCommand.flutter(['--version']), | |
| ], | |
| workingDirectory: toolSdkPath, | |
| ); | |
| } | |
| log.stdout('Finished updating Flutter at $toolSdkPath.'); | |
| } | |
| } |