| // Copyright 2013 The Flutter Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| import 'dart:io' as io; | |
| import 'package:args/command_runner.dart'; | |
| import 'package:file/file.dart'; | |
| import 'package:file/local.dart'; | |
| import 'analyze_command.dart'; | |
| import 'branches_for_batch_release_command.dart'; | |
| import 'build_examples_command.dart'; | |
| import 'common/core.dart'; | |
| import 'coverage_check_command.dart'; | |
| import 'create_all_packages_app_command.dart'; | |
| import 'custom_test_command.dart'; | |
| import 'dart_test_command.dart'; | |
| import 'drive_examples_command.dart'; | |
| import 'federation_safety_check_command.dart'; | |
| import 'fetch_deps_command.dart'; | |
| import 'firebase_test_lab_command.dart'; | |
| import 'fix_command.dart'; | |
| import 'format_command.dart'; | |
| import 'in_flight_release_check_command.dart'; | |
| import 'license_check_command.dart'; | |
| import 'list_command.dart'; | |
| import 'make_deps_path_based_command.dart'; | |
| import 'native_test_command.dart'; | |
| import 'podspec_check_command.dart'; | |
| import 'publish_check_command.dart'; | |
| import 'publish_command.dart'; | |
| import 'remove_dev_dependencies_command.dart'; | |
| import 'test_dart_fixes_command.dart'; | |
| import 'update_dependency_command.dart'; | |
| import 'update_excerpts_command.dart'; | |
| import 'update_min_sdk_command.dart'; | |
| import 'update_release_info_command.dart'; | |
| import 'validate_command.dart'; | |
| void main(List<String> args) { | |
| final Directory? root = _findRepositoryRoot(); | |
| if (root == null) { | |
| print('Error: Cannot find repository root'); | |
| io.exit(1); | |
| } | |
| final Directory packagesDir = root.childDirectory('packages'); | |
| if (!packagesDir.existsSync()) { | |
| print('Error: Cannot find a "packages" sub-directory'); | |
| io.exit(1); | |
| } | |
| final commandRunner = | |
| CommandRunner<void>( | |
| 'dart pub global run flutter_plugin_tools', | |
| 'Productivity utils for hosting multiple plugins within one repository.', | |
| ) | |
| ..addCommand(AnalyzeCommand(packagesDir)) | |
| ..addCommand(BranchesForBatchReleaseCommand(packagesDir)) | |
| ..addCommand(BuildExamplesCommand(packagesDir)) | |
| ..addCommand(CreateAllPackagesAppCommand(packagesDir)) | |
| ..addCommand(CoverageCheckCommand(packagesDir)) | |
| ..addCommand(CustomTestCommand(packagesDir)) | |
| ..addCommand(DartTestCommand(packagesDir)) | |
| ..addCommand(DriveExamplesCommand(packagesDir)) | |
| ..addCommand(FederationSafetyCheckCommand(packagesDir)) | |
| ..addCommand(FetchDepsCommand(packagesDir)) | |
| ..addCommand(FirebaseTestLabCommand(packagesDir)) | |
| ..addCommand(FixCommand(packagesDir)) | |
| ..addCommand(FormatCommand(packagesDir)) | |
| ..addCommand(InFlightReleaseCheckCommand(packagesDir)) | |
| ..addCommand(LicenseCheckCommand(packagesDir)) | |
| ..addCommand(ListCommand(packagesDir)) | |
| ..addCommand(MakeDepsPathBasedCommand(packagesDir)) | |
| ..addCommand(NativeTestCommand(packagesDir)) | |
| ..addCommand(PodspecCheckCommand(packagesDir)) | |
| ..addCommand(PublishCheckCommand(packagesDir)) | |
| ..addCommand(PublishCommand(packagesDir)) | |
| ..addCommand(RemoveDevDependenciesCommand(packagesDir)) | |
| ..addCommand(TestDartFixesCommand(packagesDir)) | |
| ..addCommand(UpdateDependencyCommand(packagesDir)) | |
| ..addCommand(UpdateExcerptsCommand(packagesDir)) | |
| ..addCommand(UpdateMinSdkCommand(packagesDir)) | |
| ..addCommand(UpdateReleaseInfoCommand(packagesDir)) | |
| ..addCommand(ValidateCommand(packagesDir)); | |
| commandRunner.run(args).catchError((Object e) { | |
| final toolExit = e as ToolExit; | |
| int exitCode = toolExit.exitCode; | |
| // This should never happen; this check is here to guarantee that a ToolExit | |
| // never accidentally has code 0 thus causing CI to pass. | |
| if (exitCode == 0) { | |
| assert(false); | |
| exitCode = 255; | |
| } | |
| io.exit(exitCode); | |
| }, test: (Object e) => e is ToolExit); | |
| } | |
| /// Locates the root directory of the repository, assuming that the script is | |
| /// being run from within the repository. | |
| Directory? _findRepositoryRoot() { | |
| Directory current = const LocalFileSystem().currentDirectory; | |
| while (current != current.parent) { | |
| // The repository should contain both a .git directory and a packages/ | |
| // directory, so use that as the heuristic. If this heuristic proves | |
| // insufficient, we could instead require the tool config to be present | |
| // to even try to run, and look for that. | |
| if ((current.childDirectory('.git').existsSync() || current.childFile('.git').existsSync()) && | |
| current.childDirectory('packages').existsSync()) { | |
| return current; | |
| } | |
| current = current.parent; | |
| } | |
| return null; | |
| } |