Skip to content

Commit a23326a

Browse files
[tool] Add config options needed by core-packages (#11784)
Adds some optional behaviors needed to use the tool in flutter/core-packages: - Allow setting a min Dart version rather than a min Flutter version at the repo level - Don't require .ci.yaml to be present when batch config isn't used (since that repo currently doesn't use LUCI)
1 parent db270b4 commit a23326a

9 files changed

Lines changed: 225 additions & 47 deletions

script/tool/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.14.1
2+
3+
* Adds `min_dart` as an alternative to `min_flutter` in tool configuration.
4+
* Makes .ci.yaml optional if batched release is not used.
5+
16
## 0.14.0
27

38
* Re-launches the published version of the tool for use in

script/tool/lib/src/common/tool_config.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ String? getMinFlutterVersion(Directory repoRoot) {
6363
return yaml;
6464
}
6565

66+
/// Returns the minimum Dart version allowed.
67+
String? getMinDartVersion(Directory repoRoot) {
68+
final Object? yaml = _getToolConfig(repoRoot)['min_dart'];
69+
if (yaml == null) {
70+
return null;
71+
}
72+
if (yaml is! String) {
73+
printError('min_dart must be a full version string (e.g., "3.10.0").');
74+
throw ToolExit(exitInvalidArguments);
75+
}
76+
return yaml;
77+
}
78+
6679
/// Returns the allowed dependencies, grouped by 'pinned' and 'unpinned'.
6780
({List<String> pinned, List<String> unpinned}) getAllowedDependencies(
6881
Directory repoRoot,

script/tool/lib/src/validate_command.dart

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:file/file.dart';
66
import 'package:meta/meta.dart';
77
import 'package:path/path.dart' as p;
8+
import 'package:pub_semver/pub_semver.dart';
89

910
import 'common/core.dart';
1011
import 'common/git_version_finder.dart';
@@ -19,6 +20,9 @@ import 'validators/readme_validator.dart';
1920
import 'validators/repo_info_validator.dart';
2021
import 'validators/version_and_changelog_validator.dart';
2122

23+
const int _missingMinSdkVersionExitCode = 3;
24+
const int _unknownVersionMappingExitCode = 4;
25+
2226
/// The set of possible validators.
2327
///
2428
/// Exposed for testing so that unit tests can target a single validator's
@@ -113,7 +117,10 @@ class ValidateCommand extends PackageLoopingCommand {
113117
);
114118

115119
/// The minimum version of Flutter that is allowed for any package.
116-
late final String _minMinFlutterVersion;
120+
Version? _minMinFlutterVersion;
121+
122+
/// The minimum version of Dart that is allowed for any package.
123+
Version? _minMinDartVersion;
117124

118125
@override
119126
final String name = 'validate';
@@ -149,7 +156,20 @@ class ValidateCommand extends PackageLoopingCommand {
149156
}
150157
if (_shouldRun(Validator.pubspec)) {
151158
await _loadAllowedDependencies();
152-
_minMinFlutterVersion = _loadMinMinFlutterVersion();
159+
final (flutter: Version? minFlutter, dart: Version? minDart) =
160+
_loadMinMinSdkVersions();
161+
_minMinFlutterVersion = minFlutter;
162+
_minMinDartVersion =
163+
minDart ??
164+
(minFlutter == null ? null : getDartSdkForFlutterSdk(minFlutter));
165+
if (_minMinDartVersion == null) {
166+
printError(
167+
'Dart SDK version for Flutter SDK version $_minMinFlutterVersion is unknown. '
168+
'Please update the map for getDartSdkForFlutterSdk with the '
169+
'corresponding Dart version.',
170+
);
171+
throw ToolExit(_unknownVersionMappingExitCode);
172+
}
153173
}
154174
if (_shouldRun(Validator.dependabot)) {
155175
_dependabotCoverage = DependabotValidator.loadConfig(repoRoot: _repoRoot);
@@ -220,6 +240,7 @@ class ValidateCommand extends PackageLoopingCommand {
220240
allowedPackages: _allowedPackages,
221241
repoRoot: rootDir,
222242
minMinFlutterVersion: _minMinFlutterVersion,
243+
minMinDartVersion: _minMinDartVersion,
223244
);
224245
return validator.validatePubspec(package);
225246
}
@@ -323,13 +344,20 @@ class ValidateCommand extends PackageLoopingCommand {
323344
_allowedPackages.pinned.addAll(allowedDeps.pinned);
324345
}
325346

326-
String _loadMinMinFlutterVersion() {
327-
final String? minVersion = getMinFlutterVersion(_repoRoot);
328-
if (minVersion == null) {
329-
printError('min_flutter is missing in $configFilename');
330-
return '';
347+
({Version? flutter, Version? dart}) _loadMinMinSdkVersions() {
348+
final String? minFlutter = getMinFlutterVersion(_repoRoot);
349+
final String? minDart = getMinDartVersion(_repoRoot);
350+
if (minFlutter == null && minDart == null) {
351+
printError(
352+
'Either min_flutter or min_dart must be provided '
353+
'in the repo tool configuration.',
354+
);
355+
throw ToolExit(_missingMinSdkVersionExitCode);
331356
}
332-
return minVersion.trim();
357+
return (
358+
flutter: minFlutter == null ? null : Version.parse(minFlutter),
359+
dart: minDart == null ? null : Version.parse(minDart),
360+
);
333361
}
334362

335363
Pubspec? _tryParsePubspec(String pubspecContents) {

script/tool/lib/src/validators/pubspec_validator.dart

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,23 @@ class PubspecValidator {
6565
required AllowPackageLists allowedPackages,
6666
required void Function(String) warningLogger,
6767
required Directory repoRoot,
68-
required String minMinFlutterVersion,
68+
Version? minMinFlutterVersion,
69+
Version? minMinDartVersion,
6970
}) : _path = path,
7071
_indentation = indentation,
7172
_allowedPackages = allowedPackages,
7273
_logWarning = warningLogger,
7374
_repoRoot = repoRoot,
74-
_minMinFlutterVersion = minMinFlutterVersion;
75+
_minMinFlutterVersion = minMinFlutterVersion,
76+
_minMinDartVersion = minMinDartVersion;
7577

7678
final path.Context _path;
7779
final String _indentation;
7880
final AllowPackageLists _allowedPackages;
7981
final void Function(String) _logWarning;
8082
final Directory _repoRoot;
81-
final String _minMinFlutterVersion;
83+
final Version? _minMinFlutterVersion;
84+
final Version? _minMinDartVersion;
8285

8386
/// Validates that the pubspec of a package follows repository conventions,
8487
/// returning a list of errors.
@@ -115,9 +118,6 @@ class PubspecValidator {
115118
final String? minVersionError = _checkForMinimumVersionError(
116119
pubspec,
117120
package,
118-
minMinFlutterVersion: _minMinFlutterVersion.isEmpty
119-
? null
120-
: Version.parse(_minMinFlutterVersion),
121121
);
122122
if (minVersionError != null) {
123123
printError('$_indentation$minVersionError');
@@ -423,24 +423,8 @@ class PubspecValidator {
423423
/// Returns an error string if validation fails.
424424
String? _checkForMinimumVersionError(
425425
Pubspec pubspec,
426-
RepositoryPackage package, {
427-
Version? minMinFlutterVersion,
428-
}) {
429-
String unknownDartVersionError(Version flutterVersion) {
430-
return 'Dart SDK version for Flutter SDK version '
431-
'$flutterVersion is unknown. '
432-
'Please update the map for getDartSdkForFlutterSdk with the '
433-
'corresponding Dart version.';
434-
}
435-
436-
Version? minMinDartVersion;
437-
if (minMinFlutterVersion != null) {
438-
minMinDartVersion = getDartSdkForFlutterSdk(minMinFlutterVersion);
439-
if (minMinDartVersion == null) {
440-
return unknownDartVersionError(minMinFlutterVersion);
441-
}
442-
}
443-
426+
RepositoryPackage package,
427+
) {
444428
final Version? dartConstraintMin = _minimumForConstraint(
445429
pubspec.environment['sdk'],
446430
);
@@ -449,19 +433,19 @@ class PubspecValidator {
449433
);
450434

451435
// Validate the Flutter constraint, if any.
452-
if (flutterConstraintMin != null && minMinFlutterVersion != null) {
453-
if (flutterConstraintMin < minMinFlutterVersion) {
436+
if (flutterConstraintMin != null && _minMinFlutterVersion != null) {
437+
if (flutterConstraintMin < _minMinFlutterVersion) {
454438
return 'Minimum allowed Flutter version $flutterConstraintMin is less '
455-
'than $minMinFlutterVersion';
439+
'than $_minMinFlutterVersion';
456440
}
457441
}
458442

459443
// Validate the Dart constraint, if any.
460444
if (dartConstraintMin != null) {
461445
// Ensure that it satisfies the minimum.
462-
if (minMinDartVersion != null) {
463-
if (dartConstraintMin < minMinDartVersion) {
464-
return 'Minimum allowed Dart version $dartConstraintMin is less than $minMinDartVersion';
446+
if (_minMinDartVersion != null) {
447+
if (dartConstraintMin < _minMinDartVersion) {
448+
return 'Minimum allowed Dart version $dartConstraintMin is less than $_minMinDartVersion';
465449
}
466450
}
467451

@@ -471,7 +455,10 @@ class PubspecValidator {
471455
flutterConstraintMin,
472456
);
473457
if (dartVersionForFlutterMinimum == null) {
474-
return unknownDartVersionError(flutterConstraintMin);
458+
return 'Dart SDK version for Flutter SDK version '
459+
'$flutterConstraintMin is unknown. '
460+
'Please update the map for getDartSdkForFlutterSdk with the '
461+
'corresponding Dart version.';
475462
}
476463
if (dartVersionForFlutterMinimum != dartConstraintMin) {
477464
return 'The minimum Dart version is $dartConstraintMin, but the '

script/tool/lib/src/validators/repo_info_validator.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,17 @@ class RepoInfoValidator {
428428
}) {
429429
final errors = <String>[];
430430
final File ciYamlFile = repoRoot.childFile('.ci.yaml');
431+
if (!ciYamlFile.existsSync()) {
432+
if (isBatchRelease) {
433+
printError(
434+
'${_indentation}Batched release is currently only supported for '
435+
'repos using .ci.yaml',
436+
);
437+
errors.add('Missing .ci.yaml');
438+
}
439+
return errors;
440+
}
441+
431442
final String content = ciYamlFile.readAsStringSync();
432443
final yaml = loadYaml(content) as YamlMap;
433444

script/tool/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: flutter_plugin_tools
22
description: Productivity and CI utils for Flutter team package repositories.
33
repository: https://github.com/flutter/packages/tree/main/script/tool
4-
version: 0.14.0
4+
version: 0.14.1
55

66
dependencies:
77
args: ^2.1.0

script/tool/test/util.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ void setToolConfig(
598598
Directory repoRoot, {
599599
String repoName = 'flutter/packages',
600600
String? minFlutterVersion,
601+
String? minDartVersion,
601602
List<String>? pinnedDependencies,
602603
List<String>? unpinnedDependencies,
603604
Map<String, String>? packageLabels,
@@ -606,6 +607,9 @@ void setToolConfig(
606607
if (minFlutterVersion != null) {
607608
editor.update(['min_flutter'], minFlutterVersion);
608609
}
610+
if (minDartVersion != null) {
611+
editor.update(['min_dart'], minDartVersion);
612+
}
609613
if (pinnedDependencies != null || unpinnedDependencies != null) {
610614
const allowedDependenciesKey = 'allowed_dependencies';
611615
const pinnedKey = 'pinned';

0 commit comments

Comments
 (0)