// Copyright (c) 2020, 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' show Directory, File, FileSystemEntity, Process, ProcessResult; import 'package:testing/testing.dart' show Chain, TestDescription; Future> filterList( Chain suite, bool onlyInGit, List base) async { Set gitFiles = {}; if (onlyInGit) { for (Uri subRoot in suite.subRoots) { gitFiles.addAll(await getGitFiles(subRoot)); } } List result = []; for (TestDescription description in base) { if (onlyInGit && !gitFiles.contains(description.uri)) { continue; } result.add(description); } return result; } Future> getGitFiles(Uri uri) async { ProcessResult result = await Process.run("git", ["ls-files", "."], workingDirectory: new Directory.fromUri(uri).absolute.path, runInShell: true); if (result.exitCode != 0) { throw "Git returned non-zero error code (${result.exitCode}):\n\n" "stdout: ${result.stdout}\n\n" "stderr: ${result.stderr}"; } String stdout = result.stdout; return stdout .split(new RegExp('^', multiLine: true)) .map((line) => uri.resolve(line.trimRight())) .toSet(); } void checkEnvironment( Map environment, Set knownEnvironmentKeys) { Set environmentKeys = environment.keys.toSet(); environmentKeys.removeAll(knownEnvironmentKeys); if (environmentKeys.isNotEmpty) { throw "Unknown environment(s) given:" "\n - ${environmentKeys.join("\n- ")}\n" "Knows about these environment(s):" "\n - ${knownEnvironmentKeys.join("\n - ")}"; } } Future> computeSourceFiles(Uri repoDir) async { Set libUris = {}; libUris.add(repoDir.resolve("pkg/front_end/lib/")); libUris.add(repoDir.resolve("pkg/front_end/test/")); libUris.add(repoDir.resolve("pkg/front_end/tool/")); List dataDirectories = [ 'pkg/front_end/test/class_hierarchy/data/', 'pkg/front_end/test/extensions/data/', 'pkg/front_end/test/id_testing/data/', 'pkg/front_end/test/language_versioning/data/', 'pkg/front_end/test/macros/application/data/', 'pkg/front_end/test/macros/declaration/data/', 'pkg/front_end/test/macros/incremental/data/', 'pkg/front_end/test/patching/data/', 'pkg/front_end/test/scopes/data/', 'pkg/front_end/test/static_types/data/', ]; List inputs = []; for (Uri uri in libUris) { Set gitFiles = await getGitFiles(uri); List entities = new Directory.fromUri(uri).listSync(recursive: true); for (FileSystemEntity entity in entities) { if (entity is File && entity.path.endsWith(".dart") && gitFiles.contains(entity.uri)) { if (dataDirectories .any((exclude) => entity.uri.path.contains(exclude))) { continue; } inputs.add(entity.uri); } } } return inputs; }