| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:io'; | |
| import 'package:path/path.dart' as path; | |
| import 'package:pub_semver/pub_semver.dart'; | |
| import 'package:yaml/yaml.dart' as yaml; | |
| /// Synchronously searches starting from the current working directory | |
| /// for experimental_features.yaml, then caches it in this variable. | |
| final experimentalFeaturesYaml = () { | |
| var features = path.join('tools', 'experimental_features.yaml'); | |
| var searchDir = '.'; | |
| var root = path.canonicalize(path.separator); | |
| do { | |
| var tryPath = path.join(searchDir, features); | |
| if (File(path.join(searchDir, features)).existsSync()) { | |
| return tryPath; | |
| } | |
| searchDir = path.join(searchDir, '..'); | |
| } while (path.canonicalize(searchDir) != root); | |
| throw 'experimental_features.yaml not found'; | |
| }(); | |
| /// The unexpired experiments from `experimental_features.yaml` that have an | |
| /// associated `validation` program. Can not use async here as that will | |
| /// break test_all.dart. | |
| List<Experiment> experimentsWithValidation() { | |
| final experiments = yaml.loadYaml( | |
| File(experimentalFeaturesYaml).readAsStringSync(), | |
| sourceUrl: path.toUri(experimentalFeaturesYaml), | |
| ); | |
| return [ | |
| for (final e in experiments['features'].entries) | |
| if (e.value['expired'] != true && e.value['validation'] != null) | |
| Experiment( | |
| e.key, | |
| e.value['validation'], | |
| tryParseVersion(e.value['enabledIn']), | |
| tryParseVersion(e.value['experimentalReleaseVersion']), | |
| ), | |
| ]; | |
| } | |
| Version? tryParseVersion(String? version) => | |
| version == null ? null : Version.parse(version); | |
| class Experiment { | |
| final String name; | |
| final String validation; | |
| final Version? enabledIn; | |
| final Version? experimentalReleaseVersion; | |
| Experiment( | |
| this.name, | |
| this.validation, | |
| this.enabledIn, | |
| this.experimentalReleaseVersion, | |
| ); | |
| } |