// 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 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, ); }