| // 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 'package:file/file.dart'; | |
| import 'package:meta/meta.dart'; | |
| import 'package:yaml/yaml.dart'; | |
| import 'core.dart'; | |
| import 'output_utils.dart'; | |
| /// The name of the tool configuration file, at the root of the repository. | |
| const String configFilename = '.repo_tool_config.yaml'; | |
| YamlMap? _toolConfig; | |
| /// Clears the cached tool configuration. | |
| /// | |
| /// Visible for testing only. | |
| @visibleForTesting | |
| void clearToolConfigCache() { | |
| _toolConfig = null; | |
| } | |
| YamlMap _getToolConfig(Directory repoRoot) { | |
| if (_toolConfig == null) { | |
| final File configFile = repoRoot.childFile(configFilename); | |
| if (!configFile.existsSync()) { | |
| printError('Configuration file $configFilename not found at repository root.'); | |
| throw ToolExit(exitInvalidArguments); | |
| } | |
| final Object yaml = loadYamlNode(configFile.readAsStringSync()); | |
| if (yaml is! YamlMap) { | |
| printError('Configuration file $configFilename is must be a map.'); | |
| throw ToolExit(exitInvalidArguments); | |
| } | |
| _toolConfig = yaml; | |
| } | |
| return _toolConfig!; | |
| } | |
| /// Returns the name of the repository. | |
| String getRepositoryName(Directory repoRoot) { | |
| final name = _getToolConfig(repoRoot)['repo_name'] as String?; | |
| if (name == null) { | |
| printError('repo_name is missing in $configFilename'); | |
| throw ToolExit(exitInvalidArguments); | |
| } | |
| return name; | |
| } | |
| /// Returns the minimum Flutter version allowed. | |
| String? getMinFlutterVersion(Directory repoRoot) { | |
| final Object? yaml = _getToolConfig(repoRoot)['min_flutter']; | |
| if (yaml == null) { | |
| return null; | |
| } | |
| if (yaml is! String) { | |
| printError('min_flutter must be a full version string (e.g., "3.44.0").'); | |
| throw ToolExit(exitInvalidArguments); | |
| } | |
| return yaml; | |
| } | |
| /// Returns the minimum Dart version allowed. | |
| String? getMinDartVersion(Directory repoRoot) { | |
| final Object? yaml = _getToolConfig(repoRoot)['min_dart']; | |
| if (yaml == null) { | |
| return null; | |
| } | |
| if (yaml is! String) { | |
| printError('min_dart must be a full version string (e.g., "3.10.0").'); | |
| throw ToolExit(exitInvalidArguments); | |
| } | |
| return yaml; | |
| } | |
| /// Returns the allowed dependencies, grouped by 'pinned' and 'unpinned'. | |
| ({List<String> pinned, List<String> unpinned}) getAllowedDependencies(Directory repoRoot) { | |
| final allowedDeps = _getToolConfig(repoRoot)['allowed_dependencies'] as YamlMap?; | |
| if (allowedDeps == null) { | |
| return (pinned: <String>[], unpinned: <String>[]); | |
| } | |
| final List<String> pinned = | |
| (allowedDeps['pinned'] as YamlList?)?.map((e) => e as String).toList() ?? <String>[]; | |
| final List<String> unpinned = | |
| (allowedDeps['unpinned'] as YamlList?)?.map((e) => e as String).toList() ?? <String>[]; | |
| return (pinned: pinned, unpinned: unpinned); | |
| } | |
| /// Returns a map from package names to non-standard issue labels used for those | |
| /// packages. Packages that use the default label `p: <package_name>` are not | |
| /// included in the returned map. | |
| Map<String, String> getNonStandardPackageLabels(Directory repoRoot) { | |
| final customLabels = _getToolConfig(repoRoot)['package_labels'] as YamlMap?; | |
| if (customLabels == null) { | |
| return <String, String>{}; | |
| } | |
| return customLabels.map((key, value) => MapEntry(key as String, value as String)); | |
| } |